qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] Re: [V6 PATCH 4/9] virtio-9p: Add qemu side interfaces for


From: Stefan Hajnoczi
Subject: [Qemu-devel] Re: [V6 PATCH 4/9] virtio-9p: Add qemu side interfaces for chroot environment
Date: Thu, 3 Mar 2011 14:25:53 +0000

On Thu, Mar 3, 2011 at 2:01 PM, M. Mohan Kumar <address@hidden> wrote:
> On Thursday 03 March 2011 5:08:10 pm Stefan Hajnoczi wrote:
>> On Mon, Feb 28, 2011 at 11:22 AM, M. Mohan Kumar <address@hidden> wrote:
>> > +    retval = recvmsg(sockfd, &msg, 0);
>> > +    if (retval < 0) {
>> > +        *sock_error = 1;
>> > +        return -EIO;
>> > +    }
>>
>> Are we guaranteed this will be called with signals blocked?  Otherwise
>> we need to handle EINTR.
>
> Ok
>
>>
>> > +    if (fd_info.fi_flags & FI_FD_SOCKERR) {
>> > +        *sock_error = 1;
>> > +        return -EIO;
>> > +    }
>> > +    /* If fd is invalid, ancillary data is not present */
>> > +    if (fd_info.fi_fd < 0 || fd_info.fi_flags & FI_FD_INVALID) {
>> > +        return fd_info.fi_fd;
>> > +    }
>>
>> Testing fd_info.fi_flags & FI_FD_INVALID looks dangerous to me.  If
>> for some reason fi_fd >= 0 then we'd return success here.  fd_fd < 0
>> should be a sufficient check, perhaps you wanted an assert() instead?
>
> This check is required because,
>
> Creating special objects like directory, device nodes will not have a valid
> fd, usually fd will be 0 on success and -ve on error. During success cases, we
> can't do sendmsg for fd=0 value with SCM_RIGHTS, that would result in problem.
> In this case, we set fd_info.fi_flags to FI_FD_INVALID indicating fd is not a
> valid one, but its not an error case also.

+    /* If fd is invalid, ancillary data is not present */
+    if (fd_info.fi_fd < 0 || fd_info.fi_flags & FI_FD_INVALID) {

if (fd_info.fi_fd < 0) {

+        return fd_info.fi_fd;
+    }

We can get here now when no fd has been sent, but that's okay because...

+
+    for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+        if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)) ||
+                cmsg->cmsg_level != SOL_SOCKET ||
+                cmsg->cmsg_type != SCM_RIGHTS) {
+            continue;
+        }
+        fd = *((int *)CMSG_DATA(cmsg));
+        return fd;
+    }
+    *sock_error = 1;
+    return -EIO;

...no SCM_RIGHTS was sent (it was optional) so instead of considering
this case an error, we have reached a success case without an fd:

return 0;

Stefan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]