Patchwork [v2,08/11] qemu-log: Plug trivial memory leak in cpu_set_log_filename()

login
register
mail settings
Submitter Markus Armbruster
Date Jan. 16, 2013, 5:32 p.m.
Message ID <1358357540-29862-9-git-send-email-armbru@redhat.com>
Download mbox | patch
Permalink /patch/212949/
State New
Headers show

Comments

Markus Armbruster - Jan. 16, 2013, 5:32 p.m.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qemu-log.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)
Stefan Hajnoczi - Jan. 17, 2013, 11:24 a.m.
On Wed, Jan 16, 2013 at 06:32:17PM +0100, Markus Armbruster wrote:
> diff --git a/qemu-log.c b/qemu-log.c
> index 64a1b88..30c8b01 100644
> --- a/qemu-log.c
> +++ b/qemu-log.c
> @@ -21,10 +21,12 @@
>  #include "qemu/log.h"
>  
>  #ifdef WIN32
> -static const char *logfilename = "qemu.log";
> +#define DEFAULT_LOGFILENAME "qemu.log"
>  #else
> -static const char *logfilename = "/tmp/qemu.log";
> +#define DEFAULT_LOGFILENAME "/tmp/qemu.log"
>  #endif
> +
> +static const char *logfilename;
[...]
> @@ -84,6 +88,7 @@ void qemu_set_log(int log_flags, bool use_own_buffers)
>  
>  void cpu_set_log_filename(const char *filename)
>  {
> +    g_free((void *)logfilename);

Might as well drop the const from the variable declaration to indicate
that we allocate/free this string.

Stefan
Markus Armbruster - Jan. 17, 2013, 1:17 p.m.
Stefan Hajnoczi <stefanha@gmail.com> writes:

> On Wed, Jan 16, 2013 at 06:32:17PM +0100, Markus Armbruster wrote:
>> diff --git a/qemu-log.c b/qemu-log.c
>> index 64a1b88..30c8b01 100644
>> --- a/qemu-log.c
>> +++ b/qemu-log.c
>> @@ -21,10 +21,12 @@
>>  #include "qemu/log.h"
>>  
>>  #ifdef WIN32
>> -static const char *logfilename = "qemu.log";
>> +#define DEFAULT_LOGFILENAME "qemu.log"
>>  #else
>> -static const char *logfilename = "/tmp/qemu.log";
>> +#define DEFAULT_LOGFILENAME "/tmp/qemu.log"
>>  #endif
>> +
>> +static const char *logfilename;
> [...]
>> @@ -84,6 +88,7 @@ void qemu_set_log(int log_flags, bool use_own_buffers)
>>  
>>  void cpu_set_log_filename(const char *filename)
>>  {
>> +    g_free((void *)logfilename);
>
> Might as well drop the const from the variable declaration to indicate
> that we allocate/free this string.

Never thought of const that way.  Dropping const from logfilename is
fine with me.

I wish free()'s parameter was const void *.  Can't be changed now.  Sad
that glib didn't get it right either.

Patch

diff --git a/qemu-log.c b/qemu-log.c
index 64a1b88..30c8b01 100644
--- a/qemu-log.c
+++ b/qemu-log.c
@@ -21,10 +21,12 @@ 
 #include "qemu/log.h"
 
 #ifdef WIN32
-static const char *logfilename = "qemu.log";
+#define DEFAULT_LOGFILENAME "qemu.log"
 #else
-static const char *logfilename = "/tmp/qemu.log";
+#define DEFAULT_LOGFILENAME "/tmp/qemu.log"
 #endif
+
+static const char *logfilename;
 FILE *qemu_logfile;
 int qemu_loglevel;
 static int log_append = 0;
@@ -54,11 +56,13 @@  void qemu_log_mask(int mask, const char *fmt, ...)
 /* enable or disable low levels log */
 void qemu_set_log(int log_flags, bool use_own_buffers)
 {
+    const char *fname = logfilename ?: DEFAULT_LOGFILENAME;
+
     qemu_loglevel = log_flags;
     if (qemu_loglevel && !qemu_logfile) {
-        qemu_logfile = fopen(logfilename, log_append ? "a" : "w");
+        qemu_logfile = fopen(fname, log_append ? "a" : "w");
         if (!qemu_logfile) {
-            perror(logfilename);
+            perror(fname);
             _exit(1);
         }
         /* must avoid mmap() usage of glibc by setting a buffer "by hand" */
@@ -84,6 +88,7 @@  void qemu_set_log(int log_flags, bool use_own_buffers)
 
 void cpu_set_log_filename(const char *filename)
 {
+    g_free((void *)logfilename);
     logfilename = g_strdup(filename);
     if (qemu_logfile) {
         fclose(qemu_logfile);