[PATCH] hpet: hpetcheck: fix a bug found by smatch

Keng-Yu Lin kengyu at canonical.com
Tue Jan 29 07:28:35 UTC 2013


On Wed, Jan 16, 2013 at 8:53 AM, Colin King <colin.king at canonical.com> wrote:
> From: Colin Ian King <colin.king at canonical.com>
>
> smatch found a bug that needs fixing:
>
> "hpet_check.c:88 hpet_parse_device_hpet() error:
> we previously assumed 'tmp_item' could be null (see line 81)"
>
> Re-work the HPET parsing so that we sanely handle tmp_item.
>
> Signed-off-by: Colin Ian King <colin.king at canonical.com>
> ---
>  src/hpet/hpet_check/hpet_check.c | 32 ++++++++++++++------------------
>  1 file changed, 14 insertions(+), 18 deletions(-)
>
> diff --git a/src/hpet/hpet_check/hpet_check.c b/src/hpet/hpet_check/hpet_check.c
> index 7709f88..8fe124a 100644
> --- a/src/hpet/hpet_check/hpet_check.c
> +++ b/src/hpet/hpet_check/hpet_check.c
> @@ -70,29 +70,25 @@ static void hpet_parse_device_hpet(fwts_framework *fw,
>         const char *table, fwts_list_link *item)
>  {
>         for (;item != NULL; item = item->next) {
> -               char *str = fwts_text_list_text(item);
> +               const char *str = fwts_text_list_text(item);
> +
>                 if ((strstr(str, "Name") != NULL) &&
> -                       (strstr(str, "ResourceTemplate") != NULL)) {
> +                   (strstr(str, "ResourceTemplate") != NULL)) {
>                         fwts_list_link *tmp_item = item->next;
>                         for (; tmp_item != NULL; tmp_item = tmp_item->next) {
> -                               if (strstr(fwts_text_list_text(tmp_item),
> -                                       "Memory32Fixed") != NULL) {
> -                                       tmp_item = tmp_item->next;
> -                                       if (tmp_item != NULL) {
> -                                               hpet_parse_check_base(fw, table, tmp_item);
> +                               const char *str = fwts_text_list_text(tmp_item);
> +
> +                               if (strstr(str, "Memory32Fixed") != NULL) {
> +                                       /* Next line contains base address */
> +                                       if (tmp_item->next != NULL) {
> +                                               hpet_parse_check_base(fw, table, tmp_item->next);
>                                                 return;
>                                         }
> -                               }
> -                               if (strstr(fwts_text_list_text(tmp_item),
> -                                       "DWordMemory") != NULL) {
> -                                       tmp_item = tmp_item->next;
> -                                       if (tmp_item != NULL) {
> -                                               tmp_item = tmp_item->next;
> -                                               if (tmp_item != NULL) {
> -                                                       /* HPET section is found, get base */
> -                                                       hpet_parse_check_base(fw, table, tmp_item);
> -                                                       return;
> -                                               }
> +                               } else if (strstr(str, "DWordMemory") != NULL) {
> +                                       if (tmp_item->next != NULL &&           /* Granularity */
> +                                           tmp_item->next->next != NULL) {     /* Base address */
> +                                               hpet_parse_check_base(fw, table, tmp_item->next->next);
> +                                               return;
>                                         }
>                                 }
>                         }
> --
> 1.8.0
>
Acked-by: Keng-Yu Lin <kengyu at canonical.com>



More information about the fwts-devel mailing list