diff options
author | Karel Zak | 2013-05-09 13:06:02 +0200 |
---|---|---|
committer | Karel Zak | 2013-05-09 13:06:02 +0200 |
commit | 4fb18cde32a6cb672090762c785d89a6ed02ef57 (patch) | |
tree | 69bea7d192de264264af0ea92a07fe8a0b827029 /libfdisk/src/ask.c | |
parent | libmount: use MS_SILENT for /{proc,etc}/filesystems (diff) | |
download | kernel-qcow2-util-linux-4fb18cde32a6cb672090762c785d89a6ed02ef57.tar.gz kernel-qcow2-util-linux-4fb18cde32a6cb672090762c785d89a6ed02ef57.tar.xz kernel-qcow2-util-linux-4fb18cde32a6cb672090762c785d89a6ed02ef57.zip |
libfdisk: do not use va_list in the Ask API
# fdisk /dev/sda
Welcome to fdisk (util-linux 2.23).
[...]
Command (m for help): a
Segmentation fault (core dumped)
It's too fragile, the va_list implementation is architecture specific
and it seems we need such thing in libfdisk at all.
Reported-by: "Gabor Z. Papp" <gzp@papp.hu>
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libfdisk/src/ask.c')
-rw-r--r-- | libfdisk/src/ask.c | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c index d2325d5fe..cdb4d0124 100644 --- a/libfdisk/src/ask.c +++ b/libfdisk/src/ask.c @@ -18,11 +18,6 @@ void fdisk_reset_ask(struct fdisk_ask *ask) case FDISK_ASKTYPE_NUMBER: free(ask->data.num.range); break; - case FDISK_ASKTYPE_WARNX: - case FDISK_ASKTYPE_WARN: - if (ask->data.print.has_va) - va_end(ask->data.print.va); - break; default: break; } @@ -452,44 +447,32 @@ int fdisk_ask_print_set_mesg(struct fdisk_ask *ask, const char *mesg) return 0; } -/* caller has to call va_end(ap) */ -int fdisk_ask_print_get_va(struct fdisk_ask *ask, va_list ap) -{ - assert(ask); - assert(is_print_ask(ask)); - va_copy(ap, ask->data.print.va); - return 0; -} - -/* note that fdisk_free_ask() calls va_end() to free the private va list. */ -int fdisk_ask_print_set_va(struct fdisk_ask *ask, va_list ap) -{ - assert(ask); - va_copy(ask->data.print.va, ap); - ask->data.print.has_va = 1; - return 0; -} - static int do_vprint(struct fdisk_context *cxt, int errnum, int type, const char *fmt, va_list va) { struct fdisk_ask *ask; int rc; + char *mesg; assert(cxt); + if (vasprintf(&mesg, fmt, va) < 0) + return -ENOMEM; + ask = fdisk_new_ask(); - if (!ask) + if (!ask) { + free(mesg); return -ENOMEM; + } fdisk_ask_set_type(ask, type); - fdisk_ask_print_set_mesg(ask, fmt); - fdisk_ask_print_set_va(ask, va); + fdisk_ask_print_set_mesg(ask, mesg); if (errnum >= 0) fdisk_ask_print_set_errno(ask, errnum); rc = fdisk_do_ask(cxt, ask); fdisk_free_ask(ask); + free(mesg); return rc; } |