* xcoff.c: Don't leak a file descriptor if an archive is malformed.
authorTony Reix <tony.reix@atos.net>
Fri, 28 Jul 2017 18:52:13 +0000 (18:52 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 28 Jul 2017 18:52:13 +0000 (18:52 +0000)
From-SVN: r250684

libbacktrace/ChangeLog
libbacktrace/xcoff.c

index c60f714aa20dc63e0632479477f2945132885a1d..313a4c61855e9b354178ef389c49d0c3335a81fc 100644 (file)
@@ -1,3 +1,7 @@
+2017-07-28  Tony Reix  <tony.reix@atos.net>
+
+       * xcoff.c: Don't leak a file descriptor if an archive is malformed.
+
 2017-07-28  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * fileline.c (fileline_initialize): Print pid_t as long.
index 76210733f015bd1691a99102cc07554c247681ff..2faa9fdfa05b13ec1728eb9f8e04bb182fcd1289 100644 (file)
@@ -1288,20 +1288,20 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor,
 
   if (!backtrace_get_view (state, descriptor, 0, sizeof (b_ar_fl_hdr),
                           error_callback, data, &view))
-    return 0;
+    goto fail;
 
   memcpy (&fl_hdr, view.data, sizeof (b_ar_fl_hdr));
 
   backtrace_release_view (state, &view, error_callback, data);
 
   if (memcmp (fl_hdr.fl_magic, AIAMAGBIG, 8) != 0)
-    return 0;
+    goto fail;
 
   memlen = strlen (member);
 
   /* Read offset of first archive member.  */
   if (!xcoff_parse_decimal (fl_hdr.fl_fstmoff, sizeof fl_hdr.fl_fstmoff, &off))
-    return 0;
+    goto fail;
   while (off != 0)
     {
       /* Map archive member header and member name.  */
@@ -1309,7 +1309,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor,
       if (!backtrace_get_view (state, descriptor, off,
                               sizeof (b_ar_hdr) + memlen,
                               error_callback, data, &view))
-       return 0;
+       break;
 
       ar_hdr = (const b_ar_hdr *) view.data;
 
@@ -1345,6 +1345,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor,
       backtrace_release_view (state, &view, error_callback, data);
     }
 
+ fail:
   /* No matching member found.  */
   backtrace_close (descriptor, error_callback, data);
   return 0;