This patch converts a large amount of the XML parsing/generating code in
the Xen and QEMU drivers over to using the new memory APIs, so we can get
OOM checking of it. In the process I've discovered and fixed a number of
double-free's, and leaks
src/conf.c | 5 -
src/conf.h | 18 ++--
src/qemu_conf.c | 134 +++++++++++++++---------------
src/qemu_driver.c | 114 ++++++++++++-------------
src/test.c | 94 ++++++++++-----------
src/util.c | 11 --
src/xend_internal.c | 127 ++++++++++++++--------------
src/xm_internal.c | 229 +++++++++++++++++++++++++++-------------------------
src/xml.c | 100 +++++++++++-----------
tests/virshtest.c | 23 ++---
10 files changed, 434 insertions(+), 421 deletions(-)
Dan.
diff -r 2069e1bf9132 src/conf.c
--- a/src/conf.c Thu May 22 14:22:39 2008 -0400
+++ b/src/conf.c Thu May 22 17:39:03 2008 -0400
@@ -105,7 +105,6 @@
* Structures allocations and deallocations *
* *
************************************************************************/
-static void virConfFreeValue(virConfValuePtr val);
/**
* virConfFreeList:
@@ -132,8 +131,8 @@
*
* Free a value
*/
-static void
-virConfFreeValue(virConfValuePtr val)
+void
+__virConfFreeValue(virConfValuePtr val)
{
if (val == NULL)
return;
diff -r 2069e1bf9132 src/conf.h
--- a/src/conf.h Thu May 22 14:22:39 2008 -0400
+++ b/src/conf.h Thu May 22 17:39:03 2008 -0400
@@ -70,6 +70,7 @@
virConfPtr __virConfReadMem (const char *memory,
int len);
int __virConfFree (virConfPtr conf);
+void __virConfFreeValue (virConfValuePtr val);
virConfValuePtr __virConfGetValue (virConfPtr conf,
const char *setting);
@@ -82,14 +83,15 @@
int *len,
virConfPtr conf);
-#define virConfNew() (__virConfNew())
-#define virConfReadFile(f) (__virConfReadFile((f)))
-#define virConfReadMem(m,l) (__virConfReadMem((m),(l)))
-#define virConfFree(c) (__virConfFree((c)))
-#define virConfGetValue(c,s) (__virConfGetValue((c),(s)))
-#define virConfSetValue(c,s,v) (__virConfSetValue((c),(s),(v)))
-#define virConfWriteFile(f,c) (__virConfWriteFile((f),(c)))
-#define virConfWriteMem(m,l,c) (__virConfWriteMem((m),(l),(c)))
+#define virConfNew() __virConfNew()
+#define virConfReadFile(f) __virConfReadFile((f))
+#define virConfReadMem(m,l) __virConfReadMem((m),(l))
+#define virConfFree(c) __virConfFree((c))
+#define virConfFreeValue(v) __virConfFreeValue((v))
+#define virConfGetValue(c,s) __virConfGetValue((c),(s))
+#define virConfSetValue(c,s,v) __virConfSetValue((c),(s),(v))
+#define virConfWriteFile(f,c) __virConfWriteFile((f),(c))
+#define virConfWriteMem(m,l,c) __virConfWriteMem((m),(l),(c))
#ifdef __cplusplus
}
diff -r 2069e1bf9132 src/qemu_conf.c
--- a/src/qemu_conf.c Thu May 22 14:22:39 2008 -0400
+++ b/src/qemu_conf.c Thu May 22 17:39:03 2008 -0400
@@ -122,7 +122,7 @@
p = virConfGetValue (conf, "vnc_tls_x509_cert_dir");
CHECK_TYPE ("vnc_tls_x509_cert_dir", VIR_CONF_STRING);
if (p && p->str) {
- free(driver->vncTLSx509certdir);
+ VIR_FREE(driver->vncTLSx509certdir);
if (!(driver->vncTLSx509certdir = strdup(p->str))) {
qemudReportError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate
vncTLSx509certdir"));
@@ -220,42 +220,42 @@
while (disk) {
struct qemud_vm_disk_def *prev = disk;
disk = disk->next;
- free(prev);
+ VIR_FREE(prev);
}
while (net) {
struct qemud_vm_net_def *prev = net;
net = net->next;
- free(prev);
+ VIR_FREE(prev);
}
while (input) {
struct qemud_vm_input_def *prev = input;
input = input->next;
- free(prev);
+ VIR_FREE(prev);
}
while (serial) {
struct qemud_vm_chr_def *prev = serial;
serial = serial->next;
- free(prev);
+ VIR_FREE(prev);
}
while (parallel) {
struct qemud_vm_chr_def *prev = parallel;
parallel = parallel->next;
- free(prev);
+ VIR_FREE(prev);
}
while (sound) {
struct qemud_vm_sound_def *prev = sound;
sound = sound->next;
- free(prev);
+ VIR_FREE(prev);
}
xmlFree(def->keymap);
- free(def);
+ VIR_FREE(def);
}
void qemudFreeVM(struct qemud_vm *vm) {
qemudFreeVMDef(vm->def);
if (vm->newDef)
qemudFreeVMDef(vm->newDef);
- free(vm);
+ VIR_FREE(vm);
}
@@ -1418,8 +1418,8 @@
}
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
- struct qemud_vm_chr_def *chr = calloc(1, sizeof(*chr));
- if (!chr) {
+ struct qemud_vm_chr_def *chr;
+ if (VIR_ALLOC(chr) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s",
_("failed to allocate space for char
device"));
@@ -1427,7 +1427,7 @@
}
if (qemudParseCharXML(conn, chr, i, obj->nodesetval->nodeTab[i]) <
0) {
- free(chr);
+ VIR_FREE(chr);
goto cleanup;
}
if (ndevs)
@@ -1620,7 +1620,7 @@
int i;
struct qemud_vm_def *def;
- if (!(def = calloc(1, sizeof(*def)))) {
+ if (VIR_ALLOC(def) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for
xmlXPathContext"));
return NULL;
@@ -1660,8 +1660,7 @@
"%s", _("invalid domain type attribute"));
goto error;
}
- free(prop);
- prop = NULL;
+ VIR_FREE(prop);
/* Extract domain name */
@@ -2033,14 +2032,14 @@
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0))
{
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
- struct qemud_vm_disk_def *disk = calloc(1, sizeof(*disk));
- if (!disk) {
+ struct qemud_vm_disk_def *disk;
+ if (VIR_ALLOC(disk) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for disk
string"));
goto error;
}
if (qemudParseDiskXML(conn, disk, obj->nodesetval->nodeTab[i]) < 0)
{
- free(disk);
+ VIR_FREE(disk);
goto error;
}
def->ndisks++;
@@ -2083,8 +2082,8 @@
obj = xmlXPathEval(BAD_CAST "/domain/devices/console", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr == 1))
{
- struct qemud_vm_chr_def *chr = calloc(1, sizeof(*chr));
- if (!chr) {
+ struct qemud_vm_chr_def *chr;
+ if (VIR_ALLOC(chr) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s",
_("failed to allocate space for char
device"));
@@ -2092,7 +2091,7 @@
}
if (qemudParseCharXML(conn, chr, 0, obj->nodesetval->nodeTab[0]) <
0) {
- free(chr);
+ VIR_FREE(chr);
goto error;
}
def->nserials = 1;
@@ -2108,14 +2107,14 @@
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0))
{
struct qemud_vm_net_def *prev = NULL;
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
- struct qemud_vm_net_def *net = calloc(1, sizeof(*net));
- if (!net) {
+ struct qemud_vm_net_def *net;
+ if (VIR_ALLOC(net) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for net
string"));
goto error;
}
if (qemudParseInterfaceXML(conn, net, obj->nodesetval->nodeTab[i]) <
0) {
- free(net);
+ VIR_FREE(net);
goto error;
}
def->nnets++;
@@ -2136,20 +2135,20 @@
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0))
{
struct qemud_vm_input_def *prev = NULL;
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
- struct qemud_vm_input_def *input = calloc(1, sizeof(*input));
- if (!input) {
+ struct qemud_vm_input_def *input;
+ if (VIR_ALLOC(input) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for input
string"));
goto error;
}
if (qemudParseInputXML(conn, def, input, obj->nodesetval->nodeTab[i])
< 0) {
- free(input);
+ VIR_FREE(input);
goto error;
}
/* Mouse + PS/2 is implicit with graphics, so don't store it */
if (input->bus == QEMU_INPUT_BUS_PS2 &&
input->type == QEMU_INPUT_TYPE_MOUSE) {
- free(input);
+ VIR_FREE(input);
continue;
}
def->ninputs++;
@@ -2171,17 +2170,17 @@
struct qemud_vm_sound_def *prev = NULL;
for (i = 0; i < obj->nodesetval->nodeNr; i++) {
- struct qemud_vm_sound_def *sound = calloc(1, sizeof(*sound));
+ struct qemud_vm_sound_def *sound;
struct qemud_vm_sound_def *check = def->sounds;
int collision = 0;
- if (!sound) {
+ if (VIR_ALLOC(sound) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for sound
dev"));
goto error;
}
if (qemudParseSoundXML(conn, sound,
obj->nodesetval->nodeTab[i]) < 0) {
- free(sound);
+ VIR_FREE(sound);
goto error;
}
@@ -2194,7 +2193,7 @@
check = check->next;
}
if (collision) {
- free(sound);
+ VIR_FREE(sound);
continue;
}
@@ -2223,8 +2222,7 @@
}
if (!hasPS2mouse) {
- input = calloc(1, sizeof(*input));
- if (!input) {
+ if (VIR_ALLOC(input) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for input
string"));
goto error;
@@ -2242,7 +2240,7 @@
return def;
error:
- free(prop);
+ VIR_FREE(prop);
xmlXPathFreeObject(obj);
xmlXPathFreeContext(ctxt);
qemudFreeVMDef(def);
@@ -2264,7 +2262,6 @@
char *retval = NULL;
int err;
int tapfd = -1;
- int *tapfds;
if (net->type == QEMUD_NET_NETWORK) {
if (!(network = qemudFindNetworkByName(driver, net->dst.network.name))) {
@@ -2321,10 +2318,9 @@
if (!(retval = strdup(tapfdstr)))
goto no_memory;
- if (!(tapfds = realloc(vm->tapfds, sizeof(*tapfds) * (vm->ntapfds+2))))
- goto no_memory;
-
- vm->tapfds = tapfds;
+ if (VIR_ALLOC_N(vm->tapfds, vm->ntapfds+2) < 0)
+ goto no_memory;
+
vm->tapfds[vm->ntapfds++] = tapfd;
vm->tapfds[vm->ntapfds] = -1;
@@ -2334,7 +2330,7 @@
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for tapfds
string"));
error:
- free(retval);
+ VIR_FREE(retval);
if (tapfd != -1)
close(tapfd);
return NULL;
@@ -2831,14 +2827,14 @@
/* Add sound hardware */
if (sound) {
int size = 100;
- char *modstr = calloc(1, size+1);
- if (!modstr)
+ char *modstr;
+ if (VIR_ALLOC_N(modstr, size+1) < 0)
goto no_memory;
while(sound && size > 0) {
const char *model = qemudSoundModelToString(sound->model);
if (!model) {
- free(modstr);
+ VIR_FREE(modstr);
qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
"%s", _("invalid sound model"));
goto error;
@@ -2870,14 +2866,14 @@
if (vm->tapfds) {
for (i = 0; vm->tapfds[i] != -1; i++)
close(vm->tapfds[i]);
- free(vm->tapfds);
+ VIR_FREE(vm->tapfds);
vm->tapfds = NULL;
vm->ntapfds = 0;
}
if (qargv) {
for (i = 0 ; i < qargc ; i++)
- free((qargv)[i]);
- free(qargv);
+ VIR_FREE((qargv)[i]);
+ VIR_FREE(qargv);
}
return -1;
}
@@ -2925,7 +2921,7 @@
if (fd != -1)
close(fd);
- free(xml);
+ VIR_FREE(xml);
return ret;
}
@@ -2937,13 +2933,18 @@
{
xmlDocPtr xml;
xmlNodePtr node;
- struct qemud_vm_device_def *dev = calloc(1, sizeof(*dev));
+ struct qemud_vm_device_def *dev;
+
+ if (VIR_ALLOC(dev) < 0) {
+ qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, NULL);
+ return NULL;
+ }
if (!(xml = xmlReadDoc(BAD_CAST xmlStr, "device.xml", NULL,
XML_PARSE_NOENT | XML_PARSE_NONET |
XML_PARSE_NOERROR | XML_PARSE_NOWARNING))) {
qemudReportError(conn, NULL, NULL, VIR_ERR_XML_ERROR, NULL);
- return NULL;
+ goto error;
}
node = xmlDocGetRootElement(xml);
@@ -2976,7 +2977,7 @@
error:
if (xml) xmlFreeDoc(xml);
- free(dev);
+ VIR_FREE(dev);
return NULL;
}
@@ -3024,7 +3025,7 @@
return vm;
}
- if (!(vm = calloc(1, sizeof(*vm)))) {
+ if (VIR_ALLOC(vm) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for vm
string"));
return NULL;
@@ -3152,7 +3153,7 @@
cleanup:
- free(xml);
+ VIR_FREE(xml);
return ret;
}
@@ -3161,17 +3162,17 @@
struct qemud_dhcp_range_def *range = def->ranges;
while (range) {
struct qemud_dhcp_range_def *next = range->next;
- free(range);
+ VIR_FREE(range);
range = next;
}
- free(def);
+ VIR_FREE(def);
}
void qemudFreeNetwork(struct qemud_network *network) {
qemudFreeNetworkDef(network->def);
if (network->newDef)
qemudFreeNetworkDef(network->newDef);
- free(network);
+ VIR_FREE(network);
}
static int qemudParseBridgeXML(struct qemud_driver *driver ATTRIBUTE_UNUSED,
@@ -3224,7 +3225,7 @@
continue;
}
- if (!(range = calloc(1, sizeof(*range)))) {
+ if (VIR_ALLOC(range) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for range
string"));
return 0;
@@ -3244,7 +3245,7 @@
def->ranges = range;
def->nranges++;
} else {
- free(range);
+ VIR_FREE(range);
}
xmlFree(start);
@@ -3315,7 +3316,7 @@
xmlXPathObjectPtr obj = NULL, tmp = NULL;
struct qemud_network_def *def;
- if (!(def = calloc(1, sizeof(*def)))) {
+ if (VIR_ALLOC(def) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for network_def
string"));
return NULL;
@@ -3489,7 +3490,7 @@
return network;
}
- if (!(network = calloc(1, sizeof(*network)))) {
+ if (VIR_ALLOC(network) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for network
string"));
return NULL;
@@ -3700,7 +3701,7 @@
else
qemudLoadNetworkConfig(driver, entry->d_name, path, xml, autostartLink);
- free(xml);
+ VIR_FREE(xml);
}
closedir(dir);
@@ -3836,7 +3837,7 @@
const struct qemud_vm_input_def *input;
const struct qemud_vm_sound_def *sound;
const struct qemud_vm_chr_def *chr;
- const char *type = NULL;
+ const char *type = NULL, *tmp;
int n, allones = 1;
if (!(type = qemudVirtTypeToString(def->virtType))) {
@@ -3873,7 +3874,7 @@
goto cleanup;
}
virBufferVSprintf(&buf, " <vcpu
cpuset='%s'>%d</vcpu>\n", cpumask, def->vcpus);
- free(cpumask);
+ VIR_FREE(cpumask);
}
if (def->os.bootloader[0])
@@ -4113,7 +4114,8 @@
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to generate XML: out of
memory"));
cleanup:
- free(virBufferContentAndReset(&buf));
+ tmp = virBufferContentAndReset(&buf);
+ VIR_FREE(tmp);
return NULL;
}
@@ -4124,6 +4126,7 @@
struct qemud_network_def *def) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
unsigned char *uuid;
+ char *tmp;
char uuidstr[VIR_UUID_STRING_BUFLEN];
virBufferAddLit(&buf, "<network>\n");
@@ -4188,7 +4191,8 @@
no_memory:
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to generate XML: out of
memory"));
- free(virBufferContentAndReset(&buf));
+ tmp = virBufferContentAndReset(&buf);
+ VIR_FREE(tmp);
return NULL;
}
diff -r 2069e1bf9132 src/qemu_driver.c
--- a/src/qemu_driver.c Thu May 22 14:22:39 2008 -0400
+++ b/src/qemu_driver.c Thu May 22 17:39:03 2008 -0400
@@ -179,9 +179,8 @@
char *base = NULL;
char driverConf[PATH_MAX];
- if (!(qemu_driver = calloc(1, sizeof(*qemu_driver)))) {
+ if (VIR_ALLOC(qemu_driver) < 0)
return -1;
- }
/* Don't have a dom0 so start from 1 */
qemu_driver->nextvmid = 1;
@@ -229,8 +228,7 @@
base) == -1)
goto out_of_memory;
- free(base);
- base = NULL;
+ VIR_FREE(base);
if ((qemu_driver->caps = qemudCapsInit()) == NULL)
goto out_of_memory;
@@ -256,9 +254,8 @@
out_of_memory:
qemudLog (QEMUD_ERR,
"%s", _("qemudStartup: out of memory"));
- free (base);
- free(qemu_driver);
- qemu_driver = NULL;
+ VIR_FREE(base);
+ VIR_FREE(qemu_driver);
return -1;
}
@@ -361,19 +358,18 @@
qemu_driver->nactivenetworks = 0;
qemu_driver->ninactivenetworks = 0;
- free(qemu_driver->configDir);
- free(qemu_driver->autostartDir);
- free(qemu_driver->networkConfigDir);
- free(qemu_driver->networkAutostartDir);
- free(qemu_driver->vncTLSx509certdir);
+ VIR_FREE(qemu_driver->configDir);
+ VIR_FREE(qemu_driver->autostartDir);
+ VIR_FREE(qemu_driver->networkConfigDir);
+ VIR_FREE(qemu_driver->networkAutostartDir);
+ VIR_FREE(qemu_driver->vncTLSx509certdir);
if (qemu_driver->brctl)
brShutdown(qemu_driver->brctl);
if (qemu_driver->iptables)
iptablesContextFree(qemu_driver->iptables);
- free(qemu_driver);
- qemu_driver = NULL;
+ VIR_FREE(qemu_driver);
return 0;
}
@@ -702,13 +698,13 @@
if (lastVcpu != (vm->def->vcpus - 1))
goto error;
- free(qemucpus);
+ VIR_FREE(qemucpus);
return 0;
error:
VIR_FREE(vm->vcpupids);
- vm->vcpupids = 0;
- free(qemucpus);
+ vm->nvcpupids = 0;
+ VIR_FREE(qemucpus);
/* Explicitly return success, not error. Older KVM does
not have vCPU -> Thread mapping info and we don't
@@ -757,7 +753,7 @@
"%s", _("resume operation failed"));
return -1;
}
- free(info);
+ VIR_FREE(info);
return 0;
}
@@ -906,16 +902,15 @@
}
for (i = 0 ; argv[i] ; i++)
- free(argv[i]);
- free(argv);
+ VIR_FREE(argv[i]);
+ VIR_FREE(argv);
if (vm->tapfds) {
for (i = 0; vm->tapfds[i] != -1; i++) {
close(vm->tapfds[i]);
vm->tapfds[i] = -1;
}
- free(vm->tapfds);
- vm->tapfds = NULL;
+ VIR_FREE(vm->tapfds);
vm->ntapfds = 0;
}
@@ -1006,8 +1001,7 @@
vm->pid = -1;
vm->id = -1;
vm->state = VIR_DOMAIN_SHUTOFF;
- free(vm->vcpupids);
- vm->vcpupids = NULL;
+ VIR_FREE(vm->vcpupids);
vm->nvcpupids = 0;
if (vm->newDef) {
@@ -1059,7 +1053,7 @@
(2 * network->def->nranges) + /* --dhcp-range 10.0.0.2,10.0.0.254 */
1; /* NULL */
- if (!(*argv = calloc(len, sizeof(**argv))))
+ if (VIR_ALLOC_N(*argv, len) < 0)
goto no_memory;
#define APPEND_ARG(v, n, s) do { \
@@ -1127,8 +1121,8 @@
no_memory:
if (argv) {
for (i = 0; (*argv)[i]; i++)
- free((*argv)[i]);
- free(*argv);
+ VIR_FREE((*argv)[i]);
+ VIR_FREE(*argv);
}
qemudReportError(conn, NULL, NULL, VIR_ERR_NO_MEMORY,
"%s", _("failed to allocate space for dnsmasq
argv"));
@@ -1156,8 +1150,8 @@
ret = virExecNonBlock(conn, argv, &network->dnsmasqPid, -1, NULL, NULL);
for (i = 0; argv[i]; i++)
- free(argv[i]);
- free(argv);
+ VIR_FREE(argv[i]);
+ VIR_FREE(argv);
return ret;
}
@@ -1626,7 +1620,6 @@
for (;;) {
char data[1024];
int got = read(vm->monitor, data, sizeof(data));
- char *b;
if (got == 0)
goto error;
@@ -1637,10 +1630,9 @@
break;
goto error;
}
- if (!(b = realloc(buf, size+got+1)))
+ if (VIR_REALLOC_N(buf, size+got+1) < 0)
goto error;
- buf = b;
memmove(buf+size, data, got);
buf[size+got] = '\0';
size += got;
@@ -1674,7 +1666,7 @@
if (safewrite(vm->logfile, buf, strlen(buf)) < 0)
qemudLog(QEMUD_WARN, _("Unable to log VM console data: %s"),
strerror(errno));
- free(buf);
+ VIR_FREE(buf);
}
return -1;
}
@@ -2018,7 +2010,7 @@
}
vm->state = VIR_DOMAIN_PAUSED;
qemudDebug("Reply %s", info);
- free(info);
+ VIR_FREE(info);
return 0;
}
@@ -2046,7 +2038,7 @@
}
vm->state = VIR_DOMAIN_RUNNING;
qemudDebug("Reply %s", info);
- free(info);
+ VIR_FREE(info);
return 0;
}
@@ -2230,7 +2222,7 @@
}
}
- if ((out = (char *)malloc(len + 1)) == NULL)
+ if (VIR_ALLOC_N(out, len + 1) < 0)
return NULL;
for (i = j = 0; in[i] != '\0'; i++) {
@@ -2339,7 +2331,7 @@
if ((fd = open(path, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR)) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
_("failed to create '%s'"), path);
- free(xml);
+ VIR_FREE(xml);
return -1;
}
@@ -2347,7 +2339,7 @@
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to write save header"));
close(fd);
- free(xml);
+ VIR_FREE(xml);
return -1;
}
@@ -2355,12 +2347,12 @@
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to write xml"));
close(fd);
- free(xml);
+ VIR_FREE(xml);
return -1;
}
close(fd);
- free(xml);
+ VIR_FREE(xml);
/* Migrate to file */
safe_path = qemudEscapeShellArg(path);
@@ -2374,7 +2366,7 @@
"\"", safe_path) == -1) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("out of memory"));
- free(safe_path);
+ VIR_FREE(safe_path);
return -1;
}
free(safe_path);
@@ -2382,12 +2374,12 @@
if (qemudMonitorCommand(driver, vm, command, &info) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("migrate operation failed"));
- free(command);
+ VIR_FREE(command);
return -1;
}
- free(info);
- free(command);
+ VIR_FREE(info);
+ VIR_FREE(command);
/* Shut it down */
qemudShutdownVMDaemon(dom->conn, driver, vm);
@@ -2622,7 +2614,7 @@
return -1;
}
- if ((xml = (char *)malloc(header.xml_len)) == NULL) {
+ if (VIR_ALLOC_N(xml, header.xml_len) < 0) {
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("out of memory"));
close(fd);
@@ -2633,7 +2625,7 @@
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to read XML"));
close(fd);
- free(xml);
+ VIR_FREE(xml);
return -1;
}
@@ -2642,10 +2634,10 @@
qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("failed to parse XML"));
close(fd);
- free(xml);
+ VIR_FREE(xml);
return -1;
}
- free(xml);
+ VIR_FREE(xml);
/* Ensure the name and UUID don't already exist in an active VM */
vm = qemudFindVMByUUID(driver, def->uuid);
@@ -2688,7 +2680,7 @@
"%s", _("failed to resume domain"));
return -1;
}
- free(info);
+ VIR_FREE(info);
vm->state = VIR_DOMAIN_RUNNING;
}
@@ -2730,7 +2722,7 @@
cleanup:
for (i = 0 ; i < got ; i++)
- free(names[i]);
+ VIR_FREE(names[i]);
return -1;
}
@@ -2830,10 +2822,10 @@
safe_path) == -1) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("out of memory"));
- free(safe_path);
+ VIR_FREE(safe_path);
return -1;
}
- free(safe_path);
+ VIR_FREE(safe_path);
} else if (asprintf(&cmd, "eject cdrom") == -1) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
@@ -2844,11 +2836,11 @@
if (qemudMonitorCommand(driver, vm, cmd, &reply) < 0) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
"%s", _("cannot change cdrom media"));
- free(cmd);
+ VIR_FREE(cmd);
return -1;
}
- free(reply);
- free(cmd);
+ VIR_FREE(reply);
+ VIR_FREE(cmd);
strcpy(olddisk->src, newdisk->src);
olddisk->type = newdisk->type;
return 0;
@@ -2881,7 +2873,7 @@
if (dev->type != QEMUD_DEVICE_DISK || dev->data.disk.device !=
QEMUD_DISK_CDROM) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("only CDROM disk devices can be
attached"));
- free(dev);
+ VIR_FREE(dev);
return -1;
}
@@ -2896,16 +2888,16 @@
if (!disk) {
qemudReportError(dom->conn, dom, NULL, VIR_ERR_NO_SUPPORT,
"%s", _("CDROM not attached, cannot change
media"));
- free(dev);
+ VIR_FREE(dev);
return -1;
}
if (qemudDomainChangeCDROM(dom, vm, disk, &dev->data.disk) < 0) {
- free(dev);
+ VIR_FREE(dev);
return -1;
}
- free(dev);
+ VIR_FREE(dev);
return 0;
}
@@ -3243,7 +3235,7 @@
cleanup:
for (i = 0 ; i < got ; i++)
- free(names[i]);
+ VIR_FREE(names[i]);
return -1;
}
@@ -3271,7 +3263,7 @@
cleanup:
for (i = 0 ; i < got ; i++)
- free(names[i]);
+ VIR_FREE(names[i]);
return -1;
}
diff -r 2069e1bf9132 src/test.c
--- a/src/test.c Thu May 22 14:22:39 2008 -0400
+++ b/src/test.c Thu May 22 17:39:03 2008 -0400
@@ -45,6 +45,7 @@
#include "util.h"
#include "uuid.h"
#include "capabilities.h"
+#include "memory.h"
/* Flags that determine the action to take on a shutdown or crash of a domain
*/
@@ -275,7 +276,7 @@
testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain uuid"));
goto error;
}
- free(str);
+ VIR_FREE(str);
ret = virXPathLong("string(/domain/memory[1])", ctxt, &l);
@@ -309,30 +310,30 @@
if (str != NULL) {
if (!(onReboot = testRestartStringToFlag(str))) {
testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain reboot
behaviour"));
- free(str);
+ VIR_FREE(str);
goto error;
}
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/on_poweroff[1])", ctxt);
if (str != NULL) {
if (!(onPoweroff = testRestartStringToFlag(str))) {
testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain poweroff
behaviour"));
- free(str);
+ VIR_FREE(str);
goto error;
}
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/on_crash[1])", ctxt);
if (str != NULL) {
if (!(onCrash = testRestartStringToFlag(str))) {
testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("domain crash
behaviour"));
- free(str);
+ VIR_FREE(str);
goto error;
}
- free(str);
+ VIR_FREE(str);
}
for (i = 0 ; i < MAX_DOMAINS ; i++) {
@@ -348,7 +349,7 @@
privconn->domains[handle].id = domid;
strncpy(privconn->domains[handle].name, name,
sizeof(privconn->domains[handle].name)-1);
privconn->domains[handle].name[sizeof(privconn->domains[handle].name)-1] =
'\0';
- free(name);
+ VIR_FREE(name);
name = NULL;
if (memory > maxMem)
@@ -371,7 +372,7 @@
error:
xmlXPathFreeContext(ctxt);
- free(name);
+ VIR_FREE(name);
return (-1);
}
@@ -464,7 +465,7 @@
testError(conn, NULL, NULL, VIR_ERR_XML_ERROR, _("network uuid"));
goto error;
}
- free(str);
+ VIR_FREE(str);
forward = virXPathBoolean("count(/network/forward) != 0", ctxt);
@@ -512,10 +513,10 @@
privconn->networks[handle].name[sizeof(privconn->networks[handle].name)-1] =
'\0';
strncpy(privconn->networks[handle].bridge, bridge ? bridge : name,
sizeof(privconn->networks[handle].bridge)-1);
privconn->networks[handle].bridge[sizeof(privconn->networks[handle].bridge)-1]
= '\0';
- free(name);
+ VIR_FREE(name);
name = NULL;
if (bridge) {
- free(bridge);
+ VIR_FREE(bridge);
bridge = NULL;
}
@@ -524,32 +525,32 @@
if (forwardDev) {
strncpy(privconn->networks[handle].forwardDev, forwardDev,
sizeof(privconn->networks[handle].forwardDev)-1);
privconn->networks[handle].forwardDev[sizeof(privconn->networks[handle].forwardDev)-1]
= '\0';
- free(forwardDev);
+ VIR_FREE(forwardDev);
}
strncpy(privconn->networks[handle].ipAddress, ipaddress,
sizeof(privconn->networks[handle].ipAddress)-1);
privconn->networks[handle].ipAddress[sizeof(privconn->networks[handle].ipAddress)-1]
= '\0';
- free(ipaddress);
+ VIR_FREE(ipaddress);
strncpy(privconn->networks[handle].ipNetmask, ipnetmask,
sizeof(privconn->networks[handle].ipNetmask)-1);
privconn->networks[handle].ipNetmask[sizeof(privconn->networks[handle].ipNetmask)-1]
= '\0';
- free(ipnetmask);
+ VIR_FREE(ipnetmask);
strncpy(privconn->networks[handle].dhcpStart, dhcpstart,
sizeof(privconn->networks[handle].dhcpStart)-1);
privconn->networks[handle].dhcpStart[sizeof(privconn->networks[handle].dhcpStart)-1]
= '\0';
- free(dhcpstart);
+ VIR_FREE(dhcpstart);
strncpy(privconn->networks[handle].dhcpEnd, dhcpend,
sizeof(privconn->networks[handle].dhcpEnd)-1);
privconn->networks[handle].dhcpEnd[sizeof(privconn->networks[handle].dhcpEnd)-1] =
'\0';
- free(dhcpend);
+ VIR_FREE(dhcpend);
xmlXPathFreeContext(ctxt);
return (handle);
error:
xmlXPathFreeContext(ctxt);
- free (forwardDev);
- free(ipaddress);
- free(ipnetmask);
- free(dhcpstart);
- free(dhcpend);
- free(name);
+ VIR_FREE (forwardDev);
+ VIR_FREE(ipaddress);
+ VIR_FREE(ipnetmask);
+ VIR_FREE(dhcpstart);
+ VIR_FREE(dhcpend);
+ VIR_FREE(name);
return (-1);
}
@@ -601,8 +602,8 @@
static int testOpenDefault(virConnectPtr conn) {
int u;
struct timeval tv;
- testConnPtr privconn = malloc(sizeof(*privconn));
- if (!privconn) {
+ testConnPtr privconn;
+ if (VIR_ALLOC(privconn) < 0) {
testError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "testConn");
return VIR_DRV_OPEN_ERROR;
}
@@ -677,7 +678,9 @@
offset = strrchr(relativeTo, '/');
if ((baseLen = (offset-relativeTo+1))) {
- char *absFile = malloc(baseLen + strlen(filename) + 1);
+ char *absFile;
+ if (VIR_ALLOC_N(absFile, baseLen + strlen(filename) + 1) < 0)
+ return NULL;
strncpy(absFile, relativeTo, baseLen);
absFile[baseLen] = '\0';
strcat(absFile, filename);
@@ -697,8 +700,8 @@
xmlNodePtr *domains, *networks = NULL;
xmlXPathContextPtr ctxt = NULL;
virNodeInfoPtr nodeInfo;
- testConnPtr privconn = calloc(1, sizeof(*privconn));
- if (!privconn) {
+ testConnPtr privconn;
+ if (VIR_ALLOC(privconn) < 0) {
testError(NULL, NULL, NULL, VIR_ERR_NO_MEMORY, "testConn");
return VIR_DRV_OPEN_ERROR;
}
@@ -794,7 +797,7 @@
if (str != NULL) {
strncpy(nodeInfo->model, str, sizeof(nodeInfo->model)-1);
nodeInfo->model[sizeof(nodeInfo->model)-1] = '\0';
- free(str);
+ VIR_FREE(str);
}
ret = virXPathLong("string(/node/memory[1])", ctxt, &l);
@@ -815,21 +818,21 @@
xmlChar *domFile = xmlGetProp(domains[i], BAD_CAST "file");
char *absFile = testBuildFilename(file, (const char *)domFile);
int domid = privconn->nextDomID++, handle;
- free(domFile);
+ VIR_FREE(domFile);
if (!absFile) {
testError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("resolving domain
filename"));
goto error;
}
if ((handle = testLoadDomainFromFile(conn, domid, absFile)) < 0) {
- free(absFile);
+ VIR_FREE(absFile);
goto error;
}
privconn->domains[handle].config = 1;
- free(absFile);
+ VIR_FREE(absFile);
privconn->numDomains++;
}
if (domains != NULL) {
- free(domains);
+ VIR_FREE(domains);
domains = NULL;
}
@@ -840,21 +843,21 @@
xmlChar *netFile = xmlGetProp(networks[i], BAD_CAST "file");
char *absFile = testBuildFilename(file, (const char *)netFile);
int handle;
- free(netFile);
+ VIR_FREE(netFile);
if (!absFile) {
testError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR, _("resolving
network filename"));
goto error;
}
if ((handle = testLoadNetworkFromFile(conn, absFile)) < 0) {
- free(absFile);
+ VIR_FREE(absFile);
goto error;
}
privconn->networks[handle].config = 1;
- free(absFile);
+ VIR_FREE(absFile);
privconn->numNetworks++;
}
if (networks != NULL) {
- free(networks);
+ VIR_FREE(networks);
networks = NULL;
}
}
@@ -866,13 +869,13 @@
error:
xmlXPathFreeContext(ctxt);
- free(domains);
- free(networks);
+ VIR_FREE(domains);
+ VIR_FREE(networks);
if (xml)
xmlFreeDoc(xml);
if (fd != -1)
close(fd);
- free(privconn);
+ VIR_FREE(privconn);
conn->privateData = NULL;
return VIR_DRV_OPEN_ERROR;
}
@@ -945,7 +948,7 @@
static int testClose(virConnectPtr conn)
{
GET_CONNECTION(conn, -1);
- free (privconn);
+ VIR_FREE (privconn);
conn->privateData = conn;
return 0;
}
@@ -1361,11 +1364,11 @@
if (safewrite(fd, xml, len) < 0) {
testError(domain->conn, domain, NULL, VIR_ERR_INTERNAL_ERROR,
_("cannot write metadata"));
- free(xml);
+ VIR_FREE(xml);
close(fd);
return (-1);
}
- free(xml);
+ VIR_FREE(xml);
if (close(fd) < 0) {
testError(domain->conn, domain, NULL, VIR_ERR_INTERNAL_ERROR,
_("cannot save domain data"));
@@ -1419,8 +1422,7 @@
close(fd);
return (-1);
}
- xml = malloc(len+1);
- if (!xml) {
+ if (VIR_ALLOC_N(xml, len+1) < 0) {
testError(conn, NULL, NULL, VIR_ERR_NO_MEMORY, "xml");
close(fd);
return (-1);
@@ -1435,7 +1437,7 @@
close(fd);
domid = privconn->nextDomID++;
ret = testLoadDomainFromDoc(conn, domid, xml);
- free(xml);
+ VIR_FREE(xml);
return ret < 0 ? -1 : 0;
}
diff -r 2069e1bf9132 src/util.c
--- a/src/util.c Thu May 22 14:22:39 2008 -0400
+++ b/src/util.c Thu May 22 17:39:03 2008 -0400
@@ -48,7 +48,7 @@
#include "event.h"
#include "buf.h"
#include "util.h"
-
+#include "memory.h"
#include "util-lib.c"
#ifndef MIN
@@ -303,19 +303,14 @@
size_t requested;
if (size + BUFSIZ + 1 > alloc) {
- char *new_buf;
-
alloc += alloc / 2;
if (alloc < size + BUFSIZ + 1)
alloc = size + BUFSIZ + 1;
- new_buf = realloc (buf, alloc);
- if (!new_buf) {
+ if (VIR_ALLOC_N(buf, alloc) < 0) {
save_errno = errno;
break;
}
-
- buf = new_buf;
}
/* Ensure that (size + requested <= max_len); */
@@ -359,7 +354,7 @@
}
if (len > maxlen || (int)len != len) {
- free(s);
+ VIR_FREE(s);
virLog("File '%s' is too large %d, max %d",
path, (int)len, maxlen);
goto error;
diff -r 2069e1bf9132 src/xend_internal.c
--- a/src/xend_internal.c Thu May 22 14:22:39 2008 -0400
+++ b/src/xend_internal.c Thu May 22 17:39:03 2008 -0400
@@ -44,6 +44,7 @@
#include "xend_internal.h"
#include "xen_internal.h" /* for DOM0_INTERFACE_VERSION */
#include "xs_internal.h" /* To extract VNC port & Serial console TTY */
+#include "memory.h"
/* required for cpumap_t */
#include <xen/dom0_ops.h>
@@ -630,7 +631,7 @@
content = virBufferContentAndReset(&buf);
ret = http2unix(xend, xend_post(xend, path, content, error, n_error));
- free(content);
+ VIR_FREE(content);
return ret;
}
@@ -825,14 +826,15 @@
urlencode(const char *string)
{
size_t len = strlen(string);
- char *buffer = malloc(len * 3 + 1);
- char *ptr = buffer;
+ char *buffer;
+ char *ptr;
size_t i;
- if (buffer == NULL) {
+ if (VIR_ALLOC_N(buffer, len * 3 + 1) < 0) {
virXendError(NULL, VIR_ERR_NO_MEMORY, _("allocate new buffer"));
return (NULL);
}
+ ptr = buffer;
for (i = 0; i < len; i++) {
switch (string[i]) {
case ' ':
@@ -909,6 +911,7 @@
char *sound_string_to_xml(const char *sound) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
+ char *tmp;
while (sound) {
int modelsize, valid, collision = 0;
@@ -925,15 +928,16 @@
if (STREQ(model, "all")) {
int i;
if (virBufferError(&buf)) {
- free(model);
- goto error;
- }
- free(virBufferContentAndReset(&buf));
+ VIR_FREE(model);
+ goto error;
+ }
+ tmp = virBufferContentAndReset(&buf);
+ VIR_FREE(tmp);
for (i=0; i < sizeof(sound_models)/sizeof(*sound_models); ++i)
virBufferVSprintf(&buf, " <sound
model='%s'/>\n",
sound_models[i]);
- free(model);
+ VIR_FREE(model);
break;
}
}
@@ -944,7 +948,7 @@
virBufferVSprintf(&buf, " <sound
model='%s'/>\n", model);
sound = (model_end ? ++model_end : NULL);
- free(model);
+ VIR_FREE(model);
}
if (virBufferError(&buf))
@@ -952,7 +956,8 @@
return virBufferContentAndReset(&buf);
error:
- free(virBufferContentAndReset(&buf));
+ tmp = virBufferContentAndReset(&buf);
+ VIR_FREE(tmp);
return NULL;
}
@@ -1092,8 +1097,7 @@
count++;
}
- ptr = malloc((count + 1) * sizeof(char *) + extra);
- if (ptr == NULL)
+ if (VIR_ALLOC_N(ptr, count + 1 + extra) < 0)
goto error;
ret = (char **) ptr;
@@ -1149,7 +1153,7 @@
ret = xend_op(xend, "", "op", "create",
"config", ptr, NULL);
serrno = errno;
- free(ptr);
+ VIR_FREE(ptr);
errno = serrno;
return ret;
@@ -1250,10 +1254,8 @@
error:
sexpr_free(root);
- if (domname && *domname) {
- free(*domname);
- *domname = NULL;
- }
+ if (domname)
+ VIR_FREE(*domname);
return (-1);
}
@@ -1694,11 +1696,11 @@
error:
- free(path);
- free(bindHost);
- free(bindPort);
- free(connectHost);
- free(connectPort);
+ VIR_FREE(path);
+ VIR_FREE(bindHost);
+ VIR_FREE(bindPort);
+ VIR_FREE(connectHost);
+ VIR_FREE(connectPort);
return ret;
}
@@ -1723,7 +1725,7 @@
{
struct sexpr *cur, *node;
const char *tmp;
- char *tty;
+ char *tty, *val;
virBuffer buf = VIR_BUFFER_INITIALIZER;
int hvm = 0, bootloader = 0, vfb = 0;
int domid = -1;
@@ -1906,8 +1908,7 @@
goto bad_parse;
}
- drvName = malloc((offset-src)+1);
- if (!drvName) {
+ if (VIR_ALLOC_N(drvName, (offset-src)+1) < 0) {
virXendError(conn, VIR_ERR_NO_MEMORY,
_("allocate new buffer"));
goto bad_parse;
@@ -1925,8 +1926,7 @@
goto bad_parse;
}
- drvType = malloc((offset-src)+1);
- if (!drvType) {
+ if (VIR_ALLOC_N(drvType, (offset-src)+1)< 0) {
virXendError(conn, VIR_ERR_NO_MEMORY,
_("allocate new buffer"));
goto bad_parse;
@@ -2004,8 +2004,8 @@
virBufferAddLit(&buf, " </disk>\n");
bad_parse:
- free(drvName);
- free(drvType);
+ VIR_FREE(drvName);
+ VIR_FREE(drvType);
} else if (sexpr_lookup(node, "device/vif")) {
const char *tmp2, *model;
tmp2 = sexpr_node(node, "device/vif/script");
@@ -2191,7 +2191,7 @@
virBufferAddLit(&buf, " <target port='0'/>\n");
virBufferAddLit(&buf, " </console>\n");
}
- free(tty);
+ VIR_FREE(tty);
if (hvm) {
if (sexpr_node(root, "domain/image/hvm/soundhw")) {
@@ -2200,7 +2200,7 @@
if (tmp && *tmp) {
if ((soundxml = sound_string_to_xml(tmp))) {
virBufferVSprintf(&buf, "%s", soundxml);
- free(soundxml);
+ VIR_FREE(soundxml);
} else {
virXendError(conn, VIR_ERR_INTERNAL_ERROR,
_("parsing soundhw string failed."));
@@ -2221,7 +2221,8 @@
return virBufferContentAndReset(&buf);
error:
- free(virBufferContentAndReset(&buf));
+ val = virBufferContentAndReset(&buf);
+ VIR_FREE(val);
return (NULL);
}
@@ -2379,11 +2380,9 @@
numCpus = sexpr_int(root, "node/nr_cpus");
- cpuset = malloc(numCpus * sizeof(*cpuset));
- if (cpuset == NULL)
+ if (VIR_ALLOC_N(cpuset, numCpus) < 0)
goto memory_error;
- cpuNums = malloc(numCpus * sizeof(*cpuNums));
- if (cpuNums == NULL)
+ if (VIR_ALLOC_N(cpuNums, numCpus) < 0)
goto memory_error;
cur = nodeToCpu;
@@ -2423,21 +2422,21 @@
cpuNums) < 0)
goto memory_error;
}
- free(cpuNums);
- free(cpuset);
+ VIR_FREE(cpuNums);
+ VIR_FREE(cpuset);
return (0);
parse_error:
virXendError(conn, VIR_ERR_XEN_CALL, _("topology syntax error"));
error:
- free(cpuNums);
- free(cpuset);
+ VIR_FREE(cpuNums);
+ VIR_FREE(cpuset);
return (-1);
memory_error:
- free(cpuNums);
- free(cpuset);
+ VIR_FREE(cpuNums);
+ VIR_FREE(cpuset);
virXendError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"));
return (-1);
}
@@ -3269,7 +3268,7 @@
}
error:
- sexpr_free(root);
+ sexpr_free(root);
return(ret);
}
@@ -3302,7 +3301,7 @@
}
error:
- sexpr_free(root);
+ sexpr_free(root);
return(ret);
}
#endif /* ! PROXY */
@@ -3331,11 +3330,11 @@
if (ret == NULL) return NULL;
ret->id = id;
- free(name);
+ VIR_FREE(name);
return (ret);
error:
- free(name);
+ VIR_FREE(name);
return (NULL);
}
@@ -3543,7 +3542,7 @@
}
tmp++;
}
- free(names);
+ VIR_FREE(names);
} else { /* New approach for xen >= 3.0.4 */
char *domname = NULL;
char uuidstr[VIR_UUID_STRING_BUFLEN];
@@ -3569,7 +3568,7 @@
if (ret == NULL) return NULL;
ret->id = id;
- free(name);
+ VIR_FREE(name);
return (ret);
}
@@ -3610,14 +3609,14 @@
if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR,
_("failed to parse domain description"));
- free(sexpr);
- free(name);
+ VIR_FREE(sexpr);
+ VIR_FREE(name);
return (NULL);
}
ret = xenDaemonDomainCreateLinux(conn, sexpr);
- free(sexpr);
+ VIR_FREE(sexpr);
if (ret != 0) {
goto error;
}
@@ -3633,7 +3632,7 @@
if ((ret = xenDaemonDomainResume(dom)) < 0)
goto error;
- free(name);
+ VIR_FREE(name);
return (dom);
@@ -3643,7 +3642,7 @@
xenDaemonDomainDestroy(dom);
virUnrefDomain(dom);
}
- free(name);
+ VIR_FREE(name);
return (NULL);
}
@@ -3683,7 +3682,7 @@
str = virDomainGetOSType(domain);
if (STREQ(str, "hvm"))
hvm = 1;
- free(str);
+ VIR_FREE(str);
sexpr = virParseXMLDevice(domain->conn, xml, hvm, priv->xendConfigVersion);
if (sexpr == NULL)
return (-1);
@@ -3702,7 +3701,7 @@
ret = xend_op(domain->conn, domain->name, "op",
"device_configure",
"config", conf, "dev", ref, NULL);
}
- free(sexpr);
+ VIR_FREE(sexpr);
return ret;
}
@@ -3810,7 +3809,7 @@
// Change the autostart value in place, then define the new sexpr
autonode = sexpr_lookup(root, "domain/on_xend_start");
- free(autonode->u.s.car->u.value);
+ VIR_FREE(autonode->u.s.car->u.value);
autonode->u.s.car->u.value = (autostart ? strdup("start")
: strdup("ignore"));
if (!(autonode->u.s.car->u.value)) {
@@ -3996,7 +3995,7 @@
"port", port,
"resource", "0", /* required, xend ignores it */
NULL);
- free (hostname);
+ VIR_FREE (hostname);
DEBUG0("migration done");
@@ -4028,14 +4027,14 @@
if ((sexpr == NULL) || (name == NULL)) {
virXendError(conn, VIR_ERR_XML_ERROR,
_("failed to parse domain description"));
- free(sexpr);
- free(name);
+ VIR_FREE(sexpr);
+ VIR_FREE(name);
return (NULL);
}
ret = xend_op(conn, "", "op", "new",
"config", sexpr, NULL);
- free(sexpr);
+ VIR_FREE(sexpr);
if (ret != 0) {
fprintf(stderr, _("Failed to create inactive domain %s\n"), name);
goto error;
@@ -4048,7 +4047,7 @@
return (dom);
error:
- free(name);
+ VIR_FREE(name);
return (NULL);
}
int xenDaemonDomainCreate(virDomainPtr domain)
@@ -4318,7 +4317,7 @@
error:
sexpr_free(root);
- free(sched_type);
+ VIR_FREE(sched_type);
return (ret);
}
@@ -4430,7 +4429,7 @@
error:
sexpr_free(root);
- free(sched_type);
+ VIR_FREE(sched_type);
return (ret);
}
diff -r 2069e1bf9132 src/xm_internal.c
--- a/src/xm_internal.c Thu May 22 14:22:39 2008 -0400
+++ b/src/xm_internal.c Thu May 22 17:39:03 2008 -0400
@@ -54,6 +54,7 @@
#include "buf.h"
#include "uuid.h"
#include "util.h"
+#include "memory.h"
static int xenXMConfigSetString(virConfPtr conf, const char *setting,
const char *str);
@@ -241,16 +242,14 @@
/* Had better have a name...*/
if (xenXMConfigGetString(conf, "name", &name) < 0) {
virConfValuePtr value;
- value = malloc(sizeof(*value));
- if (!value) {
+ if (VIR_ALLOC(value) < 0)
return (-1);
- }
/* Set name based on filename */
value->type = VIR_CONF_STRING;
value->str = strdup(filename);
if (!value->str) {
- free(value);
+ VIR_FREE(value);
return (-1);
}
if (virConfSetValue(conf, "name", value) < 0)
@@ -262,10 +261,8 @@
virConfValuePtr value;
char uuidstr[VIR_UUID_STRING_BUFLEN];
- value = malloc(sizeof(*value));
- if (!value) {
+ if (VIR_ALLOC(value) < 0)
return (-1);
- }
/* ... then generate one */
virUUIDGenerate(uuid);
@@ -274,7 +271,7 @@
value->type = VIR_CONF_STRING;
value->str = strdup(uuidstr);
if (!value->str) {
- free(value);
+ VIR_FREE(value);
return (-1);
}
@@ -289,7 +286,7 @@
static void xenXMConfigFree(void *payload, const char *key ATTRIBUTE_UNUSED) {
xenXMConfCachePtr entry = (xenXMConfCachePtr)payload;
virConfFree(entry->conf);
- free(entry);
+ VIR_FREE(entry);
}
@@ -411,7 +408,7 @@
entry->conf = NULL;
} else { /* Completely new entry */
newborn = 1;
- if (!(entry = malloc(sizeof(*entry)))) {
+ if (VIR_ALLOC(entry) < 0) {
xenXMError (conn, VIR_ERR_NO_MEMORY, strerror (errno));
goto cleanup;
}
@@ -424,7 +421,7 @@
if (!newborn) {
virHashRemoveEntry(configCache, path, NULL);
}
- free(entry);
+ VIR_FREE(entry);
continue;
}
@@ -433,7 +430,7 @@
if (!newborn) {
virHashRemoveEntry(configCache, path, NULL);
}
- free(entry);
+ VIR_FREE(entry);
xenXMError (conn, VIR_ERR_INTERNAL_ERROR,
_("xenXMConfigCacheRefresh: name"));
goto cleanup;
@@ -444,7 +441,7 @@
if (newborn) {
if (virHashAddEntry(configCache, entry->filename, entry) < 0) {
virConfFree(entry->conf);
- free(entry);
+ VIR_FREE(entry);
xenXMError (conn, VIR_ERR_INTERNAL_ERROR,
_("xenXMConfigCacheRefresh: virHashAddEntry"));
goto cleanup;
@@ -458,7 +455,7 @@
if (virHashAddEntry(nameConfigMap, domname, entry->filename) < 0) {
virHashRemoveEntry(configCache, ent->d_name, NULL);
virConfFree(entry->conf);
- free(entry);
+ VIR_FREE(entry);
}
}
}
@@ -674,7 +671,7 @@
ranges = virConvertCpuSet(conn, str, 0);
if (ranges != NULL) {
virBufferVSprintf(&buf, " cpuset='%s'", ranges);
- free(ranges);
+ VIR_FREE(ranges);
} else
virBufferVSprintf(&buf, " cpuset='%s'", str);
}
@@ -1064,7 +1061,7 @@
char *soundxml;
if ((soundxml = sound_string_to_xml(str))) {
virBufferVSprintf(&buf, "%s", soundxml);
- free(soundxml);
+ VIR_FREE(soundxml);
} else {
xenXMError(conn, VIR_ERR_INTERNAL_ERROR,
_("parsing soundhw string failed."));
@@ -1085,7 +1082,8 @@
return virBufferContentAndReset(&buf);
error:
- free(virBufferContentAndReset(&buf));
+ str = virBufferContentAndReset(&buf);
+ VIR_FREE(str);
return NULL;
}
@@ -1140,7 +1138,7 @@
if (!(entry = virHashLookup(configCache, filename)))
return (-1);
- if (!(value = malloc(sizeof(*value))))
+ if (VIR_ALLOC(value) < 0)
return (-1);
value->type = VIR_CONF_LONG;
@@ -1182,7 +1180,7 @@
if (!(entry = virHashLookup(configCache, filename)))
return (-1);
- if (!(value = malloc(sizeof(*value))))
+ if (VIR_ALLOC(value) < 0)
return (-1);
value->type = VIR_CONF_LONG;
@@ -1255,7 +1253,7 @@
if (!(entry = virHashLookup(configCache, filename)))
return (-1);
- if (!(value = malloc(sizeof(*value))))
+ if (VIR_ALLOC(value) < 0)
return (-1);
value->type = VIR_CONF_LONG;
@@ -1359,8 +1357,8 @@
ret = 0;
cleanup:
- free(mapstr);
- free(ranges);
+ VIR_FREE(mapstr);
+ VIR_FREE(ranges);
return (ret);
}
@@ -1494,13 +1492,13 @@
priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
if (!(sexpr = virDomainParseXMLDesc(domain->conn, xml, NULL,
priv->xendConfigVersion))) {
- free(xml);
+ VIR_FREE(xml);
return (-1);
}
- free(xml);
+ VIR_FREE(xml);
ret = xenDaemonDomainCreateLinux(domain->conn, sexpr);
- free(sexpr);
+ VIR_FREE(sexpr);
if (ret != 0) {
return (-1);
}
@@ -1531,7 +1529,7 @@
int xenXMConfigSetInt(virConfPtr conf, const char *setting, long l) {
virConfValuePtr value = NULL;
- if (!(value = malloc(sizeof(*value))))
+ if (VIR_ALLOC(value) < 0)
return -1;
value->type = VIR_CONF_LONG;
@@ -1546,13 +1544,13 @@
int xenXMConfigSetString(virConfPtr conf, const char *setting, const char *str) {
virConfValuePtr value = NULL;
- if (!(value = malloc(sizeof(*value))))
+ if (VIR_ALLOC(value) < 0)
return -1;
value->type = VIR_CONF_STRING;
value->next = NULL;
if (!(value->str = strdup(str))) {
- free(value);
+ VIR_FREE(value);
return -1;
}
@@ -1635,7 +1633,8 @@
ret = 0;
error:
- xmlXPathFreeObject(obj);
+ if (obj)
+ xmlXPathFreeObject(obj);
return ret;
}
@@ -1755,7 +1754,7 @@
buflen += 2; /* mode */
- if (!(buf = malloc(buflen)))
+ if (VIR_ALLOC_N(buf, buflen) < 0)
goto cleanup;
if(source) {
@@ -1884,7 +1883,7 @@
if (ip)
buflen += 4 + strlen((const char*)ip);
- if (!(buf = malloc(buflen)))
+ if (VIR_ALLOC_N(buf, buflen) < 0)
goto cleanup;
strcpy(buf, "mac=");
@@ -1918,7 +1917,7 @@
}
cleanup:
- free(bridge);
+ VIR_FREE(bridge);
xmlFree(mac);
xmlFree(source);
xmlFree(script);
@@ -2007,18 +2006,18 @@
ranges = virConvertCpuSet(conn, cpus, 0);
if (ranges != NULL) {
- free(cpus);
+ VIR_FREE(cpus);
if (xenXMConfigSetString(conf, "cpus", ranges) < 0) {
- free(ranges);
+ VIR_FREE(ranges);
goto error;
}
- free(ranges);
+ VIR_FREE(ranges);
} else {
if (xenXMConfigSetString(conf, "cpus", cpus) < 0) {
- free(cpus);
+ VIR_FREE(cpus);
goto error;
}
- free(cpus);
+ VIR_FREE(cpus);
}
}
@@ -2027,6 +2026,7 @@
(obj->stringval != NULL) && STREQ((char*)obj->stringval,
"hvm"))
hvm = 1;
xmlXPathFreeObject(obj);
+ obj = NULL;
priv = (xenUnifiedPrivatePtr) conn->privateData;
@@ -2051,6 +2051,7 @@
boot = "d";
}
xmlXPathFreeObject(obj);
+ obj = NULL;
if (xenXMConfigSetString(conf, "boot", boot) < 0)
goto error;
@@ -2073,6 +2074,7 @@
clockLocal = 1;
}
xmlXPathFreeObject(obj);
+ obj = NULL;
if (xenXMConfigSetInt(conf, "localtime", clockLocal) < 0)
goto error;
@@ -2160,7 +2162,7 @@
obj = xmlXPathEval(BAD_CAST "/domain/devices/graphics", ctxt);
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >=
0)) {
- if (!(vfb = malloc(sizeof(*vfb)))) {
+ if (VIR_ALLOC(vfb) < 0) {
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2192,40 +2194,49 @@
len += 11 + strlen((const char*)vncpasswd);
if (keymap)
len += 8 + strlen((const char*)keymap);
- if ((val = malloc(len)) != NULL) {
- strcpy(val, "type=vnc");
- if (vncunused) {
- strcat(val, ",vncunused=1");
- } else {
- char portstr[50];
- int port = atoi((const char*)vncport);
- snprintf(portstr, sizeof(portstr), "%d",
port-5900);
- strcat(val, ",vncdisplay=");
- strcat(val, portstr);
- }
+ if (VIR_ALLOC_N(val, len) < 0) {
+ xmlFree(type);
xmlFree(vncport);
- if (vnclisten) {
- strcat(val, ",vnclisten=");
- strcat(val, (const char*)vnclisten);
- xmlFree(vnclisten);
- }
- if (vncpasswd) {
- strcat(val, ",vncpasswd=");
- strcat(val, (const char*)vncpasswd);
- xmlFree(vncpasswd);
- }
- if (keymap) {
- strcat(val, ",keymap=");
- strcat(val, (const char*)keymap);
- xmlFree(keymap);
- }
+ xmlFree(vnclisten);
+ xmlFree(vncpasswd);
+ xmlFree(keymap);
+ VIR_FREE(vfb);
+ xenXMError (conn, VIR_ERR_NO_MEMORY, strerror (errno));
+ goto error;
+ }
+ strcpy(val, "type=vnc");
+ if (vncunused) {
+ strcat(val, ",vncunused=1");
+ } else {
+ char portstr[50];
+ int port = atoi((const char*)vncport);
+ snprintf(portstr, sizeof(portstr), "%d", port-5900);
+ strcat(val, ",vncdisplay=");
+ strcat(val, portstr);
+ }
+ xmlFree(vncport);
+ if (vnclisten) {
+ strcat(val, ",vnclisten=");
+ strcat(val, (const char*)vnclisten);
+ xmlFree(vnclisten);
+ }
+ if (vncpasswd) {
+ strcat(val, ",vncpasswd=");
+ strcat(val, (const char*)vncpasswd);
+ xmlFree(vncpasswd);
+ }
+ if (keymap) {
+ strcat(val, ",keymap=");
+ strcat(val, (const char*)keymap);
+ xmlFree(keymap);
}
}
xmlFree(type);
if (val) {
virConfValuePtr disp;
- if (!(disp = malloc(sizeof(*disp)))) {
- free(val);
+ if (VIR_ALLOC(disp) < 0) {
+ VIR_FREE(val);
+ VIR_FREE(vfb);
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2246,7 +2257,7 @@
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0))
{
virConfValuePtr disks;
- if (!(disks = malloc(sizeof(*disks)))) {
+ if (VIR_ALLOC(disks) < 0) {
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2255,11 +2266,14 @@
for (i = obj->nodesetval->nodeNr -1 ; i >= 0 ; i--) {
virConfValuePtr thisDisk;
char *disk = NULL;
- if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm,
priv->xendConfigVersion, &disk) < 0)
+ if (xenXMParseXMLDisk(obj->nodesetval->nodeTab[i], hvm,
priv->xendConfigVersion, &disk) < 0) {
+ virConfFreeValue(disks);
goto error;
+ }
if (disk) {
- if (!(thisDisk = malloc(sizeof(*thisDisk)))) {
- free(disk);
+ if (VIR_ALLOC(thisDisk) < 0) {
+ VIR_FREE(disk);
+ virConfFreeValue(disks);
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2278,7 +2292,7 @@
if ((obj != NULL) && (obj->type == XPATH_NODESET) &&
(obj->nodesetval != NULL) && (obj->nodesetval->nodeNr >= 0))
{
virConfValuePtr vifs;
- if (!(vifs = malloc(sizeof(*vifs)))) {
+ if (VIR_ALLOC(vifs) < 0) {
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2287,10 +2301,13 @@
for (i = obj->nodesetval->nodeNr - 1; i >= 0; i--) {
virConfValuePtr thisVif;
char *vif = xenXMParseXMLVif(conn, obj->nodesetval->nodeTab[i], hvm);
- if (!vif)
+ if (!vif) {
+ virConfFreeValue(vifs);
goto error;
- if (!(thisVif = malloc(sizeof(*thisVif)))) {
- free(vif);
+ }
+ if (VIR_ALLOC(thisVif) < 0) {
+ VIR_FREE(vif);
+ virConfFreeValue(vifs);
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2344,10 +2361,10 @@
if (!(soundstr = virBuildSoundStringFromXML(conn, ctxt)))
goto error;
if (xenXMConfigSetString(conf, "soundhw", soundstr) < 0) {
- free(soundstr);
+ VIR_FREE(soundstr);
goto error;
}
- free(soundstr);
+ VIR_FREE(soundstr);
}
}
@@ -2463,7 +2480,7 @@
goto error;
}
- if (!(entry = calloc(1, sizeof(*entry)))) {
+ if (VIR_ALLOC(entry) < 0) {
xenXMError(conn, VIR_ERR_NO_MEMORY, _("config"));
goto error;
}
@@ -2505,7 +2522,7 @@
return (ret);
error:
- free(entry);
+ VIR_FREE(entry);
if (conf)
virConfFree(conf);
return (NULL);
@@ -2712,7 +2729,7 @@
ret = 0;
cleanup:
- free(domxml);
+ VIR_FREE(domxml);
xmlXPathFreeObject(obj);
xmlXPathFreeContext(ctxt);
if (doc)
@@ -2803,11 +2820,11 @@
list_val = list_val->next;
}
} else if (!list_item) {
- if (!(list_item = calloc(1, sizeof(virConfValue))))
+ if (VIR_ALLOC(list_item) < 0)
goto cleanup;
list_item->type = VIR_CONF_LIST;
if(virConfSetValue(entry->conf, "disk", list_item)) {
- free(list_item);
+ VIR_FREE(list_item);
goto cleanup;
}
list_val = NULL;
@@ -2817,7 +2834,7 @@
if (!list_val) {
/* insert */
- if (!(list_val = malloc(sizeof(virConfValue))))
+ if (VIR_ALLOC(list_val) < 0)
goto cleanup;
list_val->type = VIR_CONF_STRING;
list_val->next = NULL;
@@ -2828,7 +2845,7 @@
prev->next = list_val;
} else {
/* configure */
- free(list_val->str);
+ VIR_FREE(list_val->str);
list_val->str = dev;
}
@@ -2836,9 +2853,9 @@
goto cleanup;
cleanup:
- free(type);
- free(source);
- free(target);
+ VIR_FREE(type);
+ VIR_FREE(source);
+ VIR_FREE(target);
return (ret);
}
@@ -2912,7 +2929,7 @@
if (virMacAddrCompare (dommac, (const char *) mac) == 0) {
if (autoassign) {
- free(mac);
+ VIR_FREE(mac);
mac = NULL;
if (!(mac = (xmlChar *)xenXMAutoAssignMac()))
goto cleanup;
@@ -2929,11 +2946,11 @@
list_val = list_val->next;
}
} else if (!list_item) {
- if (!(list_item = calloc(1, sizeof(virConfValue))))
+ if (VIR_ALLOC(list_item) < 0)
goto cleanup;
list_item->type = VIR_CONF_LIST;
if(virConfSetValue(entry->conf, "vif", list_item)) {
- free(list_item);
+ VIR_FREE(list_item);
goto cleanup;
}
list_val = NULL;
@@ -2948,28 +2965,28 @@
while (node_cur->next)
node_cur = node_cur->next;
- if (!(node_tmp = calloc(1, sizeof(xmlNode))))
+ if (VIR_ALLOC(node_tmp) < 0)
goto node_cleanup;
node_tmp->type = XML_ELEMENT_NODE;
- if (!(node_tmp->name = malloc(4)))
+ if (VIR_ALLOC_N(node_tmp->name, 4) < 0)
goto node_cleanup;
strcpy((char *)node_tmp->name, "mac");
node_tmp->children = NULL;
- if (!(attr_node = calloc(1, sizeof(xmlAttr))))
+ if (VIR_ALLOC(attr_node) < 0)
goto node_cleanup;
attr_node->type = XML_ATTRIBUTE_NODE;
attr_node->ns = NULL;
- if (!(attr_node->name = malloc(8)))
+ if (VIR_ALLOC_N(attr_node->name, 8) < 0)
goto node_cleanup;
strcpy((char *) attr_node->name, "address");
node_tmp->properties = attr_node;
- if (!(text_node = calloc(1, sizeof(xmlNode))))
+ if (VIR_ALLOC(text_node) < 0)
goto node_cleanup;
text_node->type = XML_TEXT_NODE;
text_node->_private = NULL;
- if (!(text_node->name = malloc(8)))
+ if (VIR_ALLOC_N(text_node->name, 5) < 0)
goto node_cleanup;
strcpy((char *) text_node->name, "text");
text_node->children = NULL;
@@ -2989,7 +3006,7 @@
if (!list_val) {
/* insert */
- if (!(list_val = malloc(sizeof(virConfValue))))
+ if (VIR_ALLOC(list_val) < 0)
goto cleanup;
list_val->type = VIR_CONF_STRING;
list_val->next = NULL;
@@ -3000,7 +3017,7 @@
prev->next = list_val;
} else {
/* configure */
- free(list_val->str);
+ VIR_FREE(list_val->str);
list_val->str = dev;
}
@@ -3012,9 +3029,9 @@
xmlFree(attr_node);
xmlFree(text_node);
cleanup:
- free(type);
- free(source);
- free(mac);
+ VIR_FREE(type);
+ VIR_FREE(source);
+ VIR_FREE(mac);
return (ret);
}
@@ -3031,7 +3048,7 @@
xenXMAutoAssignMac() {
char *buf;
- if (!(buf = malloc(18)))
+ if (VIR_ALLOC_N(buf, 18) < 0)
return 0;
srand((unsigned)time(NULL));
sprintf(buf, "00:16:3e:%02x:%02x:%02x"
@@ -3198,13 +3215,13 @@
else {
if (!prev) {
virConfValuePtr value;
- if (!(value = calloc(1, sizeof(virConfValue))))
+ if (VIR_ALLOC(value) < 0)
goto cleanup;
value->type = VIR_CONF_LIST;
value->list = list_val->next;
list_val->next = NULL;
if (virConfSetValue(entry->conf, device, value)) {
- free(value);
+ VIR_FREE(value);
goto cleanup;
}
} else
@@ -3223,9 +3240,9 @@
xmlXPathFreeContext(ctxt);
if (doc)
xmlFreeDoc(doc);
- free(domdevice);
- free(key);
- free(list_val);
+ VIR_FREE(domdevice);
+ VIR_FREE(key);
+ VIR_FREE(list_val);
return (ret);
}
diff -r 2069e1bf9132 src/xml.c
--- a/src/xml.c Thu May 22 14:22:39 2008 -0400
+++ b/src/xml.c Thu May 22 17:39:03 2008 -0400
@@ -28,6 +28,7 @@
#include "xml.h"
#include "buf.h"
#include "util.h"
+#include "memory.h"
#include "xs_internal.h" /* for xenStoreDomainGetNetworkID */
#include "xen_unified.h"
#include "xend_internal.h" /* for is_sound_* functions */
@@ -276,19 +277,18 @@
if (maxcpu <= 0)
maxcpu = 4096;
- cpuset = calloc(maxcpu, sizeof(*cpuset));
- if (cpuset == NULL) {
+ if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0);
return(NULL);
}
ret = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
if (ret < 0) {
- free(cpuset);
+ VIR_FREE(cpuset);
return(NULL);
}
res = virSaveCpuSet(conn, cpuset, maxcpu);
- free(cpuset);
+ VIR_FREE(cpuset);
return (res);
}
@@ -311,7 +311,7 @@
char *sound;
xmlNodePtr *nodes = NULL;
- if (!(sound = calloc(1, size+1))) {
+ if (VIR_ALLOC_N(sound, size + 1) < 0) {
virXMLError(conn, VIR_ERR_NO_MEMORY,
_("failed to allocate sound string"), 0);
return NULL;
@@ -334,7 +334,7 @@
if (!is_sound_model_valid(model)) {
virXMLError(conn, VIR_ERR_XML_ERROR,
_("unknown sound model type"), 0);
- free(model);
+ VIR_FREE(model);
goto error;
}
@@ -347,21 +347,21 @@
if (*sound && (size >= (strlen(model) + 1))) {
strncat(sound, ",", size--);
} else if (*sound || size < strlen(model)) {
- free(model);
+ VIR_FREE(model);
continue;
}
strncat(sound, model, size);
size -= strlen(model);
}
- free(model);
+ VIR_FREE(model);
}
}
- free(nodes);
+ VIR_FREE(nodes);
return sound;
error:
- free(nodes);
+ VIR_FREE(nodes);
return NULL;
}
#endif /* !PROXY */
@@ -592,11 +592,11 @@
ret = obj->nodesetval->nodeNr;
if (list != NULL) {
- *list = malloc(ret * sizeof(**list));
- if (*list == NULL) {
+ if (VIR_ALLOC_N(*list, ret) < 0) {
virXMLError(NULL, VIR_ERR_NO_MEMORY,
_("allocate string array"),
ret * sizeof(**list));
+ ret = -1;
} else {
memcpy(*list, obj->nodesetval->nodeTab,
ret * sizeof(xmlNodePtr));
@@ -1028,7 +1028,7 @@
fdfile = xmlGetProp(cur, BAD_CAST "file");
if (fdfile != NULL) {
virBufferVSprintf(buf, "(fda '%s')", fdfile);
- free(fdfile);
+ VIR_FREE(fdfile);
}
}
@@ -1042,7 +1042,7 @@
fdfile = xmlGetProp(cur, BAD_CAST "file");
if (fdfile != NULL) {
virBufferVSprintf(buf, "(fdb '%s')", fdfile);
- free(fdfile);
+ VIR_FREE(fdfile);
}
}
@@ -1120,7 +1120,7 @@
}
xmlFree(bus);
}
- free(nodes);
+ VIR_FREE(nodes);
nodes = NULL;
}
@@ -1159,19 +1159,19 @@
if (!(soundstr = virBuildSoundStringFromXML(conn, ctxt)))
goto error;
virBufferVSprintf(buf, "(soundhw '%s')", soundstr);
- free(soundstr);
+ VIR_FREE(soundstr);
}
str = virXPathString("string(/domain/clock/@offset)", ctxt);
if (str != NULL && STREQ(str, "localtime")) {
virBufferAddLit(buf, "(localtime 1)");
}
- free(str);
+ VIR_FREE(str);
return (0);
error:
- free(nodes);
+ VIR_FREE(nodes);
return (-1);
}
@@ -1533,7 +1533,7 @@
}
virNetworkFree(network);
virBufferVSprintf(buf, "(bridge '%s')", bridge);
- free(bridge);
+ VIR_FREE(bridge);
}
}
if (script != NULL)
@@ -1580,7 +1580,7 @@
{
xmlDocPtr xml = NULL;
xmlNodePtr node;
- char *nam = NULL;
+ char *nam = NULL, *tmp;
virBuffer buf = VIR_BUFFER_INITIALIZER;
xmlChar *prop;
xmlParserCtxtPtr pctxt;
@@ -1677,30 +1677,29 @@
* it in a range format guaranteed to be understood by Xen.
*/
if (maxcpu > 0) {
- cpuset = malloc(maxcpu * sizeof(*cpuset));
- if (cpuset != NULL) {
- res = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
- if (res > 0) {
- ranges = virSaveCpuSet(conn, cpuset, maxcpu);
- if (ranges != NULL) {
- virBufferVSprintf(&buf, "(cpus '%s')",
ranges);
- free(ranges);
- }
+ if (VIR_ALLOC_N(cpuset, maxcpu) < 0) {
+ virXMLError(conn, VIR_ERR_NO_MEMORY, xmldesc, 0);
+ goto error;
+ }
+ res = virParseCpuSet(conn, &cur, 0, cpuset, maxcpu);
+ if (res > 0) {
+ ranges = virSaveCpuSet(conn, cpuset, maxcpu);
+ if (ranges != NULL) {
+ virBufferVSprintf(&buf, "(cpus '%s')",
ranges);
+ VIR_FREE(ranges);
}
- free(cpuset);
- if (res < 0)
- goto error;
- } else {
- virXMLError(conn, VIR_ERR_NO_MEMORY, xmldesc, 0);
}
+ VIR_FREE(cpuset);
+ if (res < 0)
+ goto error;
}
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/uuid[1])", ctxt);
if (str != NULL) {
virBufferVSprintf(&buf, "(uuid '%s')", str);
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/bootloader[1])", ctxt);
@@ -1711,7 +1710,7 @@
* significant and should be discarded
*/
bootloader = 1;
- free(str);
+ VIR_FREE(str);
} else if (virXPathNumber("count(/domain/bootloader)", ctxt, &f) == 0
&& (f > 0)) {
virBufferAddLit(&buf, "(bootloader)");
@@ -1728,25 +1727,25 @@
* ignore the bootloader_args value unless a bootloader was specified
*/
virBufferVSprintf(&buf, "(bootloader_args '%s')", str);
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/on_poweroff[1])", ctxt);
if (str != NULL) {
virBufferVSprintf(&buf, "(on_poweroff '%s')", str);
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/on_reboot[1])", ctxt);
if (str != NULL) {
virBufferVSprintf(&buf, "(on_reboot '%s')", str);
- free(str);
+ VIR_FREE(str);
}
str = virXPathString("string(/domain/on_crash[1])", ctxt);
if (str != NULL) {
virBufferVSprintf(&buf, "(on_crash '%s')", str);
- free(str);
+ VIR_FREE(str);
}
if (!bootloader) {
@@ -1812,11 +1811,11 @@
res = virDomainParseXMLDiskDesc(conn, nodes[i], &buf,
hvm, xendConfigVersion);
if (res != 0) {
- free(nodes);
+ VIR_FREE(nodes);
goto error;
}
}
- free(nodes);
+ VIR_FREE(nodes);
}
nb_nodes = virXPathNodeSet("/domain/devices/interface", ctxt, &nodes);
@@ -1827,12 +1826,12 @@
virDomainParseXMLIfDesc(conn, nodes[i], &buf, hvm,
xendConfigVersion);
if (res != 0) {
- free(nodes);
+ VIR_FREE(nodes);
goto error;
}
virBufferAddLit(&buf, ")");
}
- free(nodes);
+ VIR_FREE(nodes);
}
/* New style PV graphics config xen >= 3.0.4,
@@ -1844,11 +1843,11 @@
for (i = 0; i < nb_nodes; i++) {
res = virDomainParseXMLGraphicsDescVFB(conn, nodes[i], &buf);
if (res != 0) {
- free(nodes);
+ VIR_FREE(nodes);
goto error;
}
}
- free(nodes);
+ VIR_FREE(nodes);
}
}
@@ -1862,7 +1861,7 @@
if (name != NULL)
*name = nam;
else
- free(nam);
+ VIR_FREE(nam);
if (virBufferError(&buf)) {
virXMLError(conn, VIR_ERR_NO_MEMORY, _("allocate buffer"), 0);
@@ -1872,7 +1871,7 @@
return virBufferContentAndReset(&buf);
error:
- free(nam);
+ VIR_FREE(nam);
if (name != NULL)
*name = NULL;
xmlXPathFreeContext(ctxt);
@@ -1880,7 +1879,8 @@
xmlFreeDoc(xml);
if (pctxt != NULL)
xmlFreeParserCtxt(pctxt);
- free(virBufferContentAndReset(&buf));
+ tmp = virBufferContentAndReset(&buf);
+ VIR_FREE(tmp);
return (NULL);
}
diff -r 2069e1bf9132 tests/virshtest.c
--- a/tests/virshtest.c Thu May 22 14:22:39 2008 -0400
+++ b/tests/virshtest.c Thu May 22 17:39:04 2008 -0400
@@ -9,7 +9,7 @@
#include "testutils.h"
static char *progname;
-static char *abs_top_srcdir;
+static char *abs_srcdir;
#define MAX_FILE 4096
static int testFilterLine(char *buffer,
@@ -36,7 +36,7 @@
char *actualPtr = &(actualData[0]);
char expect[PATH_MAX];
- snprintf(expect, sizeof expect - 1, "%s/tests/%s", abs_top_srcdir,
expect_rel);
+ snprintf(expect, sizeof expect - 1, "%s/%s", abs_srcdir, expect_rel);
if (virtTestLoadFile(expect, &expectPtr, MAX_FILE) < 0)
return -1;
@@ -271,24 +271,25 @@
-int
-main(int argc, char **argv)
+static int
+mymain(int argc, char **argv)
{
int ret = 0;
char buffer[PATH_MAX];
+ char cwd[PATH_MAX];
- abs_top_srcdir = getenv("abs_top_srcdir");
- if (!abs_top_srcdir)
- return 1;
+ abs_srcdir = getenv("abs_srcdir");
+ if (!abs_srcdir)
+ abs_srcdir = getcwd(cwd, sizeof(cwd));
- snprintf(buffer, PATH_MAX-1, "test://%s/docs/testnode.xml",
abs_top_srcdir);
+ snprintf(buffer, PATH_MAX-1, "test://%s/../docs/testnode.xml",
abs_srcdir);
buffer[PATH_MAX-1] = '\0';
progname = argv[0];
custom_uri = buffer;
if (argc > 1) {
fprintf(stderr, "Usage: %s\n", progname);
- exit(EXIT_FAILURE);
+ return(EXIT_FAILURE);
}
if (virtTestRun("virsh list (default)",
@@ -355,5 +356,7 @@
1, testCompareDomstateByName, NULL) != 0)
ret = -1;
- exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
+ return(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
}
+
+VIRT_TEST_MAIN(mymain)
--
|: Red Hat, Engineering, Boston -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|