Daniel P. Berrangé <[email protected]> writes:

> One codepath that could return NULL failed to populate the errp
> object.
>
> Reported-by: Markus Armbruster <[email protected]>
> Signed-off-by: Daniel P. Berrangé <[email protected]>
> ---
>  util/log.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/util/log.c b/util/log.c
> index 1644e6814b..1c9c7adb2d 100644
> --- a/util/log.c
> +++ b/util/log.c
> @@ -118,6 +118,7 @@ static FILE *qemu_log_trylock_with_err(Error **errp)
   static FILE *qemu_log_trylock_with_err(Error **errp)
   {
       FILE *logfile;

       logfile = thread_file;
       if (!logfile) {

Slow path: no log file cached for this thread.

           if (log_per_thread) {

We're logging to per-thread log files.  @global_filename is a file name
pattern; derive this thread's log file from it.

               g_autofree char *filename
                   = g_strdup_printf(global_filename, log_thread_id());
               logfile = fopen(filename, "w");
               if (!logfile) {
                   error_setg_errno(errp, errno,
                                    "Error opening logfile %s for thread %d",
                                    filename, log_thread_id());
                   return NULL;
               }
               thread_file = logfile;
               qemu_log_thread_cleanup_notifier.notify = 
qemu_log_thread_cleanup;
               qemu_thread_atexit_add(&qemu_log_thread_cleanup_notifier);
           } else {

Logging to a single log file.  Fetch it from @global_file.

               rcu_read_lock();
               /*
                * FIXME: typeof_strip_qual, as used by qatomic_rcu_read,
                * does not work with pointers to undefined structures,
                * such as we have with struct _IO_FILE and musl libc.
                * Since all we want is a read of a pointer, cast to void**,
                * which does work with typeof_strip_qual.
                */
>              logfile = qatomic_rcu_read((void **)&global_file);
>              if (!logfile) {

@global_file was null when we fetched it.

It can be null when @daemonized and the user didn't set a log file.

>                  rcu_read_unlock();
> +                error_setg(errp, "Global log file output is not open");

Impact?  The only callers passing non-null @errp is
qemu_set_log_internal(), and it can call only when @log_per_thread.  We
can't reach the new error then.

So this is just a latent bug.  Worth mentioning in the commit message?

>                  return NULL;
>              }

We do not set thread_file.  We'll take the slow path again.  Harmless
enough, but its a bit at odds with how the code is structured here.
Observation, not a demand.

>          }
       }

       qemu_flockfile(logfile);
       return logfile;
   }

Reviewed-by: Markus Armbruster <[email protected]>

Reply via email to