Author: cem
Date: Sat Apr 13 16:51:48 2019
New Revision: 346187
URL: https://svnweb.freebsd.org/changeset/base/346187

Log:
  hexdump(1): Exit gracefully on format strings missing conversion
  
  PR:           237263
  Submitted by: Bojan Petrovic <bojan_petrovic AT fastmail.fm>

Modified:
  head/usr.bin/hexdump/hexdump.h
  head/usr.bin/hexdump/parse.c
  head/usr.bin/hexdump/tests/hexdump_test.sh

Modified: head/usr.bin/hexdump/hexdump.h
==============================================================================
--- head/usr.bin/hexdump/hexdump.h      Sat Apr 13 13:59:01 2019        
(r346186)
+++ head/usr.bin/hexdump/hexdump.h      Sat Apr 13 16:51:48 2019        
(r346187)
@@ -88,6 +88,7 @@ void   addfile(const char *);
 void    badcnt(const char *);
 void    badconv(const char *);
 void    badfmt(const char *);
+void    badnoconv(void);
 void    badsfmt(void);
 void    bpad(PR *);
 void    conv_c(PR *, u_char *, size_t);

Modified: head/usr.bin/hexdump/parse.c
==============================================================================
--- head/usr.bin/hexdump/parse.c        Sat Apr 13 13:59:01 2019        
(r346186)
+++ head/usr.bin/hexdump/parse.c        Sat Apr 13 16:51:48 2019        
(r346187)
@@ -169,7 +169,10 @@ size(FS *fs)
                         * skip any special chars -- save precision in
                         * case it's a %s format.
                         */
-                       while (strchr(spec + 1, *++fmt));
+                       while (*++fmt != 0 && strchr(spec + 1, *fmt) != NULL)
+                               ;
+                       if (*fmt == 0)
+                               badnoconv();
                        if (*fmt == '.' && isdigit(*++fmt)) {
                                prec = atoi(fmt);
                                while (isdigit(*++fmt));
@@ -241,10 +244,16 @@ rewrite(FS *fs)
                        if (fu->bcnt) {
                                sokay = USEBCNT;
                                /* Skip to conversion character. */
-                               for (++p1; strchr(spec, *p1); ++p1);
+                               while (*++p1 != 0 && strchr(spec, *p1) != NULL)
+                                       ;
+                               if (*p1 == 0)
+                                       badnoconv();
                        } else {
                                /* Skip any special chars, field width. */
-                               while (strchr(spec + 1, *++p1));
+                               while (*++p1 != 0 && strchr(spec + 1, *p1) != 
NULL)
+                                       ;
+                               if (*p1 == 0)
+                                       badnoconv();
                                if (*p1 == '.' && isdigit(*++p1)) {
                                        sokay = USEPREC;
                                        prec = atoi(p1);
@@ -511,4 +520,10 @@ void
 badconv(const char *ch)
 {
        errx(1, "%%%s: bad conversion character", ch);
+}
+
+void
+badnoconv(void)
+{
+       errx(1, "missing conversion character");
 }

Modified: head/usr.bin/hexdump/tests/hexdump_test.sh
==============================================================================
--- head/usr.bin/hexdump/tests/hexdump_test.sh  Sat Apr 13 13:59:01 2019        
(r346186)
+++ head/usr.bin/hexdump/tests/hexdump_test.sh  Sat Apr 13 16:51:48 2019        
(r346187)
@@ -176,6 +176,19 @@ x_flag_body()
            hexdump -x "$(atf_get_srcdir)/d_hexdump_c.in"
 }
 
+atf_test_case no_conv_err
+no_conv_err()
+{
+       atf_set "descr" "Verify missing conversion char error handling"
+}
+no_conv_err_body()
+{
+       atf_check -s exit:1 -e ignore \
+           hexdump -e '"%"'
+       atf_check -s exit:1 -e ignore \
+           hexdump -e '4/2 "%"'
+}
+
 atf_init_test_cases()
 {
        atf_add_test_case b_flag
@@ -188,4 +201,5 @@ atf_init_test_cases()
        atf_add_test_case s_flag
        atf_add_test_case v_flag
        atf_add_test_case x_flag
+       atf_add_test_case no_conv_err
 }


_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to