Blob Blame History Raw
From 984e95fcbdb19c2495851322a4c33f34291ecfab Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 29 Oct 2021 21:02:54 +0100
Subject: [PATCH] vddk: Simplify detection of VDDK symbols and baseline 6.5

Make all symbols from VDDK 6.5 into required symbols and use a single
error message function if one of these is missing.  The new error is:

  nbdkit: error: required VDDK symbol "VixDiskLib_Wait" is
  missing. VDDK version must be >= 6.5. See nbdkit-vddk-plugin(1) man
  page section "SUPPORTED VERSIONS OF VDDK". Original dlopen error:
  vmware-vix-disklib-distrib/lib64/libvixDiskLib.so.6: undefined
  symbol: VixDiskLib_Wait

Remove the extra check and assert.

Be more consistent about #define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
when we want the optional and required stubs to do the same thing.

(cherry picked from commit ec0d22e61881efa39a69d02ccb9e4ede8bf95e75)
---
 plugins/vddk/stats.c      |  2 +-
 plugins/vddk/vddk-stubs.h | 45 ++++++++++++++++++---------------------
 plugins/vddk/vddk.c       | 36 ++++++++++++-------------------
 plugins/vddk/vddk.h       |  2 +-
 4 files changed, 37 insertions(+), 48 deletions(-)

diff --git a/plugins/vddk/stats.c b/plugins/vddk/stats.c
index 18a42714..76e0c244 100644
--- a/plugins/vddk/stats.c
+++ b/plugins/vddk/stats.c
@@ -89,7 +89,7 @@ display_stats (void)
   if (!vddk_debug_stats) return;
 
 #define STUB(fn,ret,args) statlist_append (&stats, stats_##fn)
-#define OPTIONAL_STUB(fn,ret,args) statlist_append (&stats, stats_##fn)
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
 #include "vddk-stubs.h"
 #undef STUB
 #undef OPTIONAL_STUB
diff --git a/plugins/vddk/vddk-stubs.h b/plugins/vddk/vddk-stubs.h
index 66353691..7d8644c3 100644
--- a/plugins/vddk/vddk-stubs.h
+++ b/plugins/vddk/vddk-stubs.h
@@ -39,10 +39,7 @@
  * function name, return value, arguments.
  */
 
-/* Required stubs, present in all versions of VDDK that we support.  I
- * have checked that all these exist in at least VDDK 5.5.5 (2015).
- */
-
+/* Required stubs, present in all versions of VDDK since 6.5 (Nov 2016). */
 STUB (VixDiskLib_InitEx,
       VixError,
       (uint32_t major, uint32_t minor,
@@ -103,27 +100,27 @@ STUB (VixDiskLib_Write,
        uint64_t start_sector, uint64_t nr_sectors,
        const unsigned char *buf));
 
-/* Added in VDDK 6.0, these will be NULL in earlier versions. */
-OPTIONAL_STUB (VixDiskLib_Flush,
-               VixError,
-               (VixDiskLibHandle handle));
-OPTIONAL_STUB (VixDiskLib_ReadAsync,
-               VixError,
-               (VixDiskLibHandle handle,
-                uint64_t start_sector, uint64_t nr_sectors,
-                unsigned char *buf,
-                VixDiskLibCompletionCB callback, void *data));
-OPTIONAL_STUB (VixDiskLib_WriteAsync,
-               VixError,
-               (VixDiskLibHandle handle,
-                uint64_t start_sector, uint64_t nr_sectors,
-                const unsigned char *buf,
-                VixDiskLibCompletionCB callback, void *data));
+/* Added in VDDK 6.0. */
+STUB (VixDiskLib_Flush,
+      VixError,
+      (VixDiskLibHandle handle));
+STUB (VixDiskLib_ReadAsync,
+      VixError,
+      (VixDiskLibHandle handle,
+       uint64_t start_sector, uint64_t nr_sectors,
+       unsigned char *buf,
+       VixDiskLibCompletionCB callback, void *data));
+STUB (VixDiskLib_WriteAsync,
+      VixError,
+      (VixDiskLibHandle handle,
+       uint64_t start_sector, uint64_t nr_sectors,
+       const unsigned char *buf,
+       VixDiskLibCompletionCB callback, void *data));
 
-/* Added in VDDK 6.5, this will be NULL in earlier versions. */
-OPTIONAL_STUB (VixDiskLib_Wait,
-               VixError,
-               (VixDiskLibHandle handle));
+/* Added in VDDK 6.5. */
+STUB (VixDiskLib_Wait,
+      VixError,
+      (VixDiskLibHandle handle));
 
 /* Added in VDDK 6.7, these will be NULL for earlier versions: */
 OPTIONAL_STUB (VixDiskLib_QueryAllocatedBlocks,
diff --git a/plugins/vddk/vddk.c b/plugins/vddk/vddk.c
index f967e2d9..271b5ee0 100644
--- a/plugins/vddk/vddk.c
+++ b/plugins/vddk/vddk.c
@@ -63,7 +63,7 @@ NBDKIT_DLL_PUBLIC int vddk_debug_datapath = 1;
  * initialized when the plugin is loaded (by vddk_get_ready).
  */
 #define STUB(fn,ret,args) ret (*fn) args
-#define OPTIONAL_STUB(fn,ret,args) ret (*fn) args
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
 #include "vddk-stubs.h"
 #undef STUB
 #undef OPTIONAL_STUB
@@ -282,6 +282,17 @@ vddk_config (const char *key, const char *value)
   return 0;
 }
 
+static void
+missing_required_symbol (const char *fn)
+{
+  nbdkit_error ("required VDDK symbol \"%s\" is missing. "
+                "VDDK version must be >= 6.5. "
+                "See nbdkit-vddk-plugin(1) man page section \"SUPPORTED VERSIONS OF VDDK\". "
+                "Original dlopen error: %s\n",
+                fn, dlerror ());
+  exit (EXIT_FAILURE);
+}
+
 /* Load the VDDK library. */
 static void
 load_library (bool load_error_is_fatal)
@@ -358,32 +369,13 @@ load_library (bool load_error_is_fatal)
 #define STUB(fn,ret,args)                                         \
   do {                                                            \
     fn = dlsym (dl, #fn);                                         \
-    if (fn == NULL) {                                             \
-      nbdkit_error ("required VDDK symbol \"%s\" is missing: %s", \
-                    #fn, dlerror ());                             \
-      exit (EXIT_FAILURE);                                        \
-    }                                                             \
+    if (fn == NULL)                                               \
+      missing_required_symbol (#fn);                              \
   } while (0)
 #define OPTIONAL_STUB(fn,ret,args) fn = dlsym (dl, #fn)
 #include "vddk-stubs.h"
 #undef STUB
 #undef OPTIONAL_STUB
-
-  /* Additionally, VDDK version must be >= 6.5.  This was the first
-   * version which introduced VixDiskLib_Wait symbol so we can check
-   * for that.
-   */
-  if (VixDiskLib_Wait == NULL) {
-    nbdkit_error ("VDDK version must be >= 6.5. "
-                  "See nbdkit-vddk-plugin(1) man page section \"SUPPORTED VERSIONS OF VDDK\".");
-    exit (EXIT_FAILURE);
-  }
-
-  /* Added in VDDK 6.0 so it must always be present.  Since we are
-   * going to call this function unconditionally, fail early and hard
-   * if for some reason it's not present.
-   */
-  assert (VixDiskLib_Flush != NULL);
 }
 
 static int
diff --git a/plugins/vddk/vddk.h b/plugins/vddk/vddk.h
index be0b3492..0e3dd79e 100644
--- a/plugins/vddk/vddk.h
+++ b/plugins/vddk/vddk.h
@@ -76,7 +76,7 @@ extern int vddk_debug_datapath;
 extern int vddk_debug_stats;
 
 #define STUB(fn,ret,args) extern ret (*fn) args
-#define OPTIONAL_STUB(fn,ret,args) extern ret (*fn) args
+#define OPTIONAL_STUB(fn,ret,args) STUB(fn,ret,args)
 #include "vddk-stubs.h"
 #undef STUB
 #undef OPTIONAL_STUB
-- 
2.31.1