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