From 4b26b13871a672059d1bdebbc4d87a4429c5abd8 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 15 Feb 2020 18:13:28 -0800 Subject: [PATCH] libbacktrace: support short read * read.c (backtrace_get_view): Support short read. --- libbacktrace/ChangeLog | 4 ++++ libbacktrace/read.c | 22 +++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index 277d7c01ff3..4b4f574fc75 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,3 +1,7 @@ +2020-05-09 Ian Lance Taylor + + * read.c (backtrace_get_view): Support short read. + 2020-05-09 Ian Lance Taylor * elf.c (elf_add): If debug sections are very large or far apart, diff --git a/libbacktrace/read.c b/libbacktrace/read.c index 57e4701bbeb..1a6052bf613 100644 --- a/libbacktrace/read.c +++ b/libbacktrace/read.c @@ -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); -- 2.30.2