Skip to content

Commit 99ab671

Browse files
Merge pull request #625 from marckleinebudde/bcmserver-fix-buffer-overflow
bcmserver: fix buffer overflow
2 parents 44e6eb4 + a0aeaed commit 99ab671

1 file changed

Lines changed: 29 additions & 9 deletions

File tree

bcmserver.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ int main(void)
153153

154154
char buf[MAXLEN];
155155
char format[FORMATSZ];
156-
char rxmsg[50];
156+
char rxmsg[64];
157157

158158
#pragma GCC diagnostic push
159159
#pragma GCC diagnostic ignored "-Wpragmas"
@@ -234,32 +234,52 @@ int main(void)
234234
}
235235

236236
while (1) {
237-
237+
again:
238238
FD_ZERO(&readfds);
239239
FD_SET(sc, &readfds);
240240
FD_SET(sa, &readfds);
241241

242242
select((sc > sa)?sc+1:sa+1, &readfds, NULL, NULL, NULL);
243243

244244
if (FD_ISSET(sc, &readfds)) {
245+
size_t size = sizeof(rxmsg);
246+
int len = 0, res;
245247

246248
recvfrom(sc, &msg, sizeof(msg), 0,
247249
(struct sockaddr*)&caddr, &caddrlen);
248250

249251
ifr.ifr_ifindex = caddr.can_ifindex;
250252
ioctl(sc, SIOCGIFNAME, &ifr);
251253

252-
sprintf(rxmsg, "< %s %03X %d ", ifr.ifr_name,
253-
msg.msg_head.can_id, msg.frame.can_dlc);
254+
res = snprintf(rxmsg, size, "< %s %03X %d ", ifr.ifr_name,
255+
msg.msg_head.can_id, msg.frame.can_dlc);
256+
if (res < 0 || (size_t)res >= size) {
257+
printf("Error: rxmsg buffer (size %zu) too small for data.\n", size);
258+
continue;
259+
}
254260

255-
for ( i = 0; i < msg.frame.can_dlc; i++)
256-
sprintf(rxmsg + strlen(rxmsg), "%02X ",
257-
msg.frame.data[i]);
261+
len += res;
262+
263+
for (i = 0; i < msg.frame.can_dlc; i++) {
264+
res = snprintf(rxmsg + len, size - len, "%02X ", msg.frame.data[i]);
265+
if (res < 0 || (size_t)res >= (size - len)) {
266+
printf("Error: rxmsg buffer (size %zu) too small for data.\n", size);
267+
goto again;
268+
}
269+
270+
len += res;
271+
}
258272

259273
/* delimiter '\0' for Adobe(TM) Flash(TM) XML sockets */
260-
strcat(rxmsg, ">\0");
274+
res = snprintf(rxmsg + len, size - len, ">");
275+
if (res < 0 || (size_t)res >= (size - len)) {
276+
printf("Error: rxmsg buffer (size %zu) too small for data.\n", size);
277+
continue;
278+
}
279+
280+
len += res;
261281

262-
send(sa, rxmsg, strlen(rxmsg) + 1, 0);
282+
send(sa, rxmsg, len + 1, 0);
263283
}
264284

265285

0 commit comments

Comments
 (0)