Fix GDB crash with upstream GCC due to qsort(NULL, ...)
authorAndreas Arnez <arnez at linux dot vnet dot ibm dot com>
Tue, 12 Nov 2013 17:03:54 +0000 (18:03 +0100)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 12 Nov 2013 18:03:02 +0000 (19:03 +0100)
Upstream GCC's new pass '-fisolate-erroneous-paths' may introduce
traps at places where GCC has determined undefined behavior, e.g. when
passing a NULL pointer to a function that defines this argument as
__attribute__(__nonnull__(...)).  In particular this applies to
uniquify_strings(), because it invokes qsort() with NULL when the
'strings' vector is empty.  I hit this problem on s390x when trying to
execute "break main" on a C program.

gdb/
2013-11-12  Andreas Arnez  <arnez@linux.vnet.ibm.com>

* objc-lang.c (uniquify_strings): Prevent invoking qsort with
NULL.

gdb/ChangeLog
gdb/objc-lang.c

index 6541837..6ad4b49 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-12  Andreas Arnez  <arnez@linux.vnet.ibm.com>
+
+       * objc-lang.c (uniquify_strings): Prevent invoking qsort with
+       NULL.
+
 2013-11-12  Doug Evans  <dje@google.com>
 
        Work around gold/15646.
index 77a61ac..5c72340 100644 (file)
@@ -1056,6 +1056,11 @@ uniquify_strings (VEC (const_char_ptr) **strings)
   const char *elem, *last = NULL;
   int out;
 
+  /* If the vector is empty, there's nothing to do.  This explicit
+     check is needed to avoid invoking qsort with NULL. */
+  if (VEC_empty (const_char_ptr, *strings))
+    return;
+
   qsort (VEC_address (const_char_ptr, *strings),
         VEC_length (const_char_ptr, *strings),
         sizeof (const_char_ptr),