diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2012-10-12 10:57:01 +0200 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2012-10-12 10:59:10 +0200 |
commit | f2a5d3ae3a457059bc7de7cf3fce8eb092ac03dd (patch) | |
tree | d6f8ee397be3b946b30e82e81b038e73c71432ba /libdaemon/client | |
parent | 5c792f620b3448a6bbbe7dc10f9210ad3383d977 (diff) | |
download | lvm2-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.c | 33 |
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); } |