qemu_set_log_filename: filename argument may be NULL

NULL is a valid log filename used to indicate we want to use stderr
but qemu_set_log_filename (which is called by bsd-user/main.c) was not
handling it correctly.

That also made redundant a couple of NULL checks in calling code which
have been removed.

Signed-off-by: Salvador Fandino <salvador@qindel.com>
Message-Id: <20200123193626.19956-1-salvador@qindel.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Salvador Fandino 2020-01-23 20:36:26 +01:00 committed by Stefan Hajnoczi
parent d4aceb2eb7
commit e144a605a6
3 changed files with 18 additions and 19 deletions

View File

@ -229,9 +229,7 @@ void trace_init_file(const char *file)
/* If both the simple and the log backends are enabled, "--trace file" /* If both the simple and the log backends are enabled, "--trace file"
* only applies to the simple backend; use "-D" for the log backend. * only applies to the simple backend; use "-D" for the log backend.
*/ */
if (file) { qemu_set_log_filename(file, &error_fatal);
qemu_set_log_filename(file, &error_fatal);
}
#else #else
if (file) { if (file) {
fprintf(stderr, "error: --trace file=...: " fprintf(stderr, "error: --trace file=...: "

View File

@ -148,25 +148,29 @@ void qemu_log_needs_buffers(void)
* Allow the user to include %d in their logfile which will be * Allow the user to include %d in their logfile which will be
* substituted with the current PID. This is useful for debugging many * substituted with the current PID. This is useful for debugging many
* nested linux-user tasks but will result in lots of logs. * nested linux-user tasks but will result in lots of logs.
*
* filename may be NULL. In that case, log output is sent to stderr
*/ */
void qemu_set_log_filename(const char *filename, Error **errp) void qemu_set_log_filename(const char *filename, Error **errp)
{ {
char *pidstr;
g_free(logfilename); g_free(logfilename);
logfilename = NULL; logfilename = NULL;
pidstr = strstr(filename, "%"); if (filename) {
if (pidstr) { char *pidstr = strstr(filename, "%");
/* We only accept one %d, no other format strings */ if (pidstr) {
if (pidstr[1] != 'd' || strchr(pidstr + 2, '%')) { /* We only accept one %d, no other format strings */
error_setg(errp, "Bad logfile format: %s", filename); if (pidstr[1] != 'd' || strchr(pidstr + 2, '%')) {
return; error_setg(errp, "Bad logfile format: %s", filename);
} else { return;
logfilename = g_strdup_printf(filename, getpid()); } else {
} logfilename = g_strdup_printf(filename, getpid());
} else { }
logfilename = g_strdup(filename); } else {
logfilename = g_strdup(filename);
}
} }
qemu_log_close(); qemu_log_close();
qemu_set_log(qemu_loglevel); qemu_set_log(qemu_loglevel);
} }

5
vl.c
View File

@ -3903,10 +3903,7 @@ int main(int argc, char **argv, char **envp)
/* Open the logfile at this point and set the log mask if necessary. /* Open the logfile at this point and set the log mask if necessary.
*/ */
if (log_file) { qemu_set_log_filename(log_file, &error_fatal);
qemu_set_log_filename(log_file, &error_fatal);
}
if (log_mask) { if (log_mask) {
int mask; int mask;
mask = qemu_str_to_log_mask(log_mask); mask = qemu_str_to_log_mask(log_mask);