[PATCH] lib: fix handling of -ve read returns
Colin King
colin.king at canonical.com
Mon Jul 14 13:22:50 UTC 2014
From: Colin Ian King <colin.king at canonical.com>
Coverity Scan 7.5.0 picked up two identical issues where
the -ve read returns were never being detected and so the
code was not going to handle EINTR or EAGAIN errors
correctly. Re-worked the code in both places to work
as intended.
Signed-off-by: Colin Ian King <colin.king at canonical.com>
---
src/lib/src/fwts_acpi_tables.c | 22 ++++++++++++++--------
src/lib/src/fwts_pipeio.c | 28 ++++++++++++++--------------
2 files changed, 28 insertions(+), 22 deletions(-)
diff --git a/src/lib/src/fwts_acpi_tables.c b/src/lib/src/fwts_acpi_tables.c
index 291c59d..343f849 100644
--- a/src/lib/src/fwts_acpi_tables.c
+++ b/src/lib/src/fwts_acpi_tables.c
@@ -598,26 +598,32 @@ static int fwts_acpi_load_tables_from_acpidump(fwts_framework *fw)
static uint8_t *fwts_acpi_load_table_from_file(const int fd, size_t *length)
{
uint8_t *ptr = NULL;
- ssize_t n;
size_t size = 0;
char buffer[4096];
*length = 0;
- while ((n = read(fd, buffer, sizeof(buffer))) > 0) {
+ for (;;) {
+ ssize_t n = read(fd, buffer, sizeof(buffer));
+ uint8_t *tmp;
+
+ if (n == 0)
+ break;
if (n < 0) {
if (errno != EINTR && errno != EAGAIN) {
fwts_low_free(ptr);
return NULL;
}
+ continue;
}
- else {
- ptr = (uint8_t*)fwts_low_realloc(ptr, size + n + 1);
- if (ptr == NULL)
- return NULL;
- memcpy(ptr + size, buffer, n);
- size += n;
+
+ if ((tmp = (uint8_t*)fwts_low_realloc(ptr, size + n + 1)) == NULL) {
+ free(ptr);
+ return NULL;
}
+ ptr = tmp;
+ memcpy(ptr + size, buffer, n);
+ size += n;
}
*length = size;
return ptr;
diff --git a/src/lib/src/fwts_pipeio.c b/src/lib/src/fwts_pipeio.c
index df07295..fe8e786 100644
--- a/src/lib/src/fwts_pipeio.c
+++ b/src/lib/src/fwts_pipeio.c
@@ -83,33 +83,33 @@ char *fwts_pipe_read(const int fd, ssize_t *length)
{
char *ptr = NULL;
char buffer[8192];
- ssize_t n;
ssize_t size = 0;
*length = 0;
ptr = NULL;
- while ((n = read(fd, buffer, sizeof(buffer))) > 0) {
+ for (;;) {
+ ssize_t n = read(fd, buffer, sizeof(buffer));
+ char *tmp;
+
+ if (n == 0)
+ break;
if (n < 0) {
if (errno != EINTR && errno != EAGAIN) {
free(ptr);
return NULL;
}
+ continue;
}
- else {
- char *new_ptr;
-
- new_ptr = realloc(ptr, size + n + 1);
- if (new_ptr == NULL) {
- free(ptr);
- return NULL;
- } else
- ptr = new_ptr;
- memcpy(ptr + size, buffer, n);
- size += n;
- *(ptr+size) = 0;
+ if ((tmp = realloc(ptr, size + n + 1)) == NULL) {
+ free(ptr);
+ return NULL;
}
+ ptr = tmp;
+ memcpy(ptr + size, buffer, n);
+ size += n;
+ *(ptr+size) = 0;
}
*length = size;
return ptr;
--
2.0.1
More information about the fwts-devel
mailing list