libbacktrace: support short read

Fixes #32
This commit is contained in:
Ian Lance Taylor
2020-02-15 18:14:20 -08:00
parent aced4e1f2a
commit 4e14a008cd

22
read.c
View File

@@ -50,7 +50,8 @@ backtrace_get_view (struct backtrace_state *state, int descriptor,
backtrace_error_callback error_callback, backtrace_error_callback error_callback,
void *data, struct backtrace_view *view) void *data, struct backtrace_view *view)
{ {
ssize_t got; uint64_t got;
ssize_t r;
if ((uint64_t) (size_t) size != size) 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->data = view->base;
view->len = size; view->len = size;
got = read (descriptor, view->base, size); got = 0;
if (got < 0) while (got < size)
{ {
error_callback (data, "read", errno); r = read (descriptor, view->base, size - got);
free (view->base); if (r < 0)
return 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); error_callback (data, "file too short", 0);
free (view->base); free (view->base);