isotpsniffer: Fix error handling

pull/169/head
Stefan Tatschner 2019-11-14 12:56:39 +01:00
parent ecf80e8f91
commit b04108c615
1 changed files with 39 additions and 22 deletions

View File

@ -176,10 +176,11 @@ void printbuf(unsigned char *buffer, int nbytes, int color, int timestamp,
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
fd_set rdfs; fd_set rdfs;
int s, t; int s = 0, t = 0;
struct sockaddr_can addr; struct sockaddr_can addr;
char if_name[IFNAMSIZ]; char if_name[IFNAMSIZ];
static struct can_isotp_options opts; static struct can_isotp_options opts;
int r = 0;
int opt, quit = 0; int opt, quit = 0;
int color = 0; int color = 0;
int head = 0; int head = 0;
@ -241,35 +242,37 @@ int main(int argc, char **argv)
case '?': case '?':
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(0); goto out;
break;
default: default:
fprintf(stderr, "Unknown option %c\n", opt); fprintf(stderr, "Unknown option %c\n", opt);
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); goto out;
break;
} }
} }
if ((argc - optind) != 1 || src == NO_CAN_ID || dst == NO_CAN_ID) { if ((argc - optind) != 1 || src == NO_CAN_ID || dst == NO_CAN_ID) {
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); r = 1;
goto out;
} }
if ((opts.flags & CAN_ISOTP_RX_EXT_ADDR) && (!(opts.flags & CAN_ISOTP_EXTEND_ADDR))) { if ((opts.flags & CAN_ISOTP_RX_EXT_ADDR) && (!(opts.flags & CAN_ISOTP_EXTEND_ADDR))) {
print_usage(basename(argv[0])); print_usage(basename(argv[0]));
exit(1); r = 1;
goto out;
} }
if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) { if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
perror("socket"); perror("socket");
exit(1); r = 1;
goto out;
} }
if ((t = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) { if ((t = socket(PF_CAN, SOCK_DGRAM, CAN_ISOTP)) < 0) {
perror("socket"); perror("socket");
exit(1); r = 1;
goto out;
} }
opts.flags |= CAN_ISOTP_LISTEN_MODE; opts.flags |= CAN_ISOTP_LISTEN_MODE;
@ -287,8 +290,8 @@ int main(int argc, char **argv)
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) { if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind"); perror("bind");
close(s); r = 1;
exit(1); goto out;
} }
if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) { if (opts.flags & CAN_ISOTP_RX_EXT_ADDR) {
@ -300,15 +303,19 @@ int main(int argc, char **argv)
opts.rx_ext_address = tmpext; opts.rx_ext_address = tmpext;
} }
setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts)); if ((setsockopt(t, SOL_CAN_ISOTP, CAN_ISOTP_OPTS, &opts, sizeof(opts))) < 0) {
perror("setsockopt");
r = 1;
goto out;
}
addr.can_addr.tp.tx_id = dst; addr.can_addr.tp.tx_id = dst;
addr.can_addr.tp.rx_id = src; addr.can_addr.tp.rx_id = src;
if (bind(t, (struct sockaddr *)&addr, sizeof(addr)) < 0) { if (bind(t, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
perror("bind"); perror("bind");
close(s); r = 1;
exit(1); goto out;
} }
while (!quit) { while (!quit) {
@ -333,10 +340,13 @@ int main(int argc, char **argv)
nbytes = read(s, buffer, 4096); nbytes = read(s, buffer, 4096);
if (nbytes < 0) { if (nbytes < 0) {
perror("read socket s"); perror("read socket s");
return -1; r = 1;
goto out;
}
if (nbytes > 4095) {
r = 1;
goto out;
} }
if (nbytes > 4095)
return -1;
printbuf(buffer, nbytes, color?2:0, timestamp, format, printbuf(buffer, nbytes, color?2:0, timestamp, format,
&tv, &last_tv, dst, s, if_name, head); &tv, &last_tv, dst, s, if_name, head);
} }
@ -345,16 +355,23 @@ int main(int argc, char **argv)
nbytes = read(t, buffer, 4096); nbytes = read(t, buffer, 4096);
if (nbytes < 0) { if (nbytes < 0) {
perror("read socket t"); perror("read socket t");
return -1; r = 1;
goto out;
}
if (nbytes > 4095) {
r = 1;
goto out;
} }
if (nbytes > 4095)
return -1;
printbuf(buffer, nbytes, color?1:0, timestamp, format, printbuf(buffer, nbytes, color?1:0, timestamp, format,
&tv, &last_tv, src, t, if_name, head); &tv, &last_tv, src, t, if_name, head);
} }
} }
close(s); out:
if (s)
close(s);
if (t)
close(t);
return 0; return r;
} }