]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
importd: accept a single space as SHA256SUMS separator
authorLennart Poettering <lennart@poettering.net>
Tue, 19 Aug 2025 07:23:07 +0000 (09:23 +0200)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 19 Aug 2025 10:49:19 +0000 (11:49 +0100)
The SHA256SUMS files provided by https://images.linuxcontainers.org/
are slightly non-conforming, insted of using " *" or "  " as separator
between hash and file name they use " ". Let's accept that too, in the
interest of maximizing compatibility.

src/import/pull-common.c

index 40248eee3d89690e6c96b0fee5291e92af4ce9e3..6f1f042d916e64594117b9dcc9b6154b812b6189 100644 (file)
@@ -6,6 +6,7 @@
 #include "dirent-util.h"
 #include "escape.h"
 #include "fd-util.h"
+#include "hexdecoct.h"
 #include "io-util.h"
 #include "log.h"
 #include "memory-util.h"
@@ -333,7 +334,6 @@ int pull_make_verification_jobs(
 
 static int verify_one(PullJob *checksum_job, PullJob *job) {
         _cleanup_free_ char *fn = NULL;
-        const char *line, *p;
         int r;
 
         assert(checksum_job);
@@ -366,17 +366,23 @@ static int verify_one(PullJob *checksum_job, PullJob *job) {
                 return log_error_errno(SYNTHETIC_ERRNO(ELOOP),
                                        "Cannot verify checksum/signature files via themselves.");
 
-        line = strjoina(job->checksum, " *", fn, "\n"); /* string for binary mode */
-        p = memmem_safe(checksum_job->payload,
-                        checksum_job->payload_size,
-                        line,
-                        strlen(line));
-        if (!p) {
-                line = strjoina(job->checksum, "  ", fn, "\n"); /* string for text mode */
+        const char *p = NULL;
+        FOREACH_STRING(separator,
+                       " *", /* separator for binary mode */
+                       "  ", /* separator for text mode */
+                       " "   /* non-standard separator used by linuxcontainers.org */) {
+                _cleanup_free_ char *line = NULL;
+
+                line = strjoin(job->checksum, separator, fn, "\n");
+                if (!line)
+                        return log_oom();
+
                 p = memmem_safe(checksum_job->payload,
                                 checksum_job->payload_size,
                                 line,
                                 strlen(line));
+                if (p)
+                        break;
         }
 
         /* Only counts if found at beginning of a line */