@@ -256,24 +256,19 @@ static bool task_overlay_load_desc(
256256 char overlay_desc_key [32 ];
257257 char overlay_key [64 ];
258258 char overlay [256 ];
259- char * tok , * save = NULL ;
260- unsigned list_size = 0 ;
261- char * elems [6 ] = {NULL , NULL , NULL , NULL , NULL , NULL };
262- char * overlay_cpy = NULL ;
263- float tmp_float = 0.0f ;
264- bool tmp_bool = false;
265- bool ret = true;
266- bool by_pixel = false;
267- const char * key = NULL ;
268- const char * x = NULL ;
269- const char * y = NULL ;
270- const char * box = NULL ;
271- config_file_t * conf = loader -> conf ;
272-
273- overlay_desc_key [0 ] =
274- overlay_key [0 ] =
275- conf_key [0 ] =
276- overlay [0 ] = '\0' ;
259+ unsigned list_size = 0 ;
260+ char * elems [6 ] = {NULL , NULL , NULL , NULL , NULL , NULL };
261+ char * tok , * save = NULL ;
262+ float tmp_float = 0.0f ;
263+ bool tmp_bool = false;
264+ bool by_pixel = false;
265+ const char * box = NULL ;
266+ config_file_t * conf = loader -> conf ;
267+
268+ overlay_desc_key [0 ] =
269+ overlay_key [0 ] =
270+ conf_key [0 ] =
271+ overlay [0 ] = '\0' ;
277272
278273 snprintf (overlay_desc_key , sizeof (overlay_desc_key ),
279274 "overlay%u_desc%u" , ol_idx , desc_idx );
@@ -297,53 +292,50 @@ static bool task_overlay_load_desc(
297292 return false;
298293 }
299294
300- overlay_cpy = strdup (overlay );
301- if (!overlay_cpy )
302- return false;
303-
304- /* Tokenize into elems array - pointers into
305- * overlay_cpy, no extra allocs */
306- for (tok = strtok_r (overlay_cpy , ", " , & save );
295+ /* Tokenize in-place — overlay[] is a local buffer,
296+ * no heap allocation needed */
297+ for (tok = strtok_r (overlay , ", " , & save );
307298 tok && list_size < 6 ;
308299 tok = strtok_r (NULL , ", " , & save ))
309300 elems [list_size ++ ] = tok ;
310301
311302 if (list_size < 6 )
312303 {
313304 RARCH_ERR ("[Overlay] Overlay desc is invalid. Requires at least 6 tokens.\n" );
314- free (overlay_cpy );
315305 return false;
316306 }
317307
318- key = elems [0 ];
319- x = elems [1 ];
320- y = elems [2 ];
308+ /* elems[0] (key) will be mutated by the button-parsing
309+ * strtok_r below, so read x/y/box from their own pointers
310+ * before that happens. They are separate tokens in the
311+ * buffer and won't be touched. */
321312 box = elems [3 ];
322313
323314 desc -> retro_key_idx = 0 ;
324315 BIT256_CLEAR_ALL (desc -> button_mask );
325316
326- if (string_is_equal (key , "analog_left" ))
317+ if (string_is_equal (elems [ 0 ] , "analog_left" ))
327318 desc -> type = OVERLAY_TYPE_ANALOG_LEFT ;
328- else if (string_is_equal (key , "analog_right" ))
319+ else if (string_is_equal (elems [ 0 ] , "analog_right" ))
329320 desc -> type = OVERLAY_TYPE_ANALOG_RIGHT ;
330- else if (string_is_equal (key , "dpad_area" ))
321+ else if (string_is_equal (elems [ 0 ] , "dpad_area" ))
331322 desc -> type = OVERLAY_TYPE_DPAD_AREA ;
332- else if (string_is_equal (key , "abxy_area" ))
323+ else if (string_is_equal (elems [ 0 ] , "abxy_area" ))
333324 desc -> type = OVERLAY_TYPE_ABXY_AREA ;
334- else if (strstr (key , "retrok_" ) == key )
325+ else if (strstr (elems [ 0 ] , "retrok_" ) == elems [ 0 ] )
335326 {
336327 desc -> type = OVERLAY_TYPE_KEYBOARD ;
337- desc -> retro_key_idx = input_config_translate_str_to_rk (key + 7 , strlen (key + 7 ));
328+ desc -> retro_key_idx = input_config_translate_str_to_rk (
329+ elems [0 ] + 7 , strlen (elems [0 ] + 7 ));
338330 }
339331 else
340332 {
341- char * save = NULL ;
342- const char * tmp = strtok_r (( char * ) key , "|" , & save );
333+ char * save2 = NULL ;
334+ const char * tmp = strtok_r (elems [ 0 ] , "|" , & save2 );
343335
344336 desc -> type = OVERLAY_TYPE_BUTTONS ;
345337
346- for (; tmp ; tmp = strtok_r (NULL , "|" , & save ))
338+ for (; tmp ; tmp = strtok_r (NULL , "|" , & save2 ))
347339 {
348340 if (!string_is_equal (tmp , "nul" ))
349341 {
@@ -385,8 +377,8 @@ static bool task_overlay_load_desc(
385377 height_mod /= height ;
386378 }
387379
388- desc -> x = (float )strtod (x , NULL ) * width_mod ;
389- desc -> y = (float )strtod (y , NULL ) * height_mod ;
380+ desc -> x = (float )strtod (elems [ 1 ] , NULL ) * width_mod ;
381+ desc -> y = (float )strtod (elems [ 2 ] , NULL ) * height_mod ;
390382 desc -> x_shift = desc -> x ;
391383 desc -> y_shift = desc -> y ;
392384
@@ -397,7 +389,6 @@ static bool task_overlay_load_desc(
397389 else
398390 {
399391 RARCH_ERR ("[Overlay] Hitbox type (%s) is invalid. Use \"radial\" or \"rect\".\n" , box );
400- free (overlay_cpy );
401392 return false;
402393 }
403394
@@ -408,7 +399,6 @@ static bool task_overlay_load_desc(
408399 if (desc -> hitbox != OVERLAY_HITBOX_RADIAL )
409400 {
410401 RARCH_ERR ("[Overlay] Analog hitbox type must be \"radial\".\n" );
411- free (overlay_cpy );
412402 return false;
413403 }
414404
@@ -432,9 +422,6 @@ static bool task_overlay_load_desc(
432422 desc -> range_x = (float )strtod (elems [4 ], NULL ) * width_mod ;
433423 desc -> range_y = (float )strtod (elems [5 ], NULL ) * height_mod ;
434424
435- /* Done with tokenized string */
436- free (overlay_cpy );
437-
438425 _len = strlcpy (conf_key , overlay_desc_key , sizeof (conf_key ));
439426
440427 strlcpy (conf_key + _len , "_reach_x" , sizeof (conf_key ) - _len );
@@ -828,32 +815,30 @@ static void task_overlay_deferred_load(retro_task_t *task)
828815 if (config_get_array (conf , overlay -> config .rect .key ,
829816 overlay -> config .rect .array , sizeof (overlay -> config .rect .array )))
830817 {
831- char * tok , * save = NULL ;
818+ char cfg_rect_buf [ 256 ] ;
832819 char * elems [4 ] = {NULL , NULL , NULL , NULL };
833820 unsigned list_size = 0 ;
834- char * cfg_rect_array_cpy = strdup ( overlay -> config . rect . array ) ;
821+ char * tok , * save = NULL ;
835822
836- if ( cfg_rect_array_cpy )
837- {
838- for ( tok = strtok_r ( cfg_rect_array_cpy , ", " , & save );
839- tok && list_size < 4 ;
840- tok = strtok_r ( NULL , ", " , & save ))
841- elems [ list_size ++ ] = tok ;
842- }
823+ strlcpy ( cfg_rect_buf , overlay -> config . rect . array ,
824+ sizeof ( cfg_rect_buf ));
825+
826+ for ( tok = strtok_r ( cfg_rect_buf , ", " , & save ) ;
827+ tok && list_size < 4 ;
828+ tok = strtok_r ( NULL , ", " , & save ))
829+ elems [ list_size ++ ] = tok ;
843830
844831 if (list_size < 4 )
845832 {
846833 RARCH_ERR ("[Overlay] Failed to split rect \"%s\" into at least four tokens.\n" ,
847834 overlay -> config .rect .array );
848- free (cfg_rect_array_cpy );
849835 goto error ;
850836 }
851837
852838 overlay -> x = (float )strtod (elems [0 ], NULL );
853839 overlay -> y = (float )strtod (elems [1 ], NULL );
854840 overlay -> w = (float )strtod (elems [2 ], NULL );
855841 overlay -> h = (float )strtod (elems [3 ], NULL );
856- free (cfg_rect_array_cpy );
857842 }
858843
859844 /* Assume for now that scaling center is in the middle.
@@ -867,19 +852,18 @@ static void task_overlay_deferred_load(retro_task_t *task)
867852 RARCH_LOG ("[Overlay] Checking for viewport key: %s\n" , conf_key );
868853 if (config_get_array (conf , conf_key , tmp_str , sizeof (tmp_str )))
869854 {
870- char * tok , * save = NULL ;
855+ char cfg_vp_buf [ 256 ] ;
871856 char * elems [4 ] = {NULL , NULL , NULL , NULL };
872857 unsigned list_size = 0 ;
873- char * cfg_vp_cpy = strdup ( tmp_str ) ;
858+ char * tok , * save = NULL ;
874859 RARCH_LOG ("[Overlay] Found viewport value: %s\n" , tmp_str );
875860
876- if (cfg_vp_cpy )
877- {
878- for (tok = strtok_r (cfg_vp_cpy , ", " , & save );
879- tok && list_size < 4 ;
880- tok = strtok_r (NULL , ", " , & save ))
881- elems [list_size ++ ] = tok ;
882- }
861+ strlcpy (cfg_vp_buf , tmp_str , sizeof (cfg_vp_buf ));
862+
863+ for (tok = strtok_r (cfg_vp_buf , ", " , & save );
864+ tok && list_size < 4 ;
865+ tok = strtok_r (NULL , ", " , & save ))
866+ elems [list_size ++ ] = tok ;
883867
884868 if (list_size >= 4 )
885869 {
@@ -894,8 +878,6 @@ static void task_overlay_deferred_load(retro_task_t *task)
894878 }
895879 else
896880 RARCH_WARN ("[Overlay] viewport \"%s\" requires four tokens.\n" , tmp_str );
897-
898- free (cfg_vp_cpy );
899881 }
900882
901883 /* Parse viewport_fill option (optional, default false) */
0 commit comments