Commit 17112570 by Tom de Vries Committed by Tom de Vries

[libbacktrace] Factor out read_string

Factor out new function read_string in dwarf.c.

Bootstrapped and reg-tested on x86_64.

2018-11-21  Tom de Vries  <tdevries@suse.de>

	* dwarf.c (read_string): Factor out of ...
	(read_attribute, read_line_header, read_line_program): ... here.

From-SVN: r266339
parent 25baeeb3
2018-11-21 Tom de Vries <tdevries@suse.de>
* dwarf.c (read_string): Factor out of ...
(read_attribute, read_line_header, read_line_program): ... here.
2018-10-31 Joseph Myers <joseph@codesourcery.com> 2018-10-31 Joseph Myers <joseph@codesourcery.com>
PR bootstrap/82856 PR bootstrap/82856
......
...@@ -411,6 +411,25 @@ advance (struct dwarf_buf *buf, size_t count) ...@@ -411,6 +411,25 @@ advance (struct dwarf_buf *buf, size_t count)
return 1; return 1;
} }
/* Read one zero-terminated string from BUF and advance past the string. */
static const char *
read_string (struct dwarf_buf *buf)
{
const char *p = (const char *)buf->buf;
size_t len = strnlen (p, buf->left);
/* - If len == left, we ran out of buffer before finding the zero terminator.
Generate an error by advancing len + 1.
- If len < left, advance by len + 1 to skip past the zero terminator. */
size_t count = len + 1;
if (!advance (buf, count))
return NULL;
return p;
}
/* Read one byte from BUF and advance 1 byte. */ /* Read one byte from BUF and advance 1 byte. */
static unsigned char static unsigned char
...@@ -694,8 +713,8 @@ read_attribute (enum dwarf_form form, struct dwarf_buf *buf, ...@@ -694,8 +713,8 @@ read_attribute (enum dwarf_form form, struct dwarf_buf *buf,
return 1; return 1;
case DW_FORM_string: case DW_FORM_string:
val->encoding = ATTR_VAL_STRING; val->encoding = ATTR_VAL_STRING;
val->u.string = (const char *) buf->buf; val->u.string = read_string (buf);
return advance (buf, strnlen ((const char *) buf->buf, buf->left) + 1); return val->u.string == NULL ? 0 : 1;
case DW_FORM_block: case DW_FORM_block:
val->encoding = ATTR_VAL_BLOCK; val->encoding = ATTR_VAL_BLOCK;
return advance (buf, read_uleb128 (buf)); return advance (buf, read_uleb128 (buf));
...@@ -1649,11 +1668,10 @@ read_line_header (struct backtrace_state *state, struct unit *u, ...@@ -1649,11 +1668,10 @@ read_line_header (struct backtrace_state *state, struct unit *u,
if (hdr_buf.reported_underflow) if (hdr_buf.reported_underflow)
return 0; return 0;
hdr->dirs[i] = (const char *) hdr_buf.buf; hdr->dirs[i] = read_string (&hdr_buf);
++i; if (hdr->dirs[i] == NULL)
if (!advance (&hdr_buf,
strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
return 0; return 0;
++i;
} }
if (!advance (&hdr_buf, 1)) if (!advance (&hdr_buf, 1))
return 0; return 0;
...@@ -1687,9 +1705,8 @@ read_line_header (struct backtrace_state *state, struct unit *u, ...@@ -1687,9 +1705,8 @@ read_line_header (struct backtrace_state *state, struct unit *u,
if (hdr_buf.reported_underflow) if (hdr_buf.reported_underflow)
return 0; return 0;
filename = (const char *) hdr_buf.buf; filename = read_string (&hdr_buf);
if (!advance (&hdr_buf, if (filename == NULL)
strnlen ((const char *) hdr_buf.buf, hdr_buf.left) + 1))
return 0; return 0;
dir_index = read_uleb128 (&hdr_buf); dir_index = read_uleb128 (&hdr_buf);
if (IS_ABSOLUTE_PATH (filename) if (IS_ABSOLUTE_PATH (filename)
...@@ -1808,8 +1825,8 @@ read_line_program (struct backtrace_state *state, struct dwarf_data *ddata, ...@@ -1808,8 +1825,8 @@ read_line_program (struct backtrace_state *state, struct dwarf_data *ddata,
const char *f; const char *f;
unsigned int dir_index; unsigned int dir_index;
f = (const char *) line_buf->buf; f = read_string (line_buf);
if (!advance (line_buf, strnlen (f, line_buf->left) + 1)) if (f == NULL)
return 0; return 0;
dir_index = read_uleb128 (line_buf); dir_index = read_uleb128 (line_buf);
/* Ignore that time and length. */ /* Ignore that time and length. */
......
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