| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v6 01/11] libxl: Enhance libxl__sendmsg_fds to deal with EINTR and EWOULDBLOCK
 Anthony PERARD writes ("[PATCH v6 01/11] libxl: Enhance libxl__sendmsg_fds to 
deal with EINTR and EWOULDBLOCK"):
> This patch change the behavior of libxl__sendmsg_fds to retry sendmsg on
> EINTR error.
> 
> This patch also allow a caller of libxl__sendmsg_fds to deal with
> EWOULDBLOCK. It is best to only sent one byte when dealing with
> non-blocking fds so a EWOULDBLOCK error would mean that the fds haven't
> been sent yet.
This restriction is more than "it is best" - violating it can result
in an assertion failure.  I think it should be documented here:
> -/* on failure, logs */
> +/* returns ERROR_NOT_READY on EWOULDBLOCK
> + * or logs on failure. */
I looked at the actual code:
> -    r = sendmsg(carrier, &msg, 0);
> -    if (r < 0) {
> -        LOGE(ERROR, "failed to send fd-carrying message (%s)", what);
> -        return ERROR_FAIL;
> -    }
> +    while (1) {
> +        r = sendmsg(carrier, &msg, 0);
> +        if (r < 0) {
> +            if (errno == EINTR)
> +                continue;
> +            if (errno == EWOULDBLOCK) {
> +                assert(datalen == 1);
> +                return ERROR_NOT_READY;
> +            }
> +            LOGE(ERROR, "failed to send fd-carrying message (%s)", what);
> +            return ERROR_FAIL;
> +        }
> +        break;
> +    };
The previous code didn't check that the return value was as expected.
So the function could never be safely called with r!=1 since sendmsg
might report a short write, and libxl__sendmsg_fds wouldn't notice.
Now you have the opportunity to fix this...
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |