]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: (script) don't use sector size if not specified
authorKarel Zak <kzak@redhat.com>
Wed, 12 Aug 2020 13:59:38 +0000 (15:59 +0200)
committerKarel Zak <kzak@redhat.com>
Fri, 13 Nov 2020 10:48:07 +0000 (11:48 +0100)
This is probably bad script API use, but better be safe than sorry.

Signed-off-by: Karel Zak <kzak@redhat.com>
libfdisk/src/script.c

index 82619b9c7667a222e7e950acd598735e5de1d44a..8f3c137a524e5ba1e1b407415634ff433253eac4 100644 (file)
@@ -1028,8 +1028,13 @@ static int parse_line_nameval(struct fdisk_script *dp, char *s)
                        p += 6;
                        rc = next_number(&p, &num, &pow);
                        if (!rc) {
-                               if (pow)        /* specified as <num><suffix> */
+                               if (pow) {      /* specified as <num><suffix> */
+                                       if (!dp->cxt->sector_size) {
+                                               rc = -EINVAL;
+                                               break;
+                                       }
                                        num /= dp->cxt->sector_size;
+                               }
                                fdisk_partition_set_start(pa, num);
                                fdisk_partition_start_follow_default(pa, 0);
                        }
@@ -1039,9 +1044,13 @@ static int parse_line_nameval(struct fdisk_script *dp, char *s)
                        p += 5;
                        rc = next_number(&p, &num, &pow);
                        if (!rc) {
-                               if (pow)        /* specified as <num><suffix> */
+                               if (pow) {      /* specified as <num><suffix> */
+                                       if (!dp->cxt->sector_size) {
+                                               rc = -EINVAL;
+                                               break;
+                                       }
                                        num /= dp->cxt->sector_size;
-                               else            /* specified as number of sectors */
+                               } else          /* specified as number of sectors */
                                        fdisk_partition_size_explicit(pa, 1);
                                fdisk_partition_set_size(pa, num);
                                fdisk_partition_end_follow_default(pa, 0);
@@ -1155,8 +1164,13 @@ static int parse_line_valcommas(struct fdisk_script *dp, char *s)
 
                                rc = next_number(&p, &num, &pow);
                                if (!rc) {
-                                       if (pow)        /* specified as <num><suffix> */
+                                       if (pow) {      /* specified as <num><suffix> */
+                                               if (!dp->cxt->sector_size) {
+                                                       rc = -EINVAL;
+                                                       break;
+                                               }
                                                num /= dp->cxt->sector_size;
+                                       }
                                        fdisk_partition_set_start(pa, num);
                                        pa->movestart = sign == TK_MINUS ? FDISK_MOVE_DOWN :
                                                        sign == TK_PLUS  ? FDISK_MOVE_UP :
@@ -1175,9 +1189,13 @@ static int parse_line_valcommas(struct fdisk_script *dp, char *s)
                                int pow = 0;
                                rc = next_number(&p, &num, &pow);
                                if (!rc) {
-                                       if (pow) /* specified as <size><suffix> */
+                                       if (pow) { /* specified as <size><suffix> */
+                                               if (!dp->cxt->sector_size) {
+                                                       rc = -EINVAL;
+                                                       break;
+                                               }
                                                num /= dp->cxt->sector_size;
-                                       else     /* specified as number of sectors */
+                                       } else   /* specified as number of sectors */
                                                fdisk_partition_size_explicit(pa, 1);
                                        fdisk_partition_set_size(pa, num);
                                        pa->resize = sign == TK_MINUS ? FDISK_RESIZE_REDUCE :