[libvirt] [PATCH] virnetsocket: fix getsockopt on FreeBSD

Ryota Ozaki ozaki.ryota at gmail.com
Thu Oct 24 15:48:25 UTC 2013


aa0f099 introduced a strict error checking for getsockopt and it
revealed that getting a peer credential of a socket on FreeBSD
didn't work. Libvirtd hits the error:
  error : virNetSocketGetUNIXIdentity:1198 : Failed to get valid
  client socket identity groups

SOL_SOCKET (0xffff) was used as a level of getsockopt for
LOCAL_PEERCRED, however, it was wrong. 0 is correct as well as
Mac OS X.

So for LOCAL_PEERCRED our options are SOL_LOCAL (if defined) or
0 on Mac OS X and FreeBSD. According to the fact, the patch
simplifies the code by removing ifdef __APPLE__.

I tested the patch on FreeBSD 8.4, 9.2 and 10.0-BETA1.

Signed-off-by: Ryota Ozaki <ozaki.ryota at gmail.com>
---
 src/rpc/virnetsocket.c | 21 ++++++++++-----------
 1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index 3eb5708..04bf25a 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -1152,18 +1152,17 @@ cleanup:
 /* VIR_SOL_PEERCRED - the value needed to let getsockopt() work with
  * LOCAL_PEERCRED
  */
-# ifdef __APPLE__
-#  ifdef SOL_LOCAL
-#   define VIR_SOL_PEERCRED SOL_LOCAL
-#  else
-/* Prior to Mac OS X 10.7, SOL_LOCAL was not defined and users were
- * expected to supply 0 as the second value for getsockopt() when using
- * LOCAL_PEERCRED
- */
-#   define VIR_SOL_PEERCRED 0
-#  endif
+
+/* Mac OS X 10.8 provides SOL_LOCAL for LOCAL_PEERCRED */
+# ifdef SOL_LOCAL
+#  define VIR_SOL_PEERCRED SOL_LOCAL
 # else
-#  define VIR_SOL_PEERCRED SOL_SOCKET
+/* FreeBSD and Mac OS X prior to 10.7, SOL_LOCAL is not defined and
+ * users are expected to supply 0 as the second value for getsockopt()
+ * when using LOCAL_PEERCRED. NB SOL_SOCKET cannot be used instead
+ * of SOL_LOCAL
+ */
+#  define VIR_SOL_PEERCRED 0
 # endif
 
 int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
-- 
1.8.4




More information about the libvir-list mailing list