From d00c36410b7432fe74485589a750f99fcf05a23f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 7 Sep 2021 14:51:14 +0100 Subject: [PATCH] daemon/luks.c: Ignore bogus GCC -fanalyzer double-free warning As far as I can tell the analysis is completely bogus. We don't double-free the tempfile string in do_luks_add_key. Therefore add a GCC suppression around the remove_temp function. luks.c: In function 'do_luks_add_key': luks.c:84:3: error: double-'free' of 'tempfile_14' [CWE-415] [-Werror=analyzer-double-free] 84 | free (tempfile); | ^~~~~~~~~~~~~~~ 'do_luks_add_key': events 1-2 | | 143 | do_luks_add_key (const char *device, const char *key, const char *newkey, | | ^~~~~~~~~~~~~~~ | | | | | (1) entry to 'do_luks_add_key' |...... | 146 | char *keyfile = write_key_to_temp (key); | | ~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (2) calling 'write_key_to_temp' from 'do_luks_add_key' | +--> 'write_key_to_temp': events 3-12 | | 41 | write_key_to_temp (const char *key) | | ^~~~~~~~~~~~~~~~~ | | | | | (3) entry to 'write_key_to_temp' |...... | 47 | tempfile = strdup ("/tmp/luksXXXXXX"); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (4) allocated here | 48 | if (!tempfile) { | | ~ | | | | | (5) assuming 'tempfile_14' is non-NULL | | (6) following 'false' branch (when 'tempfile_14' is non-NULL)... |...... | 53 | fd = mkstemp (tempfile); | | ~~ | | | | | (7) ...to here | 54 | if (fd == -1) { | | ~ | | | | | (8) following 'false' branch... |...... | 59 | len = strlen (key); | | ~~~ | | | | | (9) ...to here | 60 | if (xwrite (fd, key, len) == -1) { | | ~ | | | | | (10) following 'false' branch... |...... | 66 | if (close (fd) == -1) { | | ~~ ~ | | | | | | | (12) following 'false' branch... | | (11) ...to here | 'write_key_to_temp': event 13 | |cc1: | (13): ...to here | <------+ | 'do_luks_add_key': events 14-17 | | 146 | char *keyfile = write_key_to_temp (key); | | ^~~~~~~~~~~~~~~~~~~~~~~ | | | | | (14) returning to 'do_luks_add_key' from 'write_key_to_temp' | 147 | if (!keyfile) | | ~ | | | | | (15) following 'false' branch... |...... | 150 | char *newkeyfile = write_key_to_temp (newkey); | | ~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | | | (17) calling 'write_key_to_temp' from 'do_luks_add_key' | | (16) ...to here | +--> 'write_key_to_temp': events 18-26 | | 41 | write_key_to_temp (const char *key) | | ^~~~~~~~~~~~~~~~~ | | | | | (18) entry to 'write_key_to_temp' |...... | 47 | tempfile = strdup ("/tmp/luksXXXXXX"); | | ~~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (19) allocated here | 48 | if (!tempfile) { | | ~ | | | | | (20) following 'false' branch (when 'tempfile_14' is non-NULL)... |...... | 53 | fd = mkstemp (tempfile); | | ~~ | | | | | (21) ...to here | 54 | if (fd == -1) { | | ~ | | | | | (22) following 'false' branch... |...... | 59 | len = strlen (key); | | ~~~ | | | | | (23) ...to here | 60 | if (xwrite (fd, key, len) == -1) { | | ~ | | | | | (24) following 'false' branch... |...... | 66 | if (close (fd) == -1) { | | ~~ ~ | | | | | | | (26) following 'false' branch... | | (25) ...to here | 'write_key_to_temp': event 27 | |cc1: | (27): ...to here | <------+ | 'do_luks_add_key': events 28-32 | | 84 | free (tempfile); | | ~~~~~~~~~~~~~~~ | | | | | (31) first 'free' here | | (32) second 'free' here; first 'free' was at (31) |...... | 150 | char *newkeyfile = write_key_to_temp (newkey); | | ^~~~~~~~~~~~~~~~~~~~~~~~~~ | | | | | (28) returning to 'do_luks_add_key' from 'write_key_to_temp' | 151 | if (!newkeyfile) { | | ~ | | | | | (29) following 'false' branch... |...... | 156 | const char *argv[MAX_ARGS]; | | ~~~~~ | | | | | (30) ...to here | cc1: all warnings being treated as errors --- daemon/luks.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/daemon/luks.c b/daemon/luks.c index 166cc953a..9d120b0eb 100644 --- a/daemon/luks.c +++ b/daemon/luks.c @@ -77,12 +77,15 @@ write_key_to_temp (const char *key) } #pragma GCC diagnostic pop +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wanalyzer-double-free" static void remove_temp (char *tempfile) { unlink (tempfile); free (tempfile); } +#pragma GCC diagnostic pop static int luks_format (const char *device, const char *key, int keyslot,