core: do not fail if ignorable img.v/ vpick dir is empty
authorLuca Boccassi <bluca@debian.org>
Thu, 12 Sep 2024 16:46:04 +0000 (18:46 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Wed, 13 Nov 2024 19:48:10 +0000 (19:48 +0000)
If the vpick directory is configured to be ignored if missing, do not
fail and just skip ahead.

Follow-up for 5e79dd96a88
Follow-up for 622efc544dc

(cherry picked from commit 00f546e25e8e46e5e289e1f2fc2ed3dcc6999223)

src/core/namespace.c
test/units/TEST-50-DISSECT.dissect.sh

index b92bb012eee313e4f41064708b6dce07928dc5af..77bca0b6f4f29f88e253a3205abe5f5e111225a1 100644 (file)
@@ -513,11 +513,15 @@ static int append_extensions(
                               &result);
                 if (r < 0)
                         return r;
-                if (!result.path)
+                if (!result.path) {
+                        if (m->ignore_enoent)
+                                continue;
+
                         return log_debug_errno(
                                         SYNTHETIC_ERRNO(ENOENT),
                                         "No matching entry in .v/ directory %s found.",
                                         m->source);
+                }
 
                 if (asprintf(&mount_point, "%s/%zu", extension_dir, i) < 0)
                         return -ENOMEM;
@@ -555,10 +559,6 @@ static int append_extensions(
                 const char *e = *extension_directory;
                 bool ignore_enoent = false;
 
-                /* Pick up the counter where the ExtensionImages left it. */
-                if (asprintf(&mount_point, "%s/%zu", extension_dir, n++) < 0)
-                        return -ENOMEM;
-
                 /* Look for any prefixes */
                 if (startswith(e, "-")) {
                         e++;
@@ -576,11 +576,18 @@ static int append_extensions(
                               &result);
                 if (r < 0)
                         return r;
-                if (!result.path)
+                if (!result.path) {
+                        if (ignore_enoent)
+                                continue;
+
                         return log_debug_errno(
                                         SYNTHETIC_ERRNO(ENOENT),
                                         "No matching entry in .v/ directory %s found.",
                                         e);
+                }
+                /* Pick up the counter where the ExtensionImages left it. */
+                if (asprintf(&mount_point, "%s/%zu", extension_dir, n++) < 0)
+                        return -ENOMEM;
 
                 for (size_t j = 0; hierarchies && hierarchies[j]; ++j) {
                         char *prefixed_hierarchy = path_join(mount_point, hierarchies[j]);
index 563206ce7e40ad216a8b9f4df50349ca99116f9d..6c79262c2dbdd1b3c422209611ae23944f4adcd7 100755 (executable)
@@ -443,14 +443,15 @@ systemctl is-active testservice-50e.service
 # Check vpick support in ExtensionImages=
 VBASE="vtest$RANDOM"
 VDIR="/tmp/$VBASE.v"
-mkdir "$VDIR"
+EMPTY_VDIR="/tmp/$VBASE-empty.v"
+mkdir "$VDIR" "$EMPTY_VDIR"
 
 ln -s /tmp/app0.raw "$VDIR/${VBASE}_0.raw"
 ln -s /tmp/app1.raw "$VDIR/${VBASE}_1.raw"
 
-systemd-run -P -p ExtensionImages="$VDIR" bash -c '/opt/script1.sh | grep ID'
+systemd-run -P -p ExtensionImages="$VDIR -$EMPTY_VDIR" bash -c '/opt/script1.sh | grep ID'
 
-rm -rf "$VDIR"
+rm -rf "$VDIR" "$EMPTY_VDIR"
 
 # ExtensionDirectories will set up an overlay
 mkdir -p "$IMAGE_DIR/app0" "$IMAGE_DIR/app1" "$IMAGE_DIR/app-nodistro" "$IMAGE_DIR/service-scoped-test"
@@ -529,14 +530,15 @@ systemctl is-active testservice-50f.service
 # Check vpick support in ExtensionDirectories=
 VBASE="vtest$RANDOM"
 VDIR="/tmp/$VBASE.v"
-mkdir "$VDIR"
+EMPTY_VDIR="/tmp/$VBASE-empty.v"
+mkdir "$VDIR" "$EMPTY_VDIR"
 
 ln -s "$IMAGE_DIR/app0" "$VDIR/${VBASE}_0"
 ln -s "$IMAGE_DIR/app1" "$VDIR/${VBASE}_1"
 
-systemd-run -P --property ExtensionDirectories="$VDIR" cat /opt/script1.sh | grep -q -F "extension-release.app2"
+systemd-run -P --property ExtensionDirectories="$VDIR -$EMPTY_VDIR" cat /opt/script1.sh | grep -q -F "extension-release.app2"
 
-rm -rf "$VDIR"
+rm -rf "$VDIR" "$EMPTY_VDIR"
 
 systemd-dissect --umount "$IMAGE_DIR/app0"
 systemd-dissect --umount "$IMAGE_DIR/app1"