mirror of https://gitee.com/openkylin/libvirt.git
meson: Bump glib version to 2.58.0
Now that we don't have any distro stuck with glib-2.56.0, we can bump the glib version. In fact, this is needed, because of g_clear_pointer. Since v7.4.0-rc1~301 we declare at compile time what version of glib APIs we want to use (by setting GLIB_VERSION_MIN_REQUIRED = GLIB_VERSION_MAX_ALLOWED = 2.56.0), regardless of actual glib version in the host. And since we currently require glib-2.56.0 and force glib to use APIs of that version, some newer bits are slipping from us. For instance: regular function version of g_clear_pointer() is used instead of a fancy macro. So what? Well, g_clear_pointer() function typecasts passed free function to void (*)(void *) and then calls it. Well, this triggers UBSAN, understandably. But with glib-2.58.0 the g_clear_pointer() becomes a macro which calls the free function directly, with no typecasting and thus no undefined behavior. Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
a50f870da6
commit
9c1cfc337e
|
@ -337,7 +337,7 @@ BuildRequires: gcc
|
|||
%if %{with_libxl}
|
||||
BuildRequires: xen-devel
|
||||
%endif
|
||||
BuildRequires: glib2-devel >= 2.56
|
||||
BuildRequires: glib2-devel >= 2.58
|
||||
BuildRequires: libxml2-devel
|
||||
BuildRequires: readline-devel
|
||||
BuildRequires: pkgconfig(bash-completion) >= 2.0
|
||||
|
|
|
@ -985,7 +985,7 @@ else
|
|||
endif
|
||||
endif
|
||||
|
||||
glib_version = '2.56.0'
|
||||
glib_version = '2.58.0'
|
||||
glib_dep = dependency('glib-2.0', version: '>=' + glib_version)
|
||||
gobject_dep = dependency('gobject-2.0', version: '>=' + glib_version)
|
||||
if host_machine.system() == 'windows'
|
||||
|
|
|
@ -1848,7 +1848,6 @@ virStorageSourceUpdatePhysicalSize;
|
|||
|
||||
|
||||
# util/glibcompat.h
|
||||
vir_g_canonicalize_filename;
|
||||
vir_g_fsync;
|
||||
vir_g_source_unref;
|
||||
vir_g_strdup_printf;
|
||||
|
|
|
@ -63,136 +63,11 @@
|
|||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
||||
#undef g_canonicalize_filename
|
||||
#undef g_hash_table_steal_extended
|
||||
#undef g_fsync
|
||||
#undef g_strdup_printf
|
||||
#undef g_strdup_vprintf
|
||||
|
||||
|
||||
gchar *
|
||||
vir_g_canonicalize_filename(const gchar *filename,
|
||||
const gchar *relative_to)
|
||||
{
|
||||
#if GLIB_CHECK_VERSION(2, 58, 0)
|
||||
return g_canonicalize_filename(filename, relative_to);
|
||||
#else /* ! GLIB_CHECK_VERSION(2, 58, 0) */
|
||||
gchar *canon, *start, *p, *q;
|
||||
guint i;
|
||||
|
||||
g_return_val_if_fail(relative_to == NULL || g_path_is_absolute(relative_to), NULL);
|
||||
|
||||
if (!g_path_is_absolute(filename)) {
|
||||
gchar *cwd_allocated = NULL;
|
||||
const gchar *cwd;
|
||||
|
||||
if (relative_to != NULL)
|
||||
cwd = relative_to;
|
||||
else
|
||||
cwd = cwd_allocated = g_get_current_dir();
|
||||
|
||||
canon = g_build_filename(cwd, filename, NULL);
|
||||
g_free(cwd_allocated);
|
||||
} else {
|
||||
canon = g_strdup(filename);
|
||||
}
|
||||
|
||||
start = (char *)g_path_skip_root(canon);
|
||||
|
||||
if (start == NULL) {
|
||||
/* This shouldn't really happen, as g_get_current_dir() should
|
||||
return an absolute pathname, but bug 573843 shows this is
|
||||
not always happening */
|
||||
g_free(canon);
|
||||
return g_build_filename(G_DIR_SEPARATOR_S, filename, NULL);
|
||||
}
|
||||
|
||||
/* POSIX allows double slashes at the start to
|
||||
* mean something special (as does windows too).
|
||||
* So, "//" != "/", but more than two slashes
|
||||
* is treated as "/".
|
||||
*/
|
||||
i = 0;
|
||||
for (p = start - 1;
|
||||
(p >= canon) &&
|
||||
G_IS_DIR_SEPARATOR(*p);
|
||||
p--)
|
||||
i++;
|
||||
if (i > 2) {
|
||||
i -= 1;
|
||||
start -= i;
|
||||
memmove(start, start+i, strlen(start+i) + 1);
|
||||
}
|
||||
|
||||
/* Make sure we're using the canonical dir separator */
|
||||
p++;
|
||||
while (p < start && G_IS_DIR_SEPARATOR(*p))
|
||||
*p++ = G_DIR_SEPARATOR;
|
||||
|
||||
p = start;
|
||||
while (*p != 0) {
|
||||
if (p[0] == '.' && (p[1] == 0 || G_IS_DIR_SEPARATOR(p[1]))) {
|
||||
memmove(p, p+1, strlen(p+1)+1);
|
||||
} else if (p[0] == '.' && p[1] == '.' &&
|
||||
(p[2] == 0 || G_IS_DIR_SEPARATOR(p[2]))) {
|
||||
q = p + 2;
|
||||
/* Skip previous separator */
|
||||
p = p - 2;
|
||||
if (p < start)
|
||||
p = start;
|
||||
while (p > start && !G_IS_DIR_SEPARATOR(*p))
|
||||
p--;
|
||||
if (G_IS_DIR_SEPARATOR(*p))
|
||||
*p++ = G_DIR_SEPARATOR;
|
||||
memmove(p, q, strlen(q)+1);
|
||||
} else {
|
||||
/* Skip until next separator */
|
||||
while (*p != 0 && !G_IS_DIR_SEPARATOR(*p))
|
||||
p++;
|
||||
|
||||
if (*p != 0) {
|
||||
/* Canonicalize one separator */
|
||||
*p++ = G_DIR_SEPARATOR;
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove additional separators */
|
||||
q = p;
|
||||
while (*q && G_IS_DIR_SEPARATOR(*q))
|
||||
q++;
|
||||
|
||||
if (p != q)
|
||||
memmove(p, q, strlen(q) + 1);
|
||||
}
|
||||
|
||||
/* Remove trailing slashes */
|
||||
if (p > start && G_IS_DIR_SEPARATOR(*(p-1)))
|
||||
*(p-1) = 0;
|
||||
|
||||
return canon;
|
||||
#endif /* ! GLIB_CHECK_VERSION(2, 58, 0) */
|
||||
}
|
||||
|
||||
|
||||
gboolean
|
||||
vir_g_hash_table_steal_extended(GHashTable *hash_table,
|
||||
gconstpointer lookup_key,
|
||||
gpointer *stolen_key,
|
||||
gpointer *stolen_value)
|
||||
{
|
||||
#if GLIB_CHECK_VERSION(2, 58, 0)
|
||||
return g_hash_table_steal_extended(hash_table, lookup_key, stolen_key, stolen_value);
|
||||
#else /* ! GLIB_CHECK_VERSION(2, 58, 0) */
|
||||
if (!(g_hash_table_lookup_extended(hash_table, lookup_key, stolen_key, stolen_value)))
|
||||
return FALSE;
|
||||
|
||||
g_hash_table_steal(hash_table, lookup_key);
|
||||
|
||||
return TRUE;
|
||||
#endif /* ! GLIB_CHECK_VERSION(2, 58, 0) */
|
||||
}
|
||||
|
||||
|
||||
/* Drop when min glib >= 2.63.0 */
|
||||
gint
|
||||
vir_g_fsync(gint fd)
|
||||
|
|
|
@ -68,15 +68,6 @@
|
|||
|
||||
#endif /* GLib < 2.67.0 */
|
||||
|
||||
gchar * vir_g_canonicalize_filename(const gchar *filename,
|
||||
const gchar *relative_to);
|
||||
|
||||
gboolean
|
||||
vir_g_hash_table_steal_extended(GHashTable *hash_table,
|
||||
gconstpointer lookup_key,
|
||||
gpointer *stolen_key,
|
||||
gpointer *stolen_value);
|
||||
#define g_hash_table_steal_extended vir_g_hash_table_steal_extended
|
||||
|
||||
gint vir_g_fsync(gint fd);
|
||||
char *vir_g_strdup_printf(const char *msg, ...)
|
||||
|
@ -89,7 +80,6 @@ char *vir_g_strdup_vprintf(const char *msg, va_list args)
|
|||
# define g_strdup_vprintf vir_g_strdup_vprintf
|
||||
#endif
|
||||
|
||||
#define g_canonicalize_filename vir_g_canonicalize_filename
|
||||
#undef g_fsync
|
||||
#define g_fsync vir_g_fsync
|
||||
|
||||
|
|
Loading…
Reference in New Issue