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

[Xen-changelog] [xen staging] xenforeignmemory: work around bug in older privcmd



commit b49ef5d39d930bda6a8da1afcee196420f1b7424
Author:     Paul Durrant <paul.durrant@xxxxxxxxxx>
AuthorDate: Fri Aug 24 13:16:26 2018 +0100
Commit:     Wei Liu <wei.liu2@xxxxxxxxxx>
CommitDate: Sun Aug 26 10:53:15 2018 +0100

    xenforeignmemory: work around bug in older privcmd
    
    Versions of linux privcmd prior to commit dc9eab6fd94d ("return -ENOTTY
    for unimplemented IOCTLs") will return -EINVAL rather than the conventional
    -ENOTTY for unimplemented codes. This breaks the error path in
    libxenforeignmemory resource mapping, which only translates ENOTTY into
    EOPNOTSUPP to inform callers of the need to use an alternative (legacy)
    mechanism.
    
    This patch adds a new 'unimplemented' [1] ioctl code into the local
    privcmd header which is then used to probe for the appropriate errno to
    translate in the resource mapping error path
    
    [1] this is a code that has, so far, never been used in any version of
        privcmd and will be added to future versions of the header in the
        linux source, to make sure it stays unimplemented.
    
    Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
    Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx>
    Acked-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
---
 tools/include/xen-sys/Linux/privcmd.h |  2 ++
 tools/libs/foreignmemory/linux.c      | 19 ++++++++++++++++++-
 tools/libs/foreignmemory/private.h    |  1 +
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/tools/include/xen-sys/Linux/privcmd.h 
b/tools/include/xen-sys/Linux/privcmd.h
index 9531b728f9..bc60e8fd55 100644
--- a/tools/include/xen-sys/Linux/privcmd.h
+++ b/tools/include/xen-sys/Linux/privcmd.h
@@ -114,5 +114,7 @@ typedef struct privcmd_mmap_resource {
        _IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
 #define IOCTL_PRIVCMD_MMAP_RESOURCE                            \
        _IOC(_IOC_NONE, 'P', 7, sizeof(privcmd_mmap_resource_t))
+#define IOCTL_PRIVCMD_UNIMPLEMENTED                            \
+       _IOC(_IOC_NONE, 'P', 0xFF, 0)
 
 #endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
diff --git a/tools/libs/foreignmemory/linux.c b/tools/libs/foreignmemory/linux.c
index 3686cf41e0..0368aa09f4 100644
--- a/tools/libs/foreignmemory/linux.c
+++ b/tools/libs/foreignmemory/linux.c
@@ -53,6 +53,23 @@ int osdep_xenforeignmemory_open(xenforeignmemory_handle 
*fmem)
         return -1;
     }
 
+    /*
+     * Older versions of privcmd return -EINVAL for unimplemented ioctls
+     * so we need to probe for the errno to use rather than just using
+     * the conventional ENOTTY.
+     */
+    if ( ioctl(fd, IOCTL_PRIVCMD_UNIMPLEMENTED, NULL) >= 0 )
+    {
+        xtl_log(fmem->logger, XTL_ERROR, -1, "xenforeignmemory",
+                "privcmd ioctl should not be implemented");
+        return -1;
+    }
+    else
+    {
+        fmem->unimpl_errno = errno;
+        errno = 0;
+    }
+
     fmem->fd = fd;
     return 0;
 }
@@ -307,7 +324,7 @@ int osdep_xenforeignmemory_map_resource(
     {
         int saved_errno;
 
-        if ( errno != ENOTTY && errno != EOPNOTSUPP )
+        if ( errno != fmem->unimpl_errno && errno != EOPNOTSUPP )
             PERROR("ioctl failed");
         else
             errno = EOPNOTSUPP;
diff --git a/tools/libs/foreignmemory/private.h 
b/tools/libs/foreignmemory/private.h
index b06ce12583..8f1bf081ed 100644
--- a/tools/libs/foreignmemory/private.h
+++ b/tools/libs/foreignmemory/private.h
@@ -23,6 +23,7 @@ struct xenforeignmemory_handle {
     unsigned flags;
     int fd;
     Xentoolcore__Active_Handle tc_ah;
+    int unimpl_errno;
 };
 
 int osdep_xenforeignmemory_open(xenforeignmemory_handle *fmem);
--
generated by git-patchbot for /home/xen/git/xen.git#staging

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.