]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
vpick: make a working copy of the current dname
authorFrantisek Sumsal <frantisek@sumsal.cz>
Thu, 1 Feb 2024 12:56:37 +0000 (13:56 +0100)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Thu, 1 Feb 2024 13:54:06 +0000 (14:54 +0100)
Since we might edit the string later on by inserting NULs, which then
leads up to using an invalid dname when opening the potential chosen
directory:

[ 4316.957536] testsuite-74.sh[99]: make_choice: entry: mytree_37.0_arm64+2-3
[ 4316.957536] testsuite-74.sh[99]: make_choice: best_version: 37.0
[ 4316.957536] testsuite-74.sh[99]: make_choice: best_filename: mytree_37.0
[ 4316.957536] testsuite-74.sh[99]: Failed to open '//var/lib/machines/mytree.v/mytree_37.0': No such file or directory

Uncovered by vpick tests from TEST-74-AUX-UTILS when run on aarch64.

src/shared/vpick.c

index ab1f4289fcce0ac10249bdae70fc4c5f3f38570e..614708133b1245743a4a4cc119061925987cd52c 100644 (file)
@@ -334,12 +334,16 @@ static int make_choice(
 
         FOREACH_ARRAY(entry, de->entries, de->n_entries) {
                 unsigned found_tries_done = UINT_MAX, found_tries_left = UINT_MAX;
-                _cleanup_free_ char *chopped = NULL;
+                _cleanup_free_ char *dname = NULL;
                 size_t found_architecture_index = SIZE_MAX;
                 const char *e;
 
+                dname = strdup((*entry)->d_name);
+                if (!dname)
+                        return log_oom_debug();
+
                 if (!isempty(filter->basename)) {
-                        e = startswith((*entry)->d_name, filter->basename);
+                        e = startswith(dname, filter->basename);
                         if (!e)
                                 continue;
 
@@ -348,20 +352,14 @@ static int make_choice(
 
                         e++;
                 } else
-                        e = (*entry)->d_name;
+                        e = dname;
 
                 if (!isempty(filter->suffix)) {
-                        const char *sfx;
-
-                        sfx = endswith(e, filter->suffix);
+                        char *sfx = endswith(e, filter->suffix);
                         if (!sfx)
                                 continue;
 
-                        chopped = strndup(e, sfx - e);
-                        if (!chopped)
-                                return log_oom_debug();
-
-                        e = chopped;
+                        *sfx = 0;
                 }
 
                 if (FLAGS_SET(flags, PICK_TRIES)) {