[Libvir] [patch 1/5] iptables: fix invalid free

Daniel Veillard veillard at redhat.com
Thu Mar 22 17:01:12 UTC 2007


On Wed, Mar 21, 2007 at 10:31:41AM -0400, Daniel Veillard wrote:
> On Wed, Mar 21, 2007 at 01:55:35PM +0000, Mark McLoughlin wrote:
> >   - I think the use case is a little different - generally in libvirt, 
> >     we're only allocating very small chunks where the CPU hit for 
> >     initialisation would be negligible and would never show up on a
> >     profile. I'd prefer to take the minor hit of zero-initialising
> >     most/all memory for programming ease.
> > 
> >   - If our wrappers always zero-initialise, we don't need the 
> >     "initialise to -1 when debugging" thing.
> > 
> >   - If we rely on calloc() zero-initialising in our wrappers, we give 
> >     opportunity for libc to optimise where it knows the memory is 
> >     already initialised - e.g. where it's mmap()ing the memory 
> >     from /dev/zero
> 
>   okay, okay, let's use calloc() for libvirt, but then there is a number of
> places where I probably used memset() for zeroing, they should all be cleaned
> up.

  Patch enclosed, it also fixes a couple of places in virsh.c where 
malloc() and calloc() were called directly instead of using the virsh
checking functions.

Daniel

-- 
Red Hat Virtualization group http://redhat.com/virtualization/
Daniel Veillard      | virtualization library  http://libvirt.org/
veillard at redhat.com  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/
-------------- next part --------------
Index: qemud/iptables.c
===================================================================
RCS file: /data/cvs/libxen/qemud/iptables.c,v
retrieving revision 1.4
diff -u -p -r1.4 iptables.c
--- qemud/iptables.c	13 Mar 2007 22:43:22 -0000	1.4
+++ qemud/iptables.c	22 Mar 2007 16:57:11 -0000
@@ -270,11 +270,9 @@ iptRulesNew(const char *table,
 {
     iptRules *rules;
 
-    if (!(rules = (iptRules *)malloc(sizeof (iptRules))))
+    if (!(rules = (iptRules *)calloc(1, sizeof (iptRules))))
         return NULL;
 
-    memset (rules, 0, sizeof (iptRules));
-
     if (!(rules->table = strdup(table)))
         goto error;
 
@@ -353,11 +351,9 @@ iptablesAddRemoveChain(iptRules *rules, 
         2 + /*   --table foo     */
         2;  /*   --new-chain bar */
 
-    if (!(argv = (char **)malloc(sizeof(char *) * (n+1))))
+    if (!(argv = (char **)calloc(1, sizeof(char *) * (n + 1))))
         goto error;
 
-    memset(argv, 0, sizeof(char *) * (n + 1));
-
     n = 0;
 
     if (!(argv[n++] = strdup(IPTABLES_PATH)))
@@ -413,14 +409,12 @@ iptablesAddRemoveRule(iptRules *rules, i
 
     va_end(args);
 
-    if (!(argv = (char **)malloc(sizeof(char *) * (n + 1))))
+    if (!(argv = (char **)calloc(1, sizeof(char *) * (n + 1))))
         goto error;
 
     if (!(rule = (char *)malloc(rulelen)))
         goto error;
 
-    memset(argv, 0, sizeof(char *) * (n + 1));
-
     n = 0;
 
     if (!(argv[n++] = strdup(IPTABLES_PATH)))
Index: qemud/qemud.c
===================================================================
RCS file: /data/cvs/libxen/qemud/qemud.c,v
retrieving revision 1.33
diff -u -p -r1.33 qemud.c
--- qemud/qemud.c	13 Mar 2007 22:43:22 -0000	1.33
+++ qemud/qemud.c	22 Mar 2007 16:57:11 -0000
@@ -1132,11 +1132,9 @@ qemudBuildDnsmasqArgv(struct qemud_serve
         (2 * network->def->nranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
         1;  /* NULL */
 
-    if (!(*argv = malloc(len * sizeof(char *))))
+    if (!(*argv = calloc(1, len * sizeof(char *))))
         goto no_memory;
 
-    memset(*argv, 0, len * sizeof(char *));
-
 #define APPEND_ARG(v, n, s) do {     \
         if (!((v)[(n)] = strdup(s))) \
             goto no_memory;          \
Index: src/conf.c
===================================================================
RCS file: /data/cvs/libxen/src/conf.c,v
retrieving revision 1.8
diff -u -p -r1.8 conf.c
--- src/conf.c	9 Mar 2007 20:47:12 -0000	1.8
+++ src/conf.c	22 Mar 2007 16:57:11 -0000
@@ -151,13 +151,11 @@ __virConfNew(void)
 {
     virConfPtr ret;
 
-    ret = (virConfPtr) malloc(sizeof(virConf));
+    ret = (virConfPtr) calloc(1, sizeof(virConf));
     if (ret == NULL) {
         virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
         return(NULL);
     }
-    memset(ret, 0, sizeof(virConf));
-
     ret->filename = NULL;
 
     return(ret);
@@ -202,13 +200,12 @@ virConfAddEntry(virConfPtr conf, char *n
     if ((comm == NULL) && (name == NULL))
         return(NULL);
     
-    ret = (virConfEntryPtr) malloc(sizeof(virConfEntry));
+    ret = (virConfEntryPtr) calloc(1, sizeof(virConfEntry));
     if (ret == NULL) {
         virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
         return(NULL);
     }
 
-    memset(ret, 0, sizeof(virConfEntry));
     ret->name = name;
     ret->value = value;
     ret->comment = comm;
@@ -486,14 +483,13 @@ virConfParseValue(virConfParserCtxtPtr c
 	             ctxt->line);
 	return(NULL);
     }
-    ret = (virConfValuePtr) malloc(sizeof(virConfValue));
+    ret = (virConfValuePtr) calloc(1, sizeof(virConfValue));
     if (ret == NULL) {
         virConfError(NULL, VIR_ERR_NO_MEMORY, _("allocating configuration"), 0);
 	if (str != NULL)
 	    free(str);
         return(NULL);
     }
-    memset(ret, 0, sizeof(virConfValue));
     ret->type = type;
     ret->l = l;
     ret->str = str;
Index: src/hash.c
===================================================================
RCS file: /data/cvs/libxen/src/hash.c,v
retrieving revision 1.18
diff -u -p -r1.18 hash.c
--- src/hash.c	6 Mar 2007 22:06:14 -0000	1.18
+++ src/hash.c	22 Mar 2007 16:57:11 -0000
@@ -89,9 +89,8 @@ virHashCreate(int size)
     if (table) {
         table->size = size;
         table->nbElems = 0;
-        table->table = malloc(size * sizeof(virHashEntry));
+        table->table = calloc(1, size * sizeof(virHashEntry));
         if (table->table) {
-            memset(table->table, 0, size * sizeof(virHashEntry));
             return (table);
         }
         free(table);
@@ -132,12 +131,11 @@ virHashGrow(virHashTablePtr table, int s
     if (oldtable == NULL)
         return (-1);
 
-    table->table = malloc(size * sizeof(virHashEntry));
+    table->table = calloc(1, size * sizeof(virHashEntry));
     if (table->table == NULL) {
         table->table = oldtable;
         return (-1);
     }
-    memset(table->table, 0, size * sizeof(virHashEntry));
     table->size = size;
 
     /*  If the two loops are merged, there would be situations where
@@ -661,12 +659,11 @@ virConnectPtr
 virGetConnect(void) {
     virConnectPtr ret;
 
-    ret = (virConnectPtr) malloc(sizeof(virConnect));
+    ret = (virConnectPtr) calloc(1, sizeof(virConnect));
     if (ret == NULL) {
         virHashError(NULL, VIR_ERR_NO_MEMORY, _("allocating connection"));
         goto failed;
     }
-    memset(ret, 0, sizeof(virConnect));
     ret->magic = VIR_CONNECT_MAGIC;
     ret->nb_drivers = 0;
     ret->handle = -1;
@@ -767,12 +764,11 @@ virGetDomain(virConnectPtr conn, const c
     /*
      * not found, allocate a new one
      */
-    ret = (virDomainPtr) malloc(sizeof(virDomain));
+    ret = (virDomainPtr) calloc(1, sizeof(virDomain));
     if (ret == NULL) {
         virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
 	goto error;
     }
-    memset(ret, 0, sizeof(virDomain));
     ret->name = strdup(name);
     if (ret->name == NULL) {
         virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating domain"));
@@ -950,12 +946,11 @@ virGetNetwork(virConnectPtr conn, const 
     /*
      * not found, allocate a new one
      */
-    ret = (virNetworkPtr) malloc(sizeof(virNetwork));
+    ret = (virNetworkPtr) calloc(1, sizeof(virNetwork));
     if (ret == NULL) {
         virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
 	goto error;
     }
-    memset(ret, 0, sizeof(virNetwork));
     ret->name = strdup(name);
     if (ret->name == NULL) {
         virHashError(conn, VIR_ERR_NO_MEMORY, _("allocating network"));
Index: src/libvirt.c
===================================================================
RCS file: /data/cvs/libxen/src/libvirt.c,v
retrieving revision 1.64
diff -u -p -r1.64 libvirt.c
--- src/libvirt.c	19 Mar 2007 10:15:52 -0000	1.64
+++ src/libvirt.c	22 Mar 2007 16:57:11 -0000
@@ -40,7 +40,6 @@
  * TODO:
  * - use lock to protect against concurrent accesses ?
  * - use reference counting to garantee coherent pointer state ?
- * - memory wrappers for malloc/free ?
  */
 
 static virDriverPtr virDriverTab[MAX_DRIVERS];
Index: src/virsh.c
===================================================================
RCS file: /data/cvs/libxen/src/virsh.c,v
retrieving revision 1.68
diff -u -p -r1.68 virsh.c
--- src/virsh.c	22 Mar 2007 10:27:55 -0000	1.68
+++ src/virsh.c	22 Mar 2007 16:57:11 -0000
@@ -1247,9 +1247,9 @@ cmdVcpuinfo(vshControl * ctl, vshCmd * c
         return FALSE;
     }
 
-    cpuinfo = malloc(sizeof(virVcpuInfo)*info.nrVirtCpu);
+    cpuinfo = vshMalloc(ctl, sizeof(virVcpuInfo)*info.nrVirtCpu);
     cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo));
-    cpumap = malloc(info.nrVirtCpu * cpumaplen);
+    cpumap = vshMalloc(ctl, info.nrVirtCpu * cpumaplen);
 
     if ((ncpus = virDomainGetVcpus(dom,
                                    cpuinfo, info.nrVirtCpu,
@@ -1350,8 +1350,7 @@ cmdVcpupin(vshControl * ctl, vshCmd * cm
     }
 
     cpumaplen = VIR_CPU_MAPLEN(VIR_NODEINFO_MAXCPUS(nodeinfo));
-    cpumap = malloc(cpumaplen);
-    memset(cpumap, 0, cpumaplen);
+    cpumap = vshCalloc(ctl, 1, cpumaplen);
 
     do {
         unsigned int cpu = atoi(cpulist);
Index: src/xm_internal.c
===================================================================
RCS file: /data/cvs/libxen/src/xm_internal.c,v
retrieving revision 1.21
diff -u -p -r1.21 xm_internal.c
--- src/xm_internal.c	16 Mar 2007 15:03:21 -0000	1.21
+++ src/xm_internal.c	22 Mar 2007 16:57:11 -0000
@@ -2113,11 +2113,10 @@ virDomainPtr xenXMDomainDefineXML(virCon
         goto error;
     }
 
-    if (!(entry = malloc(sizeof(xenXMConfCache)))) {
+    if (!(entry = calloc(1, sizeof(xenXMConfCache)))) {
         xenXMError(conn, VIR_ERR_NO_MEMORY, "config");
         goto error;
     }
-    memset(entry, 0, sizeof(xenXMConfCache));
 
     if ((entry->refreshedAt = time(NULL)) == ((time_t)-1)) {
         xenXMError(conn, VIR_ERR_INTERNAL_ERROR, "unable to get current time");


More information about the libvir-list mailing list