Skip to content

Commit f452d31

Browse files
committed
Fix code issues in RARCH_LOG_V
1 parent d147482 commit f452d31

File tree

1 file changed

+142
-93
lines changed

1 file changed

+142
-93
lines changed

verbosity.c

Lines changed: 142 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -219,24 +219,30 @@ void retro_main_log_file_deinit(void)
219219
#if !defined(HAVE_LOGGER)
220220
void 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

Comments
 (0)