aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2011-11-18 02:47:35 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2011-11-18 02:47:35 +0100
commita0bef7cc276476e69e2496e728bf97b32d3b561d (patch)
treedfd921a5ea67c5c72d246d35342914272e1703c7
parent860491c5251886c40d6dfb89723f392db3a397a9 (diff)
downloadbusybox-w32-a0bef7cc276476e69e2496e728bf97b32d3b561d.tar.gz
busybox-w32-a0bef7cc276476e69e2496e728bf97b32d3b561d.tar.bz2
busybox-w32-a0bef7cc276476e69e2496e728bf97b32d3b561d.zip
hexdump: fix hexdump -n1 -ve '8/2 ""' SEGV. Closes 4478
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--libbb/dump.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/libbb/dump.c b/libbb/dump.c
index 919fe135c..7e435643b 100644
--- a/libbb/dump.c
+++ b/libbb/dump.c
@@ -71,7 +71,8 @@ static NOINLINE int bb_dump_size(FS *fs)
71 * skip any special chars -- save precision in 71 * skip any special chars -- save precision in
72 * case it's a %s format. 72 * case it's a %s format.
73 */ 73 */
74 while (strchr(index_str + 1, *++fmt)); 74 while (strchr(index_str + 1, *++fmt))
75 continue;
75 if (*fmt == '.' && isdigit(*++fmt)) { 76 if (*fmt == '.' && isdigit(*++fmt)) {
76 prec = atoi(fmt); 77 prec = atoi(fmt);
77 while (isdigit(*++fmt)) 78 while (isdigit(*++fmt))
@@ -99,8 +100,8 @@ static NOINLINE int bb_dump_size(FS *fs)
99static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs) 100static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
100{ 101{
101 enum { NOTOKAY, USEBCNT, USEPREC } sokay; 102 enum { NOTOKAY, USEBCNT, USEPREC } sokay;
102 PR *pr;
103 FU *fu; 103 FU *fu;
104 PR *pr;
104 char *p1, *p2, *p3; 105 char *p1, *p2, *p3;
105 char savech, *fmtp; 106 char savech, *fmtp;
106 const char *byte_count_str; 107 const char *byte_count_str;
@@ -292,16 +293,18 @@ static NOINLINE void rewrite(priv_dumper_t *dumper, FS *fs)
292 * interprets any data at all, and has no iteration count, 293 * interprets any data at all, and has no iteration count,
293 * repeat it as necessary. 294 * repeat it as necessary.
294 * 295 *
295 * if, rep count is greater than 1, no trailing whitespace 296 * if rep count is greater than 1, no trailing whitespace
296 * gets output from the last iteration of the format unit. 297 * gets output from the last iteration of the format unit.
297 */ 298 */
298 for (fu = fs->nextfu; fu; fu = fu->nextfu) { 299 for (fu = fs->nextfu; fu; fu = fu->nextfu) {
299 if (!fu->nextfu && fs->bcnt < dumper->blocksize 300 if (!fu->nextfu
300 && !(fu->flags & F_SETREP) && fu->bcnt 301 && fs->bcnt < dumper->blocksize
302 && !(fu->flags & F_SETREP)
303 && fu->bcnt
301 ) { 304 ) {
302 fu->reps += (dumper->blocksize - fs->bcnt) / fu->bcnt; 305 fu->reps += (dumper->blocksize - fs->bcnt) / fu->bcnt;
303 } 306 }
304 if (fu->reps > 1) { 307 if (fu->reps > 1 && fu->nextpr) {
305 for (pr = fu->nextpr;; pr = pr->nextpr) 308 for (pr = fu->nextpr;; pr = pr->nextpr)
306 if (!pr->nextpr) 309 if (!pr->nextpr)
307 break; 310 break;
@@ -721,7 +724,7 @@ void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt)
721 p = fmt; 724 p = fmt;
722 for (;;) { 725 for (;;) {
723 p = skip_whitespace(p); 726 p = skip_whitespace(p);
724 if (!*p) { 727 if (*p == '\0') {
725 break; 728 break;
726 } 729 }
727 730
@@ -749,7 +752,7 @@ void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt)
749 752
750 /* skip slash and trailing white space */ 753 /* skip slash and trailing white space */
751 if (*p == '/') { 754 if (*p == '/') {
752 p = skip_whitespace(++p); 755 p = skip_whitespace(p + 1);
753 } 756 }
754 757
755 /* byte count */ 758 /* byte count */
@@ -763,7 +766,7 @@ void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt)
763 } 766 }
764 tfu->bcnt = atoi(savep); 767 tfu->bcnt = atoi(savep);
765 /* skip trailing white space */ 768 /* skip trailing white space */
766 p = skip_whitespace(++p); 769 p = skip_whitespace(p + 1);
767 } 770 }
768 771
769 /* format */ 772 /* format */
@@ -771,7 +774,7 @@ void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt)
771 bb_error_msg_and_die("bad format {%s}", fmt); 774 bb_error_msg_and_die("bad format {%s}", fmt);
772 } 775 }
773 for (savep = ++p; *p != '"';) { 776 for (savep = ++p; *p != '"';) {
774 if (*p++ == 0) { 777 if (*p++ == '\0') {
775 bb_error_msg_and_die("bad format {%s}", fmt); 778 bb_error_msg_and_die("bad format {%s}", fmt);
776 } 779 }
777 } 780 }
@@ -782,7 +785,7 @@ void FAST_FUNC bb_dump_add(dumper_t* pub_dumper, const char *fmt)
782 785
783 /* alphabetic escape sequences have to be done in place */ 786 /* alphabetic escape sequences have to be done in place */
784 for (p2 = p1;; ++p1, ++p2) { 787 for (p2 = p1;; ++p1, ++p2) {
785 if (!*p1) { 788 if (*p1 == '\0') {
786 *p2 = *p1; 789 *p2 = *p1;
787 break; 790 break;
788 } 791 }