summaryrefslogtreecommitdiff
path: root/core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch
diff options
context:
space:
mode:
Diffstat (limited to 'core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch')
-rw-r--r--core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch163
1 files changed, 163 insertions, 0 deletions
diff --git a/core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch b/core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch
new file mode 100644
index 000000000..86bb6e572
--- /dev/null
+++ b/core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch
@@ -0,0 +1,163 @@
+From 4fb18cde32a6cb672090762c785d89a6ed02ef57 Mon Sep 17 00:00:00 2001
+From: Karel Zak <kzak@redhat.com>
+Date: Thu, 9 May 2013 13:06:02 +0200
+Subject: [PATCH] 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>
+---
+ fdisks/fdisk-ask.c | 13 +++----------
+ libfdisk/src/ask.c | 35 +++++++++--------------------------
+ libfdisk/src/fdiskP.h | 2 --
+ libfdisk/src/libfdisk.h | 2 --
+ 4 files changed, 12 insertions(+), 40 deletions(-)
+
+diff --git a/fdisks/fdisk-ask.c b/fdisks/fdisk-ask.c
+index 7495d85..61dc0c2 100644
+--- a/fdisks/fdisk-ask.c
++++ b/fdisks/fdisk-ask.c
+@@ -167,7 +167,6 @@ static int ask_offset(struct fdisk_context *cxt,
+ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
+ void *data __attribute__((__unused__)))
+ {
+- va_list ap;
+ int rc = 0;
+ char buf[BUFSIZ];
+
+@@ -180,23 +179,17 @@ int ask_callback(struct fdisk_context *cxt, struct fdisk_ask *ask,
+ case FDISK_ASKTYPE_OFFSET:
+ return ask_offset(cxt, ask, buf, sizeof(buf));
+ case FDISK_ASKTYPE_INFO:
+- fdisk_ask_print_get_va(ask, ap);
+- vfprintf(stdout, fdisk_ask_print_get_mesg(ask), ap);
++ fputs(fdisk_ask_print_get_mesg(ask), stdout);
+ fputc('\n', stdout);
+- va_end(ap);
+ break;
+ case FDISK_ASKTYPE_WARNX:
+- fdisk_ask_print_get_va(ask, ap);
+- vfprintf(stderr, fdisk_ask_print_get_mesg(ask), ap);
++ fputs(fdisk_ask_print_get_mesg(ask), stderr);
+ fputc('\n', stderr);
+- va_end(ap);
+ break;
+ case FDISK_ASKTYPE_WARN:
+- fdisk_ask_print_get_va(ask, ap);
+- vfprintf(stderr, fdisk_ask_print_get_mesg(ask), ap);
++ fputs(fdisk_ask_print_get_mesg(ask), stderr);
+ errno = fdisk_ask_print_get_errno(ask);
+ fprintf(stderr, ": %m\n");
+- va_end(ap);
+ break;
+ case FDISK_ASKTYPE_YESNO:
+ fputc('\n', stdout);
+diff --git a/libfdisk/src/ask.c b/libfdisk/src/ask.c
+index d2325d5..cdb4d01 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;
+ }
+
+diff --git a/libfdisk/src/fdiskP.h b/libfdisk/src/fdiskP.h
+index 570108c..ce42860 100644
+--- a/libfdisk/src/fdiskP.h
++++ b/libfdisk/src/fdiskP.h
+@@ -231,8 +231,6 @@ struct fdisk_ask {
+ /* FDISK_ASKTYPE_{WARN,WARNX,..} */
+ struct ask_print {
+ const char *mesg;
+- va_list va;
+- unsigned int has_va:1;
+ int errnum; /* errno */
+ } print;
+ /* FDISK_ASKTYPE_YESNO */
+diff --git a/libfdisk/src/libfdisk.h b/libfdisk/src/libfdisk.h
+index 0a23236..8a44067 100644
+--- a/libfdisk/src/libfdisk.h
++++ b/libfdisk/src/libfdisk.h
+@@ -182,8 +182,6 @@ extern int fdisk_ask_print_get_errno(struct fdisk_ask *ask);
+ extern int fdisk_ask_print_set_errno(struct fdisk_ask *ask, int errnum);
+ extern const char *fdisk_ask_print_get_mesg(struct fdisk_ask *ask);
+ extern int fdisk_ask_print_set_mesg(struct fdisk_ask *ask, const char *mesg);
+-extern int fdisk_ask_print_get_va(struct fdisk_ask *ask, va_list ap);
+-extern int fdisk_ask_print_set_va(struct fdisk_ask *ask, va_list ap);
+
+ #ifdef __cplusplus
+ }
+--
+1.8.2.3
+