]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
sysupdate: Check that --instances-max is in bounds
authorAdrian Vovk <adrianvovk@gmail.com>
Sat, 22 Jun 2024 00:49:48 +0000 (20:49 -0400)
committerAdrian Vovk <adrianvovk@gmail.com>
Thu, 22 Aug 2024 20:00:44 +0000 (16:00 -0400)
Otherwise user can pass in --instances-max=0 and crash sysupdate with an
assertion failure.

man/systemd-sysupdate.xml
src/sysupdate/sysupdate.c

index dffe835c04a0122a950b92bff786e446f922c5c6..f57a17b79ac608e7342bc130788e22312b73f329 100644 (file)
         <term><option>--instances-max=</option></term>
         <term><option>-m</option></term>
 
-        <listitem><para>Takes a decimal integer greater than or equal to 2. Controls how many versions to
-        keep at any time. This option may also be configured inside the transfer files, via the
-        <varname>InstancesMax=</varname> setting, see
+        <listitem><para>Takes a decimal integer greater than or equal to 2 while updating or 1 while vacuuming.
+        Controls how many versions to keep at any time. This option may also be configured inside the transfer
+        files, via the <varname>InstancesMax=</varname> setting, see
         <citerefentry><refentrytitle>sysupdate.d</refentrytitle><manvolnum>5</manvolnum></citerefentry> for
         details.</para>
 
index dee8348bdb8644f08d2a8c1a6c29c54c8c8d5085..585453542764f3eb95e86df402a576be33e44273 100644 (file)
@@ -1067,6 +1067,10 @@ static int verb_vacuum(int argc, char **argv, void *userdata) {
 
         assert(argc <= 1);
 
+        if (arg_instances_max < 1)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                      "The --instances-max argument must be >= 1 while vacuuming");
+
         r = process_image(/* ro= */ false, &mounted_dir, &loop_device);
         if (r < 0)
                 return r;
@@ -1090,6 +1094,10 @@ static int verb_update(int argc, char **argv, void *userdata) {
         assert(argc <= 2);
         version = argc >= 2 ? argv[1] : NULL;
 
+        if (arg_instances_max < 2)
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
+                                      "The --instances-max argument must be >= 2 while updating");
+
         if (arg_reboot) {
                 /* If automatic reboot on completion is requested, let's first determine the currently booted image */