On Fri, Oct 18, 2019 at 11:49:05 +0200, Michal Privoznik wrote: > These functions don't really abort() on OOM. The fix was merged > upstream, but not in the minimal version we require. Provide our > own implementation which can be removed once we bump the minimal > version. > > Signed-off-by: Michal Privoznik <mprivozn@xxxxxxxxxx> > --- > > v2 of: > > https://www.redhat.com/archives/libvir-list/2019-October/msg01153.html > > diff to v1: > - moved the code to src/utils/glibcompat.c > > src/internal.h | 1 + > src/libvirt_private.syms | 5 +++++ > src/util/Makefile.inc.am | 2 ++ > src/util/glibcompat.c | 48 ++++++++++++++++++++++++++++++++++++++++ > src/util/glibcompat.h | 31 ++++++++++++++++++++++++++ > 5 files changed, 87 insertions(+) > create mode 100644 src/util/glibcompat.c > create mode 100644 src/util/glibcompat.h > > diff --git a/src/internal.h b/src/internal.h > index fb17b87baa..5b0a2335f5 100644 > --- a/src/internal.h > +++ b/src/internal.h > @@ -64,6 +64,7 @@ > #include "libvirt/virterror.h" > > #include "c-strcase.h" > +#include "glibcompat.h" Please include this right below glib.h > > /* Merely casting to (void) is not sufficient since the > * introduction of the "warn_unused_result" attribute [...] > diff --git a/src/util/glibcompat.c b/src/util/glibcompat.c > new file mode 100644 > index 0000000000..af638f4d8c > --- /dev/null > +++ b/src/util/glibcompat.c > @@ -0,0 +1,48 @@ > +/* > + * Copyright (C) 2019 Red Hat, Inc. > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library. If not, see > + * <http://www.gnu.org/licenses/>. > + */ > + > +#include <config.h> > + > +#include "glibcompat.h" Sooo, this includes the macros ... > + > +/* Due to a bug in glib, g_strdup_printf() nor g_strdup_vprintf() > + * abort on OOM. It's fixed in glib's upstream. Provide our own > + * implementation until the fix get's distributed. */ > +char * > +vir_g_strdup_printf(const char *msg, ...) > +{ > + va_list args; > + char *ret; > + va_start(args, msg); > + ret = g_strdup_vprintf(msg, args); > + if (!ret) > + abort(); > + va_end(args); > + return ret; > +} > + > + > +char * > +vir_g_strdup_vprintf(const char *msg, va_list args) > +{ > + char *ret; > + ret = g_strdup_vprintf(msg, args); So this will become vir_g_strdup_vprintf.. thus become infinite recursion. > + if (!ret) > + abort(); > + return ret; > +} I think the kludge header must be separate and not included into this implementation, otherwise it will not work as expected. > diff --git a/src/util/glibcompat.h b/src/util/glibcompat.h > new file mode 100644 > index 0000000000..9c5fef09bf > --- /dev/null > +++ b/src/util/glibcompat.h > @@ -0,0 +1,31 @@ > +/* > + * Copyright (C) 2019 Red Hat, Inc. > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library. If not, see > + * <http://www.gnu.org/licenses/>. > + */ > + > +#pragma once > + > +#include <glib.h> > + > +char *vir_g_strdup_printf(const char *msg, ...) > + G_GNUC_PRINTF(1, 2); > +char *vir_g_strdup_vprintf(const char *msg, va_list args) > + G_GNUC_PRINTF(1, 0); > + > +#if !GLIB_CHECK_VERSION(2, 64, 0) > +# define g_strdup_printf vir_g_strdup_printf > +# define g_strdup_vprintf vir_g_strdup_vprintf > +#endif > -- > 2.21.0 > > -- > libvir-list mailing list > libvir-list@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/libvir-list -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list