@@ -219,24 +219,30 @@ void retro_main_log_file_deinit(void)
219219#if !defined(HAVE_LOGGER )
220220void RARCH_LOG_V (const char * tag , const char * fmt , va_list ap )
221221{
222- #if defined(_XBOX1 ) || defined (__WINRT__ )
223- /* FIXME: Using arbitrary string as fmt argument is unsafe. */
224- char msg_new [256 ];
222+ #if defined(_XBOX1 ) || defined(__WINRT__ )
225223 char buffer [256 ];
224+ int prefix_len ;
226225 const char * tag_v = tag ? tag : FILE_PATH_LOG_INFO ;
226+ buffer [0 ] = '\0' ;
227+ prefix_len = snprintf (buffer , sizeof (buffer ),
228+ "%s: %s " , FILE_PATH_PROGRAM_NAME , tag_v );
227229
228- msg_new [0 ] = buffer [0 ] = '\0' ;
229- snprintf (msg_new , sizeof (msg_new ), "%s: %s %s" ,
230- FILE_PATH_PROGRAM_NAME , tag_v , fmt );
230+ if (prefix_len > 0 && prefix_len < (int )sizeof (buffer ))
231+ {
231232#if defined(__WINRT__ )
232- vsnprintf (buffer , sizeof (buffer ), msg_new , ap );
233+ vsnprintf (buffer + prefix_len ,
234+ sizeof (buffer ) - (size_t )prefix_len , fmt , ap );
233235#else
234- wvsprintf (buffer , msg_new , ap );
236+ wvsprintf (buffer + prefix_len , fmt , ap );
235237#endif
238+ }
239+
236240 OutputDebugStringA (buffer );
241+
237242#elif defined(ANDROID )
238243 verbosity_state_t * g_verbosity = & main_verbosity_st ;
239- int prio = ANDROID_LOG_INFO ;
244+ int prio = ANDROID_LOG_INFO ;
245+
240246 if (tag )
241247 {
242248 if (string_is_equal (FILE_PATH_LOG_WARN , tag ))
@@ -252,105 +258,148 @@ void RARCH_LOG_V(const char *tag, const char *fmt, va_list ap)
252258 }
253259 else
254260 __android_log_vprint (prio , FILE_PATH_PROGRAM_NAME , fmt , ap );
261+
255262#else
256- verbosity_state_t * g_verbosity = & main_verbosity_st ;
257- FILE * fp = (FILE * )g_verbosity -> fp ;
258- const char * tag_v = tag ? tag : FILE_PATH_LOG_INFO ;
259- #if defined(HAVE_QT ) || defined(__WINRT__ )
260- char buffer [1024 ];
261- buffer [0 ] = '\0' ;
262- /* Ensure NULL termination and line break in error case */
263- if (vsnprintf (buffer , sizeof (buffer ), fmt , ap ) < 0 )
264263 {
265- size_t end ;
266- buffer [sizeof (buffer ) - 1 ] = '\0' ;
267- end = strlen (buffer ) - 1 ;
268- if (end >= 0 )
269- buffer [end ] = '\n' ;
270- else
271- {
272- buffer [0 ] = '\n' ;
273- buffer [1 ] = '\0' ;
274- }
275- }
264+ verbosity_state_t * g_verbosity ;
265+ FILE * fp ;
266+ const char * tag_v ;
276267
277- if (fp )
278- {
279- fprintf (fp , "%s %s" , tag_v , buffer );
280- fflush (fp );
281- }
268+ g_verbosity = & main_verbosity_st ;
269+ fp = (FILE * )g_verbosity -> fp ;
270+ tag_v = tag ? tag : FILE_PATH_LOG_INFO ;
271+
272+ #if defined(HAVE_QT ) || defined(__WINRT__ )
273+ {
274+ char buffer [1024 ];
275+ buffer [0 ] = '\0' ;
276+
277+ if (vsnprintf (buffer , sizeof (buffer ), fmt , ap ) < 0 )
278+ {
279+ size_t len ;
280+ buffer [sizeof (buffer ) - 1 ] = '\0' ;
281+ len = strlen (buffer );
282+ if (len > 0 )
283+ buffer [len - 1 ] = '\n' ;
284+ else
285+ {
286+ buffer [0 ] = '\n' ;
287+ buffer [1 ] = '\0' ;
288+ }
289+ }
290+
291+ if (fp )
292+ {
293+ fprintf (fp , "%s %s" , tag_v , buffer );
294+ fflush (fp );
295+ }
282296
283297#if defined(HAVE_QT )
284- ui_companion_driver_log_msg (buffer );
298+ ui_companion_driver_log_msg (buffer );
285299#endif
286300
287301#if defined(__WINRT__ )
288- OutputDebugStringA (buffer );
302+ OutputDebugStringA (buffer );
289303#endif
290- #else /* !HAVE_QT && !__WINRT__ */
291- #if TARGET_OS_MAC /* any apple variant: macOS, iOS, tvOS, ... */
292- char * buffer = NULL ;
293- va_list ap_cp ;
294- va_copy (ap_cp , ap );
295- int r = vasprintf (& buffer , fmt , ap_cp );
296- va_end (ap_cp );
297- if (r < 0 || !buffer )
298- {
299- /* Fallback to a minimal newline to keep output formatting sensible */
300- buffer = (char * )malloc (2 );
301- if (buffer )
304+ }
305+
306+ #else
307+
308+ #if TARGET_OS_MAC
302309 {
303- buffer [0 ] = '\n' ;
304- buffer [1 ] = '\0' ;
310+ int r ;
311+ va_list ap_cp ;
312+ char * buffer = NULL ;
313+ va_copy (ap_cp , ap );
314+ r = vasprintf (& buffer , fmt , ap_cp );
315+ va_end (ap_cp );
316+
317+ if (r < 0 || !buffer )
318+ {
319+ free (buffer );
320+ buffer = (char * )malloc (2 );
321+ if (!buffer )
322+ goto apple_log_done ;
323+ buffer [0 ] = '\n' ;
324+ buffer [1 ] = '\0' ;
325+ }
326+
327+ #if TARGET_OS_OSX
328+ printf ("%s %s" , tag_v , buffer );
329+ if (fp )
330+ {
331+ fprintf (fp , "%s %s" , tag_v , buffer );
332+ fflush (fp );
333+ }
334+
335+ #else
336+ {
337+ # if TARGET_OS_SIMULATOR
338+ fprintf (stderr , "%s %s" , tag_v , buffer );
339+ # elif defined(__IPHONE_10_0 ) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0 )
340+ os_log (OS_LOG_DEFAULT , "%s %s" , tag_v , buffer );
341+ # elif defined(__TV_OS_VERSION_MIN_REQUIRED ) && defined(__TVOS_10_0 ) \
342+ && (__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0 )
343+ os_log (OS_LOG_DEFAULT , "%s %s" , tag_v , buffer );
344+ # else
345+ {
346+ static aslclient asl_client = NULL ;
347+ static int asl_initialized = 0 ;
348+ aslmsg msg ;
349+
350+ # if defined(HAVE_LIBNX )
351+ mutexLock (& g_verbosity -> mtx );
352+ # endif
353+ if (!asl_initialized )
354+ {
355+ asl_client = asl_open (FILE_PATH_PROGRAM_NAME ,
356+ "com.apple.console" ,
357+ ASL_OPT_STDERR | ASL_OPT_NO_DELAY );
358+ asl_initialized = 1 ;
359+ }
360+ # if defined(HAVE_LIBNX )
361+ mutexUnlock (& g_verbosity -> mtx );
362+ # endif
363+ msg = asl_new (ASL_TYPE_MSG );
364+ asl_set (msg , ASL_KEY_READ_UID , "-1" );
365+ asl_log (asl_client , msg , ASL_LEVEL_NOTICE , "%s %s" , tag_v , buffer );
366+ asl_free (msg );
367+ }
368+ # endif
369+
370+ if (fp )
371+ {
372+ fprintf (fp , "%s %s" , tag_v , buffer );
373+ fflush (fp );
374+ }
375+ }
376+ #endif
377+
378+ free (buffer );
305379 }
306- }
307380
308- #if TARGET_OS_OSX /* really macOS */
309- /* macOS: output to stdout for developer convenience */
310- printf ("%s %s" , tag_v , buffer );
311- #else /* iOS, tvOS, ... */
312- #if TARGET_OS_SIMULATOR
313- /* iOS Simulator: output to stderr for Xcode console */
314- fprintf (stderr , "%s %s" , tag_v , buffer );
315- #elif defined(__IPHONE_10_0 ) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_10_0 )
316- /* iOS 10+ and tvOS 10+: use os_log for unified logging */
317- os_log (OS_LOG_DEFAULT , "%s %s" , tag_v , buffer );
318- #elif defined(__TV_OS_VERSION_MIN_REQUIRED ) && defined(__TVOS_10_0 ) && (__TV_OS_VERSION_MIN_REQUIRED >= __TVOS_10_0 )
319- /* tvOS 10+: use os_log for unified logging */
320- os_log (OS_LOG_DEFAULT , "%s %s" , tag_v , buffer );
381+ apple_log_done :;
382+
321383#else
322- /* iOS 9 and earlier: use ASL (Apple System Logger) */
323- static aslclient asl_client ;
324- static int asl_initialized = 0 ;
325- if (!asl_initialized )
326- {
327- asl_client = asl_open (FILE_PATH_PROGRAM_NAME ,
328- "com.apple.console" ,
329- ASL_OPT_STDERR | ASL_OPT_NO_DELAY );
330- asl_initialized = 1 ;
331- }
332- aslmsg msg = asl_new (ASL_TYPE_MSG );
333- asl_set (msg , ASL_KEY_READ_UID , "-1" );
334- asl_log (asl_client , msg , ASL_LEVEL_NOTICE , "%s %s" , tag_v , buffer );
335- asl_free (msg );
336- #endif
337- #endif /* TARGET_OS_OSX */
338- free (buffer );
339- #endif /* TARGET_OS_MAC */
340- #if defined(HAVE_LIBNX )
341- mutexLock (& g_verbosity -> mtx );
342- #endif
343- if (fp )
344- {
345- fprintf (fp , "%s " , tag_v );
346- vfprintf (fp , fmt , ap );
347- fflush (fp );
348- }
349- #if defined(HAVE_LIBNX )
350- mutexUnlock (& g_verbosity -> mtx );
384+ {
385+ # if defined(HAVE_LIBNX )
386+ mutexLock (& g_verbosity -> mtx );
387+ # endif
388+
389+ if (fp )
390+ {
391+ fprintf (fp , "%s " , tag_v );
392+ vfprintf (fp , fmt , ap );
393+ fflush (fp );
394+ }
395+
396+ # if defined(HAVE_LIBNX )
397+ mutexUnlock (& g_verbosity -> mtx );
398+ # endif
399+ }
351400#endif
352-
353401#endif
402+ }
354403#endif
355404}
356405
0 commit comments