summaryrefslogtreecommitdiff
path: root/libdaemon/client
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2012-10-12 10:57:01 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2012-10-12 10:59:10 +0200
commitf2a5d3ae3a457059bc7de7cf3fce8eb092ac03dd (patch)
treed6f8ee397be3b946b30e82e81b038e73c71432ba /libdaemon/client
parent5c792f620b3448a6bbbe7dc10f9210ad3383d977 (diff)
downloadlvm2-f2a5d3ae3a457059bc7de7cf3fce8eb092ac03dd.tar.gz
lvmetad: validate dm_asprintf in buffer_append_vf
Check result of dm_asprintf Check buffer_append result Declare vars in front
Diffstat (limited to 'libdaemon/client')
-rw-r--r--libdaemon/client/config-util.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/libdaemon/client/config-util.c b/libdaemon/client/config-util.c
index a65a2cce7..8a6dced55 100644
--- a/libdaemon/client/config-util.c
+++ b/libdaemon/client/config-util.c
@@ -23,9 +23,12 @@
int buffer_append_vf(struct buffer *buf, va_list ap)
{
- char *append;
+ char *append = NULL;
char *next;
int keylen;
+ int64_t value;
+ char *string;
+ char *block;
while ((next = va_arg(ap, char *))) {
if (!strchr(next, '=')) {
@@ -34,21 +37,25 @@ int buffer_append_vf(struct buffer *buf, va_list ap)
}
keylen = strchr(next, '=') - next;
if (strstr(next, "%d") || strstr(next, "%" PRId64)) {
- int64_t value = va_arg(ap, int64_t);
- dm_asprintf(&append, "%.*s= %" PRId64 "\n", keylen, next, value);
+ value = va_arg(ap, int64_t);
+ if (!dm_asprintf(&append, "%.*s= %" PRId64 "\n", keylen, next, value) < 0)
+ goto fail;
} else if (strstr(next, "%s")) {
- char *value = va_arg(ap, char *);
- dm_asprintf(&append, "%.*s= \"%s\"\n", keylen, next, value);
+ string = va_arg(ap, char *);
+ if (!dm_asprintf(&append, "%.*s= \"%s\"\n", keylen, next, string) < 0)
+ goto fail;
} else if (strstr(next, "%b")) {
- char *block = va_arg(ap, char *);
- if (!block)
+ if (!(block = va_arg(ap, char *)))
continue;
- dm_asprintf(&append, "%.*s%s", keylen, next, block);
- } else {
- dm_asprintf(&append, "%s", next);
- }
- if (!append) goto fail;
- buffer_append(buf, append);
+ if (!dm_asprintf(&append, "%.*s%s", keylen, next, block) < 0)
+ goto fail;
+ } else if (!dm_asprintf(&append, "%s", next) < 0)
+ goto fail;
+
+ if (!append ||
+ !buffer_append(buf, append))
+ return 0;
+
dm_free(append);
}