[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