Blame SOURCES/CVE-2017-18201.patch

ed96f6
From e73a8bb23a4405b32cc7708771833f6c4e6b2426 Mon Sep 17 00:00:00 2001
ed96f6
From: "R. Bernstein" <rocky@gnu.org>
ed96f6
Date: Tue, 26 Sep 2017 16:29:15 -0400
ed96f6
Subject: [PATCH] handle bad iso 9660 better. Fixes bug #52091
ed96f6
ed96f6
src/iso-info.c: reflect errors in getting information back in exit code
ed96f6
lib/iso9660_fs.c: bail when we there is bad stat info for a directory
ed96f6
              change interface to report failure
ed96f6
src/util.h: bump copyright
ed96f6
test/data/bad-dir.iso: bad ISO 9660
ed96f6
test/check_bad_iso.sh: test program
ed96f6
test/check_iso.sh.in: expect nonzero RC on failures
ed96f6
---
ed96f6
 lib/iso9660/iso9660_fs.c |   6 +++++-
ed96f6
 src/iso-info.c           |  27 +++++++++++++++++----------
ed96f6
 src/util.c               |   4 ++--
ed96f6
 test/Makefile.am         |   3 ++-
ed96f6
 test/check_bad_iso.sh    |  46 ++++++++++++++++++++++++++++++++++++++++++++++
ed96f6
 test/check_iso.sh.in     |  19 ++++++++++++-------
ed96f6
 test/data/Makefile.am    |   1 +
ed96f6
 test/data/bad-dir.iso    | Bin 0 -> 49152 bytes
ed96f6
 8 files changed, 85 insertions(+), 21 deletions(-)
ed96f6
 create mode 100755 test/check_bad_iso.sh
ed96f6
 create mode 100644 test/data/bad-dir.iso
ed96f6
ed96f6
diff --git a/lib/iso9660/iso9660_fs.c b/lib/iso9660/iso9660_fs.c
ed96f6
index 8758a234..d3fb4069 100644
ed96f6
--- a/lib/iso9660/iso9660_fs.c
ed96f6
+++ b/lib/iso9660/iso9660_fs.c
ed96f6
@@ -1,5 +1,5 @@
ed96f6
 /*
ed96f6
-  Copyright (C) 2003-2008, 2011-2013 Rocky Bernstein <rocky@gnu.org>
ed96f6
+  Copyright (C) 2003-2008, 2011-2015, 2017 Rocky Bernstein <rocky@gnu.org>
ed96f6
   Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
ed96f6
 
ed96f6
   This program is free software: you can redistribute it and/or modify
ed96f6
@@ -1394,6 +1394,10 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
ed96f6
 
ed96f6
 	if (p_iso9660_stat)
ed96f6
 	  _cdio_list_append (retval, p_iso9660_stat);
ed96f6
+	else {
ed96f6
+	  cdio_warn("Invalid directory stat at offset %lu", (unsigned long)offset);
ed96f6
+	  break;
ed96f6
+	}
ed96f6
 
ed96f6
 	offset += iso9660_get_dir_len(p_iso9660_dir);
ed96f6
       }
ed96f6
diff --git a/src/iso-info.c b/src/iso-info.c
ed96f6
index 212ab335..b8a360e0 100644
ed96f6
--- a/src/iso-info.c
ed96f6
+++ b/src/iso-info.c
ed96f6
@@ -1,5 +1,6 @@
ed96f6
 /*
ed96f6
-  Copyright (C) 2004-2006, 2008, 2012-2013 Rocky Bernstein <rocky@gnu.org>
ed96f6
+  Copyright (C) 2004-2006, 2008, 2012-2014, 2017 Rocky Bernstein
ed96f6
+  <rocky@gnu.org>
ed96f6
 
ed96f6
   This program is free software: you can redistribute it and/or modify
ed96f6
   it under the terms of the GNU General Public License as published by
ed96f6
@@ -212,7 +213,7 @@ _log_handler (cdio_log_level_t level, const char message[])
ed96f6
   gl_default_cdio_log_handler (level, message);
ed96f6
 }
ed96f6
 
ed96f6
-static void
ed96f6
+static int
ed96f6
 print_iso9660_recurse (iso9660_t *p_iso, const char psz_path[])
ed96f6
 {
ed96f6
   CdioList_t *entlist;
ed96f6
@@ -222,6 +223,7 @@ print_iso9660_recurse (iso9660_t *p_iso, const char psz_path[])
ed96f6
   char *translated_name = (char *) malloc(4096);
ed96f6
   size_t translated_name_size = 4096;
ed96f6
   entlist = iso9660_ifs_readdir (p_iso, psz_path);
ed96f6
+  int rc = 0;
ed96f6
 
ed96f6
   if (opts.print_iso9660) {
ed96f6
     printf ("%s:\n", psz_path);
ed96f6
@@ -231,7 +233,7 @@ print_iso9660_recurse (iso9660_t *p_iso, const char psz_path[])
ed96f6
     free(translated_name);
ed96f6
     free(dirlist);
ed96f6
     report( stderr, "Error getting above directory information\n" );
ed96f6
-    return;
ed96f6
+    return 1;
ed96f6
   }
ed96f6
 
ed96f6
   /* Iterate over files in this directory */
ed96f6
@@ -241,13 +243,16 @@ print_iso9660_recurse (iso9660_t *p_iso, const char psz_path[])
ed96f6
       iso9660_stat_t *p_statbuf = _cdio_list_node_data (entnode);
ed96f6
       char *psz_iso_name = p_statbuf->filename;
ed96f6
       char _fullname[4096] = { 0, };
ed96f6
-       if (strlen(psz_iso_name) >= translated_name_size) {
ed96f6
+      if (strlen(psz_iso_name) == 0)
ed96f6
+	continue;
ed96f6
+
ed96f6
+      if (strlen(psz_iso_name) >= translated_name_size) {
ed96f6
          translated_name_size = strlen(psz_iso_name)+1;
ed96f6
          free(translated_name);
ed96f6
          translated_name = (char *) malloc(translated_name_size);
ed96f6
          if (!translated_name) {
ed96f6
            report( stderr, "Error allocating memory\n" );
ed96f6
-           return;
ed96f6
+           return 2;
ed96f6
          }
ed96f6
        }
ed96f6
 
ed96f6
@@ -297,16 +302,17 @@ print_iso9660_recurse (iso9660_t *p_iso, const char psz_path[])
ed96f6
     {
ed96f6
       char *_fullname = _cdio_list_node_data (entnode);
ed96f6
 
ed96f6
-      print_iso9660_recurse (p_iso, _fullname);
ed96f6
+      rc += print_iso9660_recurse (p_iso, _fullname);
ed96f6
     }
ed96f6
 
ed96f6
   _cdio_list_free (dirlist, true);
ed96f6
+  return rc;
ed96f6
 }
ed96f6
 
ed96f6
-static void
ed96f6
+static int
ed96f6
 print_iso9660_fs (iso9660_t *iso)
ed96f6
 {
ed96f6
-  print_iso9660_recurse (iso, "/");
ed96f6
+  return print_iso9660_recurse (iso, "/");
ed96f6
 }
ed96f6
 
ed96f6
 static void
ed96f6
@@ -429,6 +435,7 @@ main(int argc, char *argv[])
ed96f6
 
ed96f6
   iso9660_t           *p_iso=NULL;
ed96f6
   iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
ed96f6
+  int rc = EXIT_SUCCESS;
ed96f6
 
ed96f6
   init();
ed96f6
 
ed96f6
@@ -498,7 +505,7 @@ main(int argc, char *argv[])
ed96f6
           printf("Note: both -f and -l options given -- "
ed96f6
                  "-l (long listing) takes precidence\n");
ed96f6
       }
ed96f6
-      print_iso9660_fs(p_iso);
ed96f6
+      rc = print_iso9660_fs(p_iso);
ed96f6
   } else if (opts.print_udf) {
ed96f6
       print_udf_fs();
ed96f6
   }
ed96f6
@@ -508,5 +515,5 @@ main(int argc, char *argv[])
ed96f6
   iso9660_close(p_iso);
ed96f6
   /* Not reached:*/
ed96f6
   free(program_name);
ed96f6
-  return(EXIT_SUCCESS);
ed96f6
+  return(rc);
ed96f6
 }
ed96f6
diff --git a/src/util.c b/src/util.c
ed96f6
index 4062ee2a..ad44a97c 100644
ed96f6
--- a/src/util.c
ed96f6
+++ b/src/util.c
ed96f6
@@ -1,5 +1,5 @@
ed96f6
 /*
ed96f6
-  Copyright (C) 2003-2010, 2012-2013 Rocky Bernstein <rocky@gnu.org>
ed96f6
+  Copyright (C) 2003-2010, 2012-2014, 2017 Rocky Bernstein <rocky@gnu.org>
ed96f6
 
ed96f6
   This program is free software: you can redistribute it and/or modify
ed96f6
   it under the terms of the GNU General Public License as published by
ed96f6
@@ -56,7 +56,7 @@ print_version (char *program_name, const char *version,
ed96f6
   if (no_header == 0) {
ed96f6
     report( stdout,
ed96f6
 	    "%s version %s\n"
ed96f6
-	    "Copyright (c) 2003-2005, 2007-2008, 2011-2013 "
ed96f6
+	    "Copyright (c) 2003-2005, 2007-2008, 2011-2015, 2017 "
ed96f6
 	    "R. Bernstein\n",
ed96f6
 	    program_name, version);
ed96f6
     report( stdout,
ed96f6
diff --git a/test/Makefile.am b/test/Makefile.am
ed96f6
index a2c57de2..cd370745 100644
ed96f6
--- a/test/Makefile.am
ed96f6
+++ b/test/Makefile.am
ed96f6
@@ -47,7 +47,8 @@ test_lib_driver_util_CFLAGS   = -DDATA_DIR=\"$(DATA_DIR)\"
ed96f6
 testpregap_CFLAGS   = -DDATA_DIR=\"$(DATA_DIR)\"
ed96f6
 
ed96f6
 check_SCRIPTS = check_nrg.sh  check_cue.sh  check_cd_read.sh check_udf.sh \
ed96f6
-                check_iso.sh  check_fuzzyiso.sh check_opts.sh \
ed96f6
+                check_iso.sh  check_bad_iso.sh \
ed96f6
+	        check_fuzzyiso.sh check_opts.sh \
ed96f6
 		check_iso_read.sh
ed96f6
 
ed96f6
 check_udf.sh: @abs_top_builddir@/example/extract$(EXEEXT)
ed96f6
diff --git a/test/check_bad_iso.sh b/test/check_bad_iso.sh
ed96f6
new file mode 100755
ed96f6
index 00000000..1ca3b6ca
ed96f6
--- /dev/null
ed96f6
+++ b/test/check_bad_iso.sh
ed96f6
@@ -0,0 +1,46 @@
ed96f6
+#!/bin/sh
ed96f6
+
ed96f6
+if test "X$abs_top_srcdir" = "X" ; then
ed96f6
+  abs_top_srcdir=/src/external-vcs/savannah/libcdio
ed96f6
+fi
ed96f6
+
ed96f6
+if test -z $srcdir ; then
ed96f6
+  srcdir=$(pwd)
ed96f6
+fi
ed96f6
+
ed96f6
+if test "X$top_builddir" = "X" ; then
ed96f6
+  top_builddir=$(pwd)/..
ed96f6
+fi
ed96f6
+
ed96f6
+. ${top_builddir}/test/check_common_fn
ed96f6
+
ed96f6
+if test ! -x ../src/iso-info ; then
ed96f6
+  exit 77
ed96f6
+fi
ed96f6
+
ed96f6
+BASE=$(basename $0 .sh)
ed96f6
+fname=bad-dir
ed96f6
+
ed96f6
+RC=0
ed96f6
+
ed96f6
+opts="--quiet ${abs_top_srcdir}/test/data/${fname}.iso"
ed96f6
+cmdname=iso-info
ed96f6
+cmd=../src/iso-info
ed96f6
+if ! "${cmd}" --no-header ${opts} 2>&1 ; then
ed96f6
+    echo "$0: unexpected failure"
ed96f6
+    RC=1
ed96f6
+fi
ed96f6
+
ed96f6
+opts="--quiet ${abs_top_srcdir}/test/data/${fname}.iso --iso9660"
ed96f6
+if "${cmd}" --no-header ${opts} 2>&1 ; then
ed96f6
+    ((RC+=1))
ed96f6
+else
ed96f6
+    echo "$0: expected failure"
ed96f6
+fi
ed96f6
+
ed96f6
+exit $RC
ed96f6
+
ed96f6
+#;;; Local Variables: ***
ed96f6
+#;;; mode:shell-script ***
ed96f6
+#;;; eval: (sh-set-shell "bash") ***
ed96f6
+#;;; End: ***
ed96f6
diff --git a/test/check_iso.sh.in b/test/check_iso.sh.in
ed96f6
index c3e219b8..7ccf82cf 100755
ed96f6
--- a/test/check_iso.sh.in
ed96f6
+++ b/test/check_iso.sh.in
ed96f6
@@ -1,11 +1,11 @@
ed96f6
-#!/bin/sh
ed96f6
+#!@SHELL@
ed96f6
 
ed96f6
 if test -z $srcdir ; then
ed96f6
-  srcdir=`pwd`
ed96f6
+  srcdir=$(pwd)
ed96f6
 fi
ed96f6
 
ed96f6
 if test "X$top_builddir" = "X" ; then
ed96f6
-  top_builddir=`pwd`/..
ed96f6
+  top_builddir=$(pwd)/..
ed96f6
 fi
ed96f6
 
ed96f6
 . ${top_builddir}/test/check_common_fn
ed96f6
@@ -14,7 +14,7 @@ if test ! -x ../src/iso-info@EXEEXT@ ; then
ed96f6
   exit 77
ed96f6
 fi
ed96f6
 
ed96f6
-BASE=`basename $0 .sh`
ed96f6
+BASE=$(basename $0 .sh)
ed96f6
 fname=copying
ed96f6
 
ed96f6
 opts="--quiet ${srcdir}/data/${fname}.iso --iso9660 "
ed96f6
@@ -46,7 +46,7 @@ if test -n "@HAVE_ROCK@"; then
ed96f6
 fi
ed96f6
 
ed96f6
 if test -n "@HAVE_JOLIET@" ; then
ed96f6
-  BASE=`basename $0 .sh`
ed96f6
+  BASE=$(basename $0 .sh)
ed96f6
   fname=joliet
ed96f6
   opts="--quiet ${srcdir}/data/${fname}.iso --iso9660 "
ed96f6
   test_iso_info  "$opts" ${fname}-nojoliet.dump ${srcdir}/${fname}.right
ed96f6
 
ed96f6
 
ed96f6
diff --git a/test/data/Makefile.am b/test/data/Makefile.am
ed96f6
index 5e913cf9..1b8a5655 100644
ed96f6
--- a/test/data/Makefile.am
ed96f6
+++ b/test/data/Makefile.am
ed96f6
@@ -5,6 +5,7 @@ check_DATA = \
ed96f6
 	bad-cat2.toc   \
ed96f6
 	bad-cat3.cue   \
ed96f6
 	bad-cat3.toc   \
ed96f6
+	bad-dir.iso    \
ed96f6
 	bad-file.toc   \
ed96f6
 	bad-mode1.cue  \
ed96f6
 	bad-mode1.toc  \