mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-22 21:51:36 +08:00
libbacktrace: support short read
* read.c (backtrace_get_view): Support short read.
This commit is contained in:
parent
31ae7b863a
commit
4b26b13871
@ -1,3 +1,7 @@
|
||||
2020-05-09 Ian Lance Taylor <iant@golang.org>
|
||||
|
||||
* read.c (backtrace_get_view): Support short read.
|
||||
|
||||
2020-05-09 Ian Lance Taylor <iant@golang.org>
|
||||
|
||||
* elf.c (elf_add): If debug sections are very large or far apart,
|
||||
|
@ -50,7 +50,8 @@ backtrace_get_view (struct backtrace_state *state, int descriptor,
|
||||
backtrace_error_callback error_callback,
|
||||
void *data, struct backtrace_view *view)
|
||||
{
|
||||
ssize_t got;
|
||||
uint64_t got;
|
||||
ssize_t r;
|
||||
|
||||
if ((uint64_t) (size_t) size != size)
|
||||
{
|
||||
@ -70,15 +71,22 @@ backtrace_get_view (struct backtrace_state *state, int descriptor,
|
||||
view->data = view->base;
|
||||
view->len = size;
|
||||
|
||||
got = read (descriptor, view->base, size);
|
||||
if (got < 0)
|
||||
got = 0;
|
||||
while (got < size)
|
||||
{
|
||||
error_callback (data, "read", errno);
|
||||
free (view->base);
|
||||
return 0;
|
||||
r = read (descriptor, view->base, size - got);
|
||||
if (r < 0)
|
||||
{
|
||||
error_callback (data, "read", errno);
|
||||
free (view->base);
|
||||
return 0;
|
||||
}
|
||||
if (r == 0)
|
||||
break;
|
||||
got += (uint64_t) r;
|
||||
}
|
||||
|
||||
if ((size_t) got < size)
|
||||
if (got < size)
|
||||
{
|
||||
error_callback (data, "file too short", 0);
|
||||
free (view->base);
|
||||
|
Loading…
x
Reference in New Issue
Block a user