[PATCH] lib: fix handling of -ve read returns
Keng-Yu Lin
keng-yu.lin at canonical.com
Thu Jul 24 04:27:09 UTC 2014
On Mon, Jul 14, 2014 at 9:22 PM, Colin King <colin.king at canonical.com> wrote:
> 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
>
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>
More information about the fwts-devel
mailing list