[parted-devel] [PATCH v2] mkpart: Allow negative start value when FS-TYPE is not given

Niklas Hambüchen mail at nh2.me
Fri May 11 20:09:05 BST 2018


The manual had long documented that negative values are
allowed for both start and end values, but until now negative
start values were rejected if FS-TYPE was not given.

Example:

  # parted --script -a optimal /dev/loop0 -- mklabel gpt mkpart primary ext4 -5MiB 100%
  (succeeds)

  # parted --script -a optimal /dev/loop0 -- mklabel gpt mkpart primary -5MiB 100%
  parted: invalid token: -5MiB
  Error: Expecting a file system type.

This commit fixes the latter error.
The issue was an insufficient lookahead in command line parsing,
looking only for digits when skipping over FS-TYPE.
The fix is including the minus '-' in the lookahead.

Originally reported as Debian bug #880035:

  "parted: fails to use negative start value for 'mkpart' command without specyfying FS-TYPE"
  https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=880035

Signed-off-by: Niklas Hambüchen <mail at nh2.me>
---
 NEWS                                 |  2 ++
 parted/parted.c                      |  2 +-
 tests/Makefile.am                    |  1 +
 tests/t0213-mkpart-start-negative.sh | 48 ++++++++++++++++++++++++++++++++++++
 4 files changed, 52 insertions(+), 1 deletion(-)
 create mode 100755 tests/t0213-mkpart-start-negative.sh

diff --git a/NEWS b/NEWS
index 5bc3051..2df5515 100644
--- a/NEWS
+++ b/NEWS
@@ -33,6 +33,8 @@ GNU parted NEWS                                    -*- outline -*-
   and a cylinder has a size which is power of 2, then such address
   does not trigger exact placement.
 
+  mkpart: Allow negative start value when FS-TYPE is not given
+
 * Noteworthy changes in release 3.2 (2014-07-28) [stable]
 
 ** New Features
diff --git a/parted/parted.c b/parted/parted.c
index b5e3b97..88f32b9 100644
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -682,7 +682,7 @@ do_mkpart (PedDevice** dev, PedDisk** diskp)
 
         peek_word = command_line_peek_word ();
         if (part_type == PED_PARTITION_EXTENDED
-            || (peek_word && isdigit (peek_word[0]))) {
+            || (peek_word && (isdigit (peek_word[0]) || peek_word[0] == '-'))) {
                 fs_type = NULL;
         } else {
                 if (!command_line_get_fs_type (_("File system type?"),
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a840304..3851983 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,6 +25,7 @@ TESTS = \
   t0210-gpt-resized-partition-entry-array.sh \
   t0211-gpt-rewrite-header.sh \
   t0212-gpt-many-partitions.sh \
+  t0213-mkpart-start-negative.sh \
   t0220-gpt-msftres.sh \
   t0250-gpt.sh \
   t0251-gpt-unicode.sh \
diff --git a/tests/t0213-mkpart-start-negative.sh b/tests/t0213-mkpart-start-negative.sh
new file mode 100755
index 0000000..182ef0c
--- /dev/null
+++ b/tests/t0213-mkpart-start-negative.sh
@@ -0,0 +1,48 @@
+#!/bin/sh
+# Make sure parted mkpart ends the partition one sector before the specified
+# value if end is specified with IEC units.
+
+# Copyright (C) 2011-2018 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../parted
+
+require_512_byte_sector_size_
+n_mbs=8
+dev=dev-file
+
+dd if=/dev/null of=$dev bs=1M seek=$n_mbs || fail=1
+# start negative, end positive
+parted --align=none -s $dev -- mklabel gpt mkpart p1 -7MiB 2MiB > err 2>&1 || fail=1
+compare /dev/null err || fail=1  # expect no output
+
+# start negative, end negative
+parted --align=none -s $dev -- mkpart p2 -6MiB -5MiB > err 2>&1 || fail=1
+compare /dev/null err || fail=1  # expect no output
+
+# check boundaries of the partitions
+parted -m -s $dev u s p > out || fail=1
+
+# prepare expected output
+cat <<EOF > exp || framework_failure
+1:2048s:4095s:2048s::p1:;
+2:4096s:6143s:2048s::p2:;
+EOF
+
+# compare expected and actual outputs
+sed -e "1,2d" out > k; mv k out
+compare exp out || fail=1
+
+Exit $fail
-- 
2.7.4




More information about the parted-devel mailing list