Skip to content

Commit 44e6eb4

Browse files
Merge pull request #624 from marckleinebudde/canerrsim-fix-buffer-overflow
canerrsim: main(): avoid buffer overflow: check length of interface name
2 parents 1520ab5 + 9e44407 commit 44e6eb4

1 file changed

Lines changed: 18 additions & 19 deletions

File tree

canerrsim.c

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <linux/can/error.h>
2626
#include <linux/can/raw.h>
2727
#include <net/if.h>
28+
#include <stdarg.h>
2829
#include <stdbool.h>
2930
#include <stdint.h>
3031
#include <stdio.h>
@@ -122,27 +123,25 @@ void show_help_and_exit()
122123
exit(EXIT_SUCCESS);
123124
}
124125

125-
void err_exit(const char *msg)
126+
void __attribute__((format (printf, 1, 2))) err_exit(const char *format, ...)
126127
{
127-
printf("%s", msg);
128-
exit(EXIT_FAILURE);
129-
}
128+
va_list ap;
130129

131-
void show_custom_format_and_exit(const char *param, const char *format)
132-
{
133-
char str_buf[80];
134-
sprintf(str_buf, format, param);
135-
err_exit(str_buf);
130+
va_start(ap, format);
131+
vfprintf(stdout, format, ap);
132+
va_end(ap);
133+
134+
exit(EXIT_FAILURE);
136135
}
137136

138137
void show_invalid_option(const char *option)
139138
{
140-
show_custom_format_and_exit(option, "Error: Invalid option %s\n");
139+
err_exit("Error: Invalid option %s\n", option);
141140
}
142141

143142
void show_err_and_exit(const char *err_type)
144143
{
145-
show_custom_format_and_exit(err_type, "Error: You can only have one %s parameter!\n");
144+
err_exit("Error: You can only have one %s parameter!\n", err_type);
146145
}
147146

148147
void show_loc_err_and_exit()
@@ -176,7 +175,6 @@ int main(int argc, char *argv[])
176175
struct ifreq ifr;
177176
struct can_frame frame;
178177
bool show_bits = false, location_processed = false, transceiver_processed = false, arbitration_processed = false;
179-
char tmp_str[256];
180178

181179
printf("CAN Sockets Error Messages Simulator\n");
182180
if (argc < 3)
@@ -537,24 +535,25 @@ int main(int argc, char *argv[])
537535

538536
// create socket
539537
if ((sock = socket(PF_CAN, SOCK_RAW, CAN_RAW)) < 0)
540-
err_exit("Error while opening socket");
538+
err_exit("Error while opening socket\n");
541539

542540
// set interface name
541+
if (strlen(argv[1]) >= IFNAMSIZ)
542+
err_exit("Name of CAN device '%s' is too long!\n\n", argv[1]);
543+
543544
strcpy(ifr.ifr_name, argv[1]); // can0, vcan0...
544-
if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
545-
sprintf(tmp_str, "Error setting CAN interface name %s", argv[1]);
546-
err_exit(tmp_str);
547-
}
545+
if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0)
546+
err_exit("Error setting CAN interface name %s\n", argv[1]);
548547

549548
// bind socket to the CAN interface
550549
addr.can_family = AF_CAN;
551550
addr.can_ifindex = ifr.ifr_ifindex;
552551
if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
553-
err_exit("Error in socket bind");
552+
err_exit("Error in socket bind\n");
554553

555554
// Send CAN error frame
556555
if (write(sock, &frame, sizeof(frame)) < 0)
557-
err_exit("Error writing to socket");
556+
err_exit("Error writing to socket\n");
558557
else
559558
printf("CAN error frame sent\n");
560559

0 commit comments

Comments
 (0)