[PATCH] server: Avoid deprecated g_memdup
glib now recommends that we use g_memdup2() to avoid accidental 32-bit
truncation bugs on platforms where g_size is larger than guint:
https://discourse.gnome.org/t/port-your-module-from-g-memdup-to-g-memdup2-now/5538
and failure to do so causes noisy compilation due to deprecation
warnings with glib 2.68:
nbd-server.c: In function ‘parse_cfile’:
nbd-server.c:1010:25: warning: ‘g_memdup’ is deprecated: Use 'g_memdup2' instead [-Wdeprecated-declarations]
1010 | SERVER *srv = serve_inc_ref(g_memdup(&s, sizeof(SERVER)));
| ^~~~~~
In file included from /usr/include/glib-2.0/glib.h:82,
from nbd-server.c:117:
/usr/include/glib-2.0/glib/gstrfuncs.h:257:23: note: declared here
257 | gpointer g_memdup (gconstpointer mem,
| ^~~~~~~~
Of course, we still want to build on platforms with older glib that
lack g_memdup2(). Thankfully, it's easy enough to audit that all our
current uses of g_memdup() do not overflow 32 bits.
---
configure.ac | 5 +++++
nbd-server.c | 7 ++++++-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index 48ba507..9504899 100644
--- a/configure.ac
+++ b/configure.ac
@@ -292,7 +292,9 @@ AC_CHECK_HEADERS([arpa/inet.h fcntl.h netdb.h netinet/in.h sys/ioctl.h sys/socke
PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.26.0 gthread-2.0 >= 2.26.0], [HAVE_GLIB=yes], AC_MSG_ERROR([Missing glib]))
my_save_cflags="$CFLAGS"
+my_save_libs="$LIBS"
CFLAGS="-Wdeprecated-declarations -Werror $GLIB_CFLAGS"
+LIBS="$GLIB_LIBS"
AC_MSG_CHECKING([if we are using an old glib 2.0 library])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
[[#include <glib.h>]],
@@ -306,7 +308,10 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
AC_DEFINE(HAVE_OLD_GLIB, 0, [Define to 1 if you have an old glib library])
]
)
+dnl g_memdup2 added in glib-2.68
+AC_CHECK_FUNCS([g_memdup2])
CFLAGS="$my_save_cflags"
+LIBS="$my_save_libs"
AC_MSG_CHECKING([whether _BSD_SOURCE needs to be defined for DT_* macros])
AC_PREPROC_IFELSE(
diff --git a/nbd-server.c b/nbd-server.c
index 0b32bcd..1eff99d 100644
--- a/nbd-server.c
+++ b/nbd-server.c
@@ -154,6 +154,11 @@
#include <gnutls/x509.h>
#endif
+#ifndef HAVE_G_MEMDUP2
+/* Our uses of g_memdup2 below are safe from g_memdup's 32-bit overflow */
+#define g_memdup2 g_memdup
+#endif
+
/** Where our config file actually is */
gchar* config_file_pos;
@@ -1007,7 +1012,7 @@ GArray* parse_cfile(gchar* f, struct generic_conf *const genconf, bool expect_ge
if(i>0 || !expect_generic) {
s.servename = groups[i];
- SERVER *srv = serve_inc_ref(g_memdup(&s, sizeof(SERVER)));
+ SERVER *srv = serve_inc_ref(g_memdup2(&s, sizeof(SERVER)));
g_array_append_val(retval, srv);
}
#ifndef WITH_SDP
--
2.31.1
Reply to: