From 3fe1c42bbfcb712f763fdb97c9b2666aec583ab0 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Mon, 9 Mar 2026 12:18:03 +0100 Subject: [PATCH 1/4] canerrsim: err_exit(): add support for printf style formats --- canerrsim.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/canerrsim.c b/canerrsim.c index 8d3d5ef..280acf6 100644 --- a/canerrsim.c +++ b/canerrsim.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -122,9 +123,14 @@ void show_help_and_exit() exit(EXIT_SUCCESS); } -void err_exit(const char *msg) +void __attribute__((format (printf, 1, 2))) err_exit(const char *format, ...) { - printf("%s", msg); + va_list ap; + + va_start(ap, format); + vfprintf(stdout, format, ap); + va_end(ap); + exit(EXIT_FAILURE); } @@ -132,7 +138,7 @@ void show_custom_format_and_exit(const char *param, const char *format) { char str_buf[80]; sprintf(str_buf, format, param); - err_exit(str_buf); + err_exit("%s", str_buf); } void show_invalid_option(const char *option) From 7e8e247b2fdd1b46dd1b81e93523aa3509fb6d2f Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Mon, 9 Mar 2026 12:20:50 +0100 Subject: [PATCH 2/4] canerrsim: convert from show_custom_format_and_exit() to err_exit() --- canerrsim.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/canerrsim.c b/canerrsim.c index 280acf6..8c6caf3 100644 --- a/canerrsim.c +++ b/canerrsim.c @@ -134,21 +134,14 @@ void __attribute__((format (printf, 1, 2))) err_exit(const char *format, ...) exit(EXIT_FAILURE); } -void show_custom_format_and_exit(const char *param, const char *format) -{ - char str_buf[80]; - sprintf(str_buf, format, param); - err_exit("%s", str_buf); -} - void show_invalid_option(const char *option) { - show_custom_format_and_exit(option, "Error: Invalid option %s\n"); + err_exit("Error: Invalid option %s\n", option); } void show_err_and_exit(const char *err_type) { - show_custom_format_and_exit(err_type, "Error: You can only have one %s parameter!\n"); + err_exit("Error: You can only have one %s parameter!\n", err_type); } void show_loc_err_and_exit() @@ -182,7 +175,6 @@ int main(int argc, char *argv[]) struct ifreq ifr; struct can_frame frame; bool show_bits = false, location_processed = false, transceiver_processed = false, arbitration_processed = false; - char tmp_str[256]; printf("CAN Sockets Error Messages Simulator\n"); if (argc < 3) @@ -547,10 +539,8 @@ int main(int argc, char *argv[]) // set interface name strcpy(ifr.ifr_name, argv[1]); // can0, vcan0... - if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) { - sprintf(tmp_str, "Error setting CAN interface name %s", argv[1]); - err_exit(tmp_str); - } + if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) + err_exit("Error setting CAN interface name %s\n", argv[1]); // bind socket to the CAN interface addr.can_family = AF_CAN; From 9d4f3c82a2d3b11bac038a9bab6fe911cb268b20 Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Mon, 9 Mar 2026 12:21:33 +0100 Subject: [PATCH 3/4] canerrsim: add missing \n at end of error messages --- canerrsim.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/canerrsim.c b/canerrsim.c index 8c6caf3..60055dd 100644 --- a/canerrsim.c +++ b/canerrsim.c @@ -535,7 +535,7 @@ int main(int argc, char *argv[]) // create socket if ((sock = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0) - err_exit("Error while opening socket"); + err_exit("Error while opening socket\n"); // set interface name strcpy(ifr.ifr_name, argv[1]); // can0, vcan0... @@ -546,11 +546,11 @@ int main(int argc, char *argv[]) addr.can_family = AF_CAN; addr.can_ifindex = ifr.ifr_ifindex; if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) - err_exit("Error in socket bind"); + err_exit("Error in socket bind\n"); // Send CAN error frame if (write(sock, &frame, sizeof(frame)) < 0) - err_exit("Error writing to socket"); + err_exit("Error writing to socket\n"); else printf("CAN error frame sent\n"); From 9e444073b15b4c981b40dfae47bfbc2bf2c8fe8a Mon Sep 17 00:00:00 2001 From: Marc Kleine-Budde Date: Mon, 9 Mar 2026 12:21:51 +0100 Subject: [PATCH 4/4] canerrsim: main(): avoid buffer overflow: check length of interface name Closes: https://github.com/linux-can/can-utils/issues/623 --- canerrsim.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/canerrsim.c b/canerrsim.c index 60055dd..07f4ee1 100644 --- a/canerrsim.c +++ b/canerrsim.c @@ -538,6 +538,9 @@ int main(int argc, char *argv[]) err_exit("Error while opening socket\n"); // set interface name + if (strlen(argv[1]) >= IFNAMSIZ) + err_exit("Name of CAN device '%s' is too long!\n\n", argv[1]); + strcpy(ifr.ifr_name, argv[1]); // can0, vcan0... if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) err_exit("Error setting CAN interface name %s\n", argv[1]);