libguestfs/0004-build-Assume-__attribute__-cleanup-always-works.patch

410 lines
13 KiB
Diff
Raw Permalink Normal View History

From e37768d8892d6f467c7834f8b142b89f8f0af7dc Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Fri, 18 Oct 2024 21:52:21 +0100
Subject: [PATCH] build: Assume __attribute__((cleanup)) always works
All recent compilers support this (except MS compilers which we don't
care about). Assume it is supported. We test it in ./configure and
hard fail if it doesn't work.
We still define HAVE_ATTRIBUTE_CLEANUP but you can now assume it is
always defined and don't have to check it.
---
common | 2 +-
daemon/daemon.h | 9 ---------
daemon/sh.c | 5 -----
daemon/yara.c | 8 --------
generator/c.ml | 10 ----------
generator/daemon.ml | 15 ---------------
lib/guestfs-internal.h | 8 --------
lib/info.c | 5 -----
lib/launch-libvirt.c | 5 -----
lib/qemu.c | 5 -----
m4/guestfs-c.m4 | 7 ++-----
11 files changed, 3 insertions(+), 76 deletions(-)
Submodule common b6e703dc..01c53226:
diff --git a/common/structs/structs-cleanups.h b/common/structs/structs-cleanups.h
index b43dbd75..c6e7fd1e 100644
--- a/common/structs/structs-cleanups.h
+++ b/common/structs/structs-cleanups.h
@@ -28,7 +28,6 @@
#ifndef GUESTFS_STRUCTS_CLEANUPS_H_
#define GUESTFS_STRUCTS_CLEANUPS_H_
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_FREE_INT_BOOL \
__attribute__((cleanup(guestfs_int_cleanup_free_int_bool)))
#define CLEANUP_FREE_INT_BOOL_LIST \
@@ -137,62 +136,6 @@
__attribute__((cleanup(guestfs_int_cleanup_free_yara_detection)))
#define CLEANUP_FREE_YARA_DETECTION_LIST \
__attribute__((cleanup(guestfs_int_cleanup_free_yara_detection_list)))
-#else /* !HAVE_ATTRIBUTE_CLEANUP */
-#define CLEANUP_FREE_INT_BOOL
-#define CLEANUP_FREE_INT_BOOL_LIST
-#define CLEANUP_FREE_LVM_PV
-#define CLEANUP_FREE_LVM_PV_LIST
-#define CLEANUP_FREE_LVM_VG
-#define CLEANUP_FREE_LVM_VG_LIST
-#define CLEANUP_FREE_LVM_LV
-#define CLEANUP_FREE_LVM_LV_LIST
-#define CLEANUP_FREE_STAT
-#define CLEANUP_FREE_STAT_LIST
-#define CLEANUP_FREE_STATNS
-#define CLEANUP_FREE_STATNS_LIST
-#define CLEANUP_FREE_STATVFS
-#define CLEANUP_FREE_STATVFS_LIST
-#define CLEANUP_FREE_DIRENT
-#define CLEANUP_FREE_DIRENT_LIST
-#define CLEANUP_FREE_VERSION
-#define CLEANUP_FREE_VERSION_LIST
-#define CLEANUP_FREE_XATTR
-#define CLEANUP_FREE_XATTR_LIST
-#define CLEANUP_FREE_INOTIFY_EVENT
-#define CLEANUP_FREE_INOTIFY_EVENT_LIST
-#define CLEANUP_FREE_PARTITION
-#define CLEANUP_FREE_PARTITION_LIST
-#define CLEANUP_FREE_APPLICATION
-#define CLEANUP_FREE_APPLICATION_LIST
-#define CLEANUP_FREE_APPLICATION2
-#define CLEANUP_FREE_APPLICATION2_LIST
-#define CLEANUP_FREE_ISOINFO
-#define CLEANUP_FREE_ISOINFO_LIST
-#define CLEANUP_FREE_MDSTAT
-#define CLEANUP_FREE_MDSTAT_LIST
-#define CLEANUP_FREE_BTRFSSUBVOLUME
-#define CLEANUP_FREE_BTRFSSUBVOLUME_LIST
-#define CLEANUP_FREE_BTRFSQGROUP
-#define CLEANUP_FREE_BTRFSQGROUP_LIST
-#define CLEANUP_FREE_BTRFSBALANCE
-#define CLEANUP_FREE_BTRFSBALANCE_LIST
-#define CLEANUP_FREE_BTRFSSCRUB
-#define CLEANUP_FREE_BTRFSSCRUB_LIST
-#define CLEANUP_FREE_XFSINFO
-#define CLEANUP_FREE_XFSINFO_LIST
-#define CLEANUP_FREE_UTSNAME
-#define CLEANUP_FREE_UTSNAME_LIST
-#define CLEANUP_FREE_HIVEX_NODE
-#define CLEANUP_FREE_HIVEX_NODE_LIST
-#define CLEANUP_FREE_HIVEX_VALUE
-#define CLEANUP_FREE_HIVEX_VALUE_LIST
-#define CLEANUP_FREE_INTERNAL_MOUNTABLE
-#define CLEANUP_FREE_INTERNAL_MOUNTABLE_LIST
-#define CLEANUP_FREE_TSK_DIRENT
-#define CLEANUP_FREE_TSK_DIRENT_LIST
-#define CLEANUP_FREE_YARA_DETECTION
-#define CLEANUP_FREE_YARA_DETECTION_LIST
-#endif /* !HAVE_ATTRIBUTE_CLEANUP */
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
diff --git a/common/utils/cleanups.h b/common/utils/cleanups.h
index 932114f6..be52d072 100644
--- a/common/utils/cleanups.h
+++ b/common/utils/cleanups.h
@@ -19,7 +19,6 @@
#ifndef GUESTFS_CLEANUPS_H_
#define GUESTFS_CLEANUPS_H_
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_FREE \
__attribute__((cleanup(guestfs_int_cleanup_free)))
#define CLEANUP_HASH_FREE \
@@ -50,23 +49,6 @@
__attribute__((cleanup(guestfs_int_cleanup_xmlXPathFreeObject)))
#define CLEANUP_PCRE2_MATCH_DATA_FREE \
__attribute__((cleanup(guestfs_int_cleanup_pcre2_match_data_free)))
-#else
-#define CLEANUP_FREE
-#define CLEANUP_HASH_FREE
-#define CLEANUP_UNLINK_FREE
-#define CLEANUP_CLOSE
-#define CLEANUP_FCLOSE
-#define CLEANUP_PCLOSE
-#define CLEANUP_FREE_STRING_LIST
-#define CLEANUP_XMLFREE
-#define CLEANUP_XMLBUFFERFREE
-#define CLEANUP_XMLFREEDOC
-#define CLEANUP_XMLFREEURI
-#define CLEANUP_XMLFREETEXTWRITER
-#define CLEANUP_XMLXPATHFREECONTEXT
-#define CLEANUP_XMLXPATHFREEOBJECT
-#define CLEANUP_PCRE2_MATCH_DATA_FREE
-#endif
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
diff --git a/daemon/daemon.h b/daemon/daemon.h
index e050588c..5fc53245 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -93,11 +93,7 @@ extern char *read_whole_file (const char *filename, size_t *size_r);
extern char *mountable_to_string (const mountable_t *mountable);
extern void cleanup_free_mountable (mountable_t *mountable);
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_FREE_MOUNTABLE __attribute__((cleanup(cleanup_free_mountable)))
-#else
-#define CLEANUP_FREE_MOUNTABLE
-#endif
/* cleanups.c */
/* These functions are used internally by the CLEANUP_* macros.
@@ -106,13 +102,8 @@ extern void cleanup_free_mountable (mountable_t *mountable);
extern void cleanup_aug_close (void *ptr);
extern void cleanup_free_stringsbuf (void *ptr);
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_AUG_CLOSE __attribute__((cleanup(cleanup_aug_close)))
#define CLEANUP_FREE_STRINGSBUF __attribute__((cleanup(cleanup_free_stringsbuf)))
-#else
-#define CLEANUP_AUG_CLOSE
-#define CLEANUP_FREE_STRINGSBUF
-#endif
/* mount.c */
extern int is_root_mounted (void);
diff --git a/daemon/sh.c b/daemon/sh.c
index 92ce08be..21d4deea 100644
--- a/daemon/sh.c
+++ b/daemon/sh.c
@@ -32,13 +32,8 @@
#include "ignore-value.h"
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_BIND_STATE __attribute__((cleanup(free_bind_state)))
#define CLEANUP_RESOLVER_STATE __attribute__((cleanup(free_resolver_state)))
-#else
-#define CLEANUP_BIND_STATE
-#define CLEANUP_RESOLVER_STATE
-#endif
struct bind_state {
bool mounted;
diff --git a/daemon/yara.c b/daemon/yara.c
index 21137b73..9350dd27 100644
--- a/daemon/yara.c
+++ b/daemon/yara.c
@@ -39,12 +39,8 @@
#include <yara.h>
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_DESTROY_YARA_COMPILER \
__attribute__((cleanup(cleanup_destroy_yara_compiler)))
-#else
-#define CLEANUP_DESTROY_YARA_COMPILER
-#endif
struct write_callback_data {
int fd;
@@ -208,10 +204,6 @@ compile_rules_file (const char *rules_path)
}
err:
-#ifndef HAVE_ATTRIBUTE_CLEANUP
- yr_compiler_destroy (compiler);
-#endif
-
return ret;
}
diff --git a/generator/c.ml b/generator/c.ml
index 447059b8..838e7f42 100644
--- a/generator/c.ml
+++ b/generator/c.ml
@@ -817,7 +817,6 @@ and generate_client_structs_cleanups_h () =
#ifndef GUESTFS_STRUCTS_CLEANUPS_H_
#define GUESTFS_STRUCTS_CLEANUPS_H_
-#ifdef HAVE_ATTRIBUTE_CLEANUP
";
List.iter (
@@ -828,16 +827,7 @@ and generate_client_structs_cleanups_h () =
pr " __attribute__((cleanup(guestfs_int_cleanup_free_%s_list)))\n" name
) structs;
- pr "#else /* !HAVE_ATTRIBUTE_CLEANUP */\n";
-
- List.iter (
- fun { s_name = name } ->
- pr "#define CLEANUP_FREE_%s\n" (String.uppercase_ascii name);
- pr "#define CLEANUP_FREE_%s_LIST\n" (String.uppercase_ascii name)
- ) structs;
-
pr "\
-#endif /* !HAVE_ATTRIBUTE_CLEANUP */
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
diff --git a/generator/daemon.ml b/generator/daemon.ml
index 78a2412d..9ab9e12d 100644
--- a/generator/daemon.ml
+++ b/generator/daemon.ml
@@ -127,8 +127,6 @@ let generate_daemon_stubs actions () =
args_passed_to_daemon in
if args_passed_to_daemon <> [] then (
- pr "#ifdef HAVE_ATTRIBUTE_CLEANUP\n";
- pr "\n";
pr "#define CLEANUP_XDR_FREE_%s_ARGS \\\n" uc_name;
pr " __attribute__((cleanup(cleanup_xdr_free_%s_args)))\n" name;
pr "\n";
@@ -140,9 +138,6 @@ let generate_daemon_stubs actions () =
name;
pr "}\n";
pr "\n";
- pr "#else /* !HAVE_ATTRIBUTE_CLEANUP */\n";
- pr "#define CLEANUP_XDR_FREE_%s_ARGS\n" uc_name;
- pr "#endif /* !HAVE_ATTRIBUTE_CLEANUP */\n";
pr "\n"
);
@@ -1315,7 +1310,6 @@ let generate_daemon_structs_cleanups_h () =
#ifndef GUESTFS_DAEMON_STRUCTS_CLEANUPS_H_
#define GUESTFS_DAEMON_STRUCTS_CLEANUPS_H_
-#ifdef HAVE_ATTRIBUTE_CLEANUP
";
List.iter (
@@ -1326,16 +1320,7 @@ let generate_daemon_structs_cleanups_h () =
pr " __attribute__((cleanup(cleanup_free_int_%s_list)))\n" name
) structs;
- pr "#else /* !HAVE_ATTRIBUTE_CLEANUP */\n";
-
- List.iter (
- fun { s_name = name } ->
- pr "#define CLEANUP_FREE_%s\n" (String.uppercase_ascii name);
- pr "#define CLEANUP_FREE_%s_LIST\n" (String.uppercase_ascii name)
- ) structs;
-
pr "\
-#endif /* !HAVE_ATTRIBUTE_CLEANUP */
/* These functions are used internally by the CLEANUP_* macros.
* Don't call them directly.
diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
index 174ca135..f9f4628a 100644
--- a/lib/guestfs-internal.h
+++ b/lib/guestfs-internal.h
@@ -661,11 +661,7 @@ extern void guestfs_int_end_stringsbuf (guestfs_h *g, struct stringsbuf *sb);
extern void guestfs_int_free_stringsbuf (struct stringsbuf *sb);
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_FREE_STRINGSBUF __attribute__((cleanup(guestfs_int_cleanup_free_stringsbuf)))
-#else
-#define CLEANUP_FREE_STRINGSBUF
-#endif
extern void guestfs_int_cleanup_free_stringsbuf (struct stringsbuf *sb);
/* proto.c */
@@ -785,11 +781,7 @@ extern int guestfs_int_cmd_pipe_run (struct command *cmd, const char *mode);
extern int guestfs_int_cmd_pipe_wait (struct command *cmd);
extern char *guestfs_int_cmd_get_pipe_errors (struct command *cmd);
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_CMD_CLOSE __attribute__((cleanup(guestfs_int_cleanup_cmd_close)))
-#else
-#define CLEANUP_CMD_CLOSE
-#endif
extern void guestfs_int_cleanup_cmd_close (struct command **);
/* launch-*.c constructors */
diff --git a/lib/info.c b/lib/info.c
index 4dee7a26..b60fc8b3 100644
--- a/lib/info.c
+++ b/lib/info.c
@@ -43,7 +43,6 @@
#include "guestfs-internal.h"
#include "guestfs-internal-actions.h"
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_JSON_T_DECREF __attribute__((cleanup(cleanup_json_t_decref)))
static void
@@ -52,10 +51,6 @@ cleanup_json_t_decref (void *ptr)
json_decref (* (json_t **) ptr);
}
-#else
-#define CLEANUP_JSON_T_DECREF
-#endif
-
static json_t *get_json_output (guestfs_h *g, const char *filename);
static int qemu_img_supports_U_option (guestfs_h *g);
static void set_child_rlimits (struct command *);
diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c
index fed6dcc8..d01f6578 100644
--- a/lib/launch-libvirt.c
+++ b/lib/launch-libvirt.c
@@ -97,7 +97,6 @@ xmlBufferDetach (xmlBufferPtr buf)
}
#endif
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_VIRSECRETFREE __attribute__((cleanup(cleanup_virSecretFree)))
static void
@@ -108,10 +107,6 @@ cleanup_virSecretFree (void *ptr)
virSecretFree (secret_obj);
}
-#else /* !HAVE_ATTRIBUTE_CLEANUP */
-#define CLEANUP_VIRSECRETFREE
-#endif
-
/* List used to store a mapping of secret to libvirt secret UUID. */
struct secret {
char *secret;
diff --git a/lib/qemu.c b/lib/qemu.c
index 027790e4..886c92e5 100644
--- a/lib/qemu.c
+++ b/lib/qemu.c
@@ -46,7 +46,6 @@
#include "guestfs-internal.h"
#include "guestfs_protocol.h"
-#ifdef HAVE_ATTRIBUTE_CLEANUP
#define CLEANUP_JSON_T_DECREF __attribute__((cleanup(cleanup_json_t_decref)))
static void
@@ -55,10 +54,6 @@ cleanup_json_t_decref (void *ptr)
json_decref (* (json_t **) ptr);
}
-#else
-#define CLEANUP_JSON_T_DECREF
-#endif
-
struct qemu_data {
int generation; /* MEMO_GENERATION read from qemu.stat */
uint64_t prev_size; /* Size of qemu binary when cached. */
diff --git a/m4/guestfs-c.m4 b/m4/guestfs-c.m4
index 44c64b6d..49109cc8 100644
--- a/m4/guestfs-c.m4
+++ b/m4/guestfs-c.m4
@@ -109,15 +109,12 @@ main (int argc, char *argv[])
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_ATTRIBUTE_CLEANUP],[1],[Define to 1 if '__attribute__((cleanup(...)))' works with this compiler.])
],[
- AC_MSG_WARN(
+ AC_MSG_ERROR(
['__attribute__((cleanup(...)))' does not work.
You may not be using a sufficiently recent version of GCC or CLANG, or
you may be using a C compiler which does not support this attribute,
-or the configure test may be wrong.
-
-The code will still compile, but is likely to leak memory and other
-resources when it runs.])])
+or the configure test may be wrong.])])
dnl restore CFLAGS
CFLAGS="${acx_nbdkit_save_CFLAGS}"