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; 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
