qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] linux-user/elfload.c: Don't memset(NULL..) if m


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH] linux-user/elfload.c: Don't memset(NULL..) if malloc() failed
Date: Fri, 11 Nov 2011 13:45:04 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.21) Gecko/20110831 Lightning/1.0b2 Thunderbird/3.1.13

On 11/09/2011 01:22 PM, Peter Maydell wrote:
If a malloc() in copy_elf_strings() failed we would call memset()
before the "did malloc fail?" check. Fix this by moving to the
glib alloc/free routines for this memory so we can use g_try_malloc0
rather than having a separate memset(). Spotted by Coverity (see
bug 887883).

Signed-off-by: Peter Maydell<address@hidden>

Applied.  Thanks.

Regards,

Anthony Liguori

---
We could obviously also fix this by just moving the memset after the
null check, but I think we want to move towards consistently using
the glib memory routines everywhere anyway.

  linux-user/elfload.c   |    5 ++---
  linux-user/linuxload.c |    2 +-
  2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/linux-user/elfload.c b/linux-user/elfload.c
index a413976..4635bb2 100644
--- a/linux-user/elfload.c
+++ b/linux-user/elfload.c
@@ -1105,8 +1105,7 @@ static abi_ulong copy_elf_strings(int argc,char ** argv, 
void **page,
                  offset = p % TARGET_PAGE_SIZE;
                  pag = (char *)page[p/TARGET_PAGE_SIZE];
                  if (!pag) {
-                    pag = (char *)malloc(TARGET_PAGE_SIZE);
-                    memset(pag, 0, TARGET_PAGE_SIZE);
+                    pag = g_try_malloc0(TARGET_PAGE_SIZE);
                      page[p/TARGET_PAGE_SIZE] = pag;
                      if (!pag)
                          return 0;
@@ -1164,7 +1163,7 @@ static abi_ulong setup_arg_pages(abi_ulong p, struct 
linux_binprm *bprm,
              info->rss++;
              /* FIXME - check return value of memcpy_to_target() for failure */
              memcpy_to_target(stack_base, bprm->page[i], TARGET_PAGE_SIZE);
-            free(bprm->page[i]);
+            g_free(bprm->page[i]);
          }
          stack_base += TARGET_PAGE_SIZE;
      }
diff --git a/linux-user/linuxload.c b/linux-user/linuxload.c
index 62ebc7e..b47025f 100644
--- a/linux-user/linuxload.c
+++ b/linux-user/linuxload.c
@@ -178,7 +178,7 @@ int loader_exec(const char * filename, char ** argv, char 
** envp,

      /* Something went wrong, return the inode and free the argument pages*/
      for (i=0 ; i<MAX_ARG_PAGES ; i++) {
-        free(bprm->page[i]);
+        g_free(bprm->page[i]);
      }
      return(retval);
  }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]