summaryrefslogtreecommitdiff
path: root/libdaemon/client
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2014-09-15 15:33:56 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2014-09-16 11:42:40 +0200
commit1ce21c19d5894b889a6d8da67c8a159709c3dda9 (patch)
treefa28d304876ef7be0061557178f8752545626c30 /libdaemon/client
parentb9c16b750694c4ec03d05bc9e4a12cecc4d9450f (diff)
downloadlvm2-1ce21c19d5894b889a6d8da67c8a159709c3dda9.tar.gz
va_list: properly pass va_list through functions
Code should not just pass va_list arg through the function as args could be passed in many strange ways. Use va_copy(). For details look in i.e.: http://julipedia.meroh.net/2011/09/using-vacopy-to-safely-pass-ap.html
Diffstat (limited to 'libdaemon/client')
-rw-r--r--libdaemon/client/daemon-client.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/libdaemon/client/daemon-client.c b/libdaemon/client/daemon-client.c
index a11b60448..d0b8951c7 100644
--- a/libdaemon/client/daemon-client.c
+++ b/libdaemon/client/daemon-client.c
@@ -129,12 +129,16 @@ daemon_reply daemon_send_simple_v(daemon_handle h, const char *id, va_list ap)
static const daemon_reply err = { .error = ENOMEM };
daemon_request rq = { .cft = NULL };
daemon_reply repl;
+ va_list apc;
+ va_copy(apc, ap);
if (!buffer_append_f(&rq.buffer, "request = %s", id, NULL) ||
- !buffer_append_vf(&rq.buffer, ap)) {
+ !buffer_append_vf(&rq.buffer, apc)) {
+ va_end(apc);
buffer_destroy(&rq.buffer);
return err;
}
+ va_end(apc);
repl = daemon_send(h, rq);
buffer_destroy(&rq.buffer);
@@ -181,13 +185,17 @@ bad:
int daemon_request_extend_v(daemon_request r, va_list ap)
{
+ int res;
+ va_list apc;
+
if (!r.cft)
return 0;
- if (!config_make_nodes_v(r.cft, NULL, r.cft->root, ap))
- return 0;
+ va_copy(apc, ap);
+ res = config_make_nodes_v(r.cft, NULL, r.cft->root, apc) ? 1 : 0;
+ va_end(apc);
- return 1;
+ return res;
}
int daemon_request_extend(daemon_request r, ...)