vcl: Handle newer Glibc (>2.28) where fcntl is actually fcntl64 88/23388/4
authorCarl Smith <carl.smith@alliedtelesis.co.nz>
Wed, 13 Nov 2019 01:37:39 +0000 (14:37 +1300)
committerFlorin Coras <florin.coras@gmail.com>
Thu, 14 Nov 2019 00:34:37 +0000 (00:34 +0000)
Glibc 2.28 now provides fcntl64 which is used instead of fcntl
by defining fcntl as fcntl64 in fcntl.h

Type: fix

Change-Id: I87fedfbf3e0d241aafdc920e90f824d71353e0e6
Signed-off-by: Carl Smith <carl.smith@alliedtelesis.co.nz>
src/cmake/syscall.cmake
src/vcl/ldp.c
src/vcl/ldp_socket_wrapper.c
src/vcl/ldp_socket_wrapper.h

index 1e0a559..aa3bac4 100644 (file)
@@ -34,3 +34,12 @@ if (HAVE_GETCPU)
     add_definitions(-DHAVE_GETCPU)
 endif()
 
+check_c_source_compiles("
+  #define _GNU_SOURCE
+  #include <fcntl.h>
+  int main() { return fcntl64 (0, 0); }
+" HAVE_FCNTL64)
+
+if (HAVE_FCNTL64)
+    add_definitions(-DHAVE_FCNTL64)
+endif()
index 7aa3830..e53a61e 100644 (file)
@@ -482,8 +482,13 @@ writev (int fd, const struct iovec * iov, int iovcnt)
   return size;
 }
 
+#ifdef HAVE_FCNTL64
+int
+fcntl64 (int fd, int cmd, ...)
+#else
 int
 fcntl (int fd, int cmd, ...)
+#endif
 {
   vls_handle_t vlsh;
   int rv = 0;
@@ -531,7 +536,11 @@ fcntl (int fd, int cmd, ...)
     }
   else
     {
+#ifdef HAVE_FCNTL64
+      rv = libc_vfcntl64 (fd, cmd, ap);
+#else
       rv = libc_vfcntl (fd, cmd, ap);
+#endif
     }
 
   va_end (ap);
index ddf947d..81637de 100644 (file)
@@ -173,6 +173,9 @@ typedef int (*__libc_dup2) (int oldfd, int newfd);
 #endif
 
 typedef int (*__libc_fcntl) (int fd, int cmd, ...);
+#ifdef HAVE_FCNTL64
+typedef int (*__libc_fcntl64) (int fd, int cmd, ...);
+#endif
 typedef FILE *(*__libc_fopen) (const char *name, const char *mode);
 #ifdef HAVE_FOPEN64
 typedef FILE *(*__libc_fopen64) (const char *name, const char *mode);
@@ -292,6 +295,9 @@ struct swrap_libc_symbols
   SWRAP_SYMBOL_ENTRY (dup2);
 #endif
   SWRAP_SYMBOL_ENTRY (fcntl);
+#ifdef HAVE_FCNTL64
+  SWRAP_SYMBOL_ENTRY (fcntl64);
+#endif
   SWRAP_SYMBOL_ENTRY (fopen);
 #ifdef HAVE_FOPEN64
   SWRAP_SYMBOL_ENTRY (fopen64);
@@ -562,6 +568,30 @@ libc_vfcntl (int fd, int cmd, va_list ap)
   return rc;
 }
 
+#ifdef HAVE_FCNTL64
+DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
+libc_vfcntl64 (int fd, int cmd, va_list ap)
+{
+  long int args[4];
+  int rc;
+  int i;
+
+  swrap_bind_symbol_libc (fcntl64);
+
+  for (i = 0; i < 4; i++)
+    {
+      args[i] = va_arg (ap, long int);
+    }
+
+  rc = swrap.libc.symbols._libc_fcntl64.f (fd,
+                                          cmd,
+                                          args[0], args[1], args[2],
+                                          args[3]);
+
+  return rc;
+}
+#endif
+
 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
 libc_vioctl (int fd, int cmd, va_list ap)
 {
index 4121724..b949d97 100644 (file)
@@ -130,6 +130,9 @@ int libc_eventfd (int count, int flags);
 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
 libc_vfcntl (int fd, int cmd, va_list ap);
 
+DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
+libc_vfcntl64 (int fd, int cmd, va_list ap);
+
 DO_NOT_SANITIZE_ADDRESS_ATTRIBUTE int
 libc_vioctl (int fd, int cmd, va_list ap);