Am 17.07.2016 22:14, schrieb Guido Trentalancia:
> The following patch prevents fatal segmentation faults errors
> on strcpy() in the mheard tool when the result of ctime() is
> zero and it also avoids printing inconsistent log entries.
> 
> This second version includes revisions from Thomas Osterried
> and it is correctly based on code from the current git tree.
> 
> Signed-off-by: Guido Trentalancia <[email protected]>
> ---
>  ax25/mheard.c |   62 
> ++++++++++++++++++++++++++++++++++++++++------------------
>  1 file changed, 43 insertions(+), 19 deletions(-)
> 
> --- ax25-tools-git-17072016-2126/ax25/mheard.c        2016-07-17 
> 21:25:22.547557162 +0200
> +++ ax25-tools-git-17072016-2126-fix-mheard/ax25/mheard.c     2016-07-17 
> 22:05:19.925283229 +0200
> @@ -60,19 +60,25 @@ static void PrintHeader(int data)
>  
>  static void PrintPortEntry(struct PortRecord *pr, int data)
>  {
> -     char lh[30], fh[30], *call, *s;
> +     char lh[33], fh[33], *call, *s, *ctime_out;
>       char buffer[80];
> -     int i;
> +     int i, pkt_count;
>  
>       switch (data) {
>       case 0:
> -             strcpy(lh, ctime(&pr->entry.last_heard));
> -             lh[19] = 0;
> +             ctime_out = ctime(&pr->entry.last_heard);
> +             if (!ctime_out)
> +                     break;
> +             strcpy(lh, ctime_out);
> +             lh[32] = 0;
>               call =  ax25_ntoa(&pr->entry.from_call);
>               if ((s = strstr(call, "-0")) != NULL)
>                       *s = '\0';
> -             printf("%-9s  %-5s  %5d   %s\n",
> -                     call, pr->entry.portname, pr->entry.count, lh);
> +             pkt_count = pr->entry.count;
> +             if (!pkt_count)
> +                     break;
> +             printf("%-9s  %-5s  %5u   %s\n",
> +                     call, pr->entry.portname, pkt_count, lh);
>               break;

my i asc why you use strcpy/ctime in the first place ?
you can use strftime:

        tm=mktime(&pr->entry.last_heard);
        if (!tm)
           break;
        strftime(lh, sizeof(lh),"%Y-%m-%d %H:%M:%S",tm);


just my two cents,

re,
 wh

>       case 1:
>               buffer[0] = '\0';
> @@ -98,22 +104,31 @@ static void PrintPortEntry(struct PortRe
>                       buffer, pr->entry.portname);
>               break;
>       case 2:
> -             strcpy(lh, ctime(&pr->entry.last_heard));
> -             lh[19] = 0;
> -             strcpy(fh, ctime(&pr->entry.first_heard));
> -             fh[19] = 0;
> +             ctime_out = ctime(&pr->entry.last_heard);
> +             if (!ctime_out)
> +                     break;
> +             strcpy(lh, ctime_out);
> +             lh[32] = 0;
> +             ctime_out = ctime(&pr->entry.first_heard);
> +             if (!ctime_out)
> +                     break;
> +             strcpy(fh, ctime_out);
> +             fh[32] = 0;
>               call = ax25_ntoa(&pr->entry.from_call);
>               if ((s = strstr(call, "-0")) != NULL)
>                       *s = '\0';
> -             printf("%-9s  %-5s  %5d %5d %5d  %s  %s\n",
> +             printf("%-9s  %-5s  %5u %5u %5u  %s  %s\n",
>                       call, pr->entry.portname, pr->entry.iframes, 
> pr->entry.sframes, pr->entry.uframes, fh, lh);
>               break;
>       case 3:
>               call = ax25_ntoa(&pr->entry.from_call);
>               if ((s = strstr(call, "-0")) != NULL)
>                       *s = '\0';
> -             printf("%-9s  %-5s  %5d %5s ",
> -                     call, pr->entry.portname, pr->entry.count, 
> types[pr->entry.type]);
> +             pkt_count = pr->entry.count;
> +             if (!pkt_count)
> +                     break;  
> +             printf("%-9s  %-5s  %5u %5s ",
> +                     call, pr->entry.portname, pkt_count, 
> types[pr->entry.type]);
>               if (pr->entry.mode & MHEARD_MODE_ARP)
>                       printf(" ARP");
>               if (pr->entry.mode & MHEARD_MODE_FLEXNET)
> @@ -141,16 +156,25 @@ static void PrintPortEntry(struct PortRe
>               printf("\n");
>               break;
>       case 4:
> -             strcpy(lh, ctime(&pr->entry.last_heard));
> -             lh[19] = 0;
> -             strcpy(fh, ctime(&pr->entry.first_heard));
> -             fh[19] = 0;
> +             ctime_out = ctime(&pr->entry.last_heard);
> +             if (!ctime_out)
> +                     break;
> +             strcpy(lh, ctime_out);
> +             lh[32] = 0;
> +             ctime_out = ctime(&pr->entry.first_heard);
> +             if (!ctime_out)
> +                     break;
> +             strcpy(fh, ctime_out);
> +             fh[32] = 0;
>               call = ax25_ntoa(&pr->entry.from_call);
>               if ((s = strstr(call, "-0")) != NULL)
>                       *s = '\0';
> -             printf("%-9s  %-5s  %5d %5d %5d  %s  %s",
> +             pkt_count = pr->entry.count;
> +             if (!pkt_count)
> +                     break;
> +             printf("%-9s  %-5s  %5u %5u %5u  %s  %s",
>                       call, pr->entry.portname, pr->entry.iframes, 
> pr->entry.sframes, pr->entry.uframes, fh, lh);
> -             printf("%5d    %5s ", pr->entry.count, types[pr->entry.type]);
> +             printf("%5d    %5s ", pkt_count, types[pr->entry.type]);
>               if (pr->entry.mode & MHEARD_MODE_ARP)
>                       printf(" ARP      ");
>               if (pr->entry.mode & MHEARD_MODE_FLEXNET)
> --
> To unsubscribe from this list: send the line "unsubscribe linux-hams" in
> the body of a message to [email protected]
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-hams" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to