From 85c24fe2b11cd136d43bbffd983014a3f967c25e Mon Sep 17 00:00:00 2001 From: Ondrej Oprala Date: Fri, 21 Dec 2012 13:04:04 +0100 Subject: [PATCH 2/3] hexdump: do not segfault when iterating over an empty format string Signed-off-by: Ondrej Oprala --- tests/commands.sh | 1 + tests/expected/hexdump/empty-format | 1 + tests/ts/hexdump/empty-format | 26 ++++++++++++++++++++++++++ text-utils/parse.c | 16 +++++++++------- 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 tests/expected/hexdump/empty-format create mode 100755 tests/ts/hexdump/empty-format diff --git a/tests/commands.sh b/tests/commands.sh index db1d4ac..3672095 100644 --- a/tests/commands.sh +++ b/tests/commands.sh @@ -62,3 +62,4 @@ TS_CMD_FINDMNT=${TS_CMD_FINDMNT-"$top_builddir/findmnt"} TS_CMD_FDISK=${TS_CMD_FDISK-"$top_builddir/fdisk"} +TS_CMD_HEXDUMP=${TS_CMD_HEXDUMP-"$top_builddir/hexdump"} diff --git a/tests/expected/hexdump/empty-format b/tests/expected/hexdump/empty-format new file mode 100644 index 0000000..9d60796 --- /dev/null +++ b/tests/expected/hexdump/empty-format @@ -0,0 +1 @@ +11 \ No newline at end of file diff --git a/tests/ts/hexdump/empty-format b/tests/ts/hexdump/empty-format new file mode 100755 index 0000000..4a3e528 --- /dev/null +++ b/tests/ts/hexdump/empty-format @@ -0,0 +1,26 @@ +#!/bin/bash + +# This file is part of util-linux. +# +# This file 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 2 of the License, or +# (at your option) any later version. +# +# This file 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. +# +TS_TOPDIR="$(dirname $0)/../.." +TS_DESC="format-strings" + +. $TS_TOPDIR/functions.sh +ts_init "$*" + +INPUT=$(printf \\1) +$TS_CMD_HEXDUMP -n1 -ve '2 "" "%x"' <<< $INPUT 2>&1 >> $TS_OUTPUT + +$TS_CMD_HEXDUMP -n1 -ve '4 "%x"' -e '2 ""' <<< $INPUT 2>&1 >> $TS_OUTPUT + +ts_finalize diff --git a/text-utils/parse.c b/text-utils/parse.c index 5f1e2bd..bd96961 100644 --- a/text-utils/parse.c +++ b/text-utils/parse.c @@ -421,13 +421,15 @@ isint2: switch(fu->bcnt) { !(fu->flags&F_SETREP) && fu->bcnt) fu->reps += (blocksize - fs->bcnt) / fu->bcnt; if (fu->reps > 1) { - for (pr = fu->nextpr;; pr = pr->nextpr) - if (!pr->nextpr) - break; - for (p1 = pr->fmt, p2 = NULL; *p1; ++p1) - p2 = isspace((unsigned char)*p1) ? p1 : NULL; - if (p2) - pr->nospace = p2; + if (fu->nextpr) { + for (pr = fu->nextpr; ; pr = pr->nextpr) + if (!pr->nextpr) + break; + for (p1 = pr->fmt, p2 = NULL; *p1; ++p1) + p2 = isspace((unsigned char)*p1) ? p1 : NULL; + if (p2) + pr->nospace = p2; + } } } } -- 1.8.1