Commit afce7deb by Tony Reix Committed by Ian Lance Taylor

* xcoff.c: Don't leak a file descriptor if an archive is malformed.

From-SVN: r250684
parent 9761988f
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> 2017-07-28 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* fileline.c (fileline_initialize): Print pid_t as long. * fileline.c (fileline_initialize): Print pid_t as long.
......
...@@ -1288,20 +1288,20 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor, ...@@ -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), if (!backtrace_get_view (state, descriptor, 0, sizeof (b_ar_fl_hdr),
error_callback, data, &view)) error_callback, data, &view))
return 0; goto fail;
memcpy (&fl_hdr, view.data, sizeof (b_ar_fl_hdr)); memcpy (&fl_hdr, view.data, sizeof (b_ar_fl_hdr));
backtrace_release_view (state, &view, error_callback, data); backtrace_release_view (state, &view, error_callback, data);
if (memcmp (fl_hdr.fl_magic, AIAMAGBIG, 8) != 0) if (memcmp (fl_hdr.fl_magic, AIAMAGBIG, 8) != 0)
return 0; goto fail;
memlen = strlen (member); memlen = strlen (member);
/* Read offset of first archive member. */ /* Read offset of first archive member. */
if (!xcoff_parse_decimal (fl_hdr.fl_fstmoff, sizeof fl_hdr.fl_fstmoff, &off)) if (!xcoff_parse_decimal (fl_hdr.fl_fstmoff, sizeof fl_hdr.fl_fstmoff, &off))
return 0; goto fail;
while (off != 0) while (off != 0)
{ {
/* Map archive member header and member name. */ /* Map archive member header and member name. */
...@@ -1309,7 +1309,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor, ...@@ -1309,7 +1309,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor,
if (!backtrace_get_view (state, descriptor, off, if (!backtrace_get_view (state, descriptor, off,
sizeof (b_ar_hdr) + memlen, sizeof (b_ar_hdr) + memlen,
error_callback, data, &view)) error_callback, data, &view))
return 0; break;
ar_hdr = (const b_ar_hdr *) view.data; ar_hdr = (const b_ar_hdr *) view.data;
...@@ -1345,6 +1345,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor, ...@@ -1345,6 +1345,7 @@ xcoff_armem_add (struct backtrace_state *state, int descriptor,
backtrace_release_view (state, &view, error_callback, data); backtrace_release_view (state, &view, error_callback, data);
} }
fail:
/* No matching member found. */ /* No matching member found. */
backtrace_close (descriptor, error_callback, data); backtrace_close (descriptor, error_callback, data);
return 0; return 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment