]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libfdisk: do not use va_list in the Ask API
authorKarel Zak <kzak@redhat.com>
Thu, 9 May 2013 11:06:02 +0000 (13:06 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 9 May 2013 11:06:02 +0000 (13:06 +0200)
  # 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
libfdisk/src/ask.c
libfdisk/src/fdiskP.h
libfdisk/src/libfdisk.h

index 7495d8515ffd1181b93e55063c6f7502445e6401..61dc0c2df22949d1d6a4b683733d9df9031f03f1 100644 (file)
@@ -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);
index d2325d5fe07cbfa317c9e214ec115c3944c1599e..cdb4d0124184608d64f4eed8f01f7fce5e186d94 100644 (file)
@@ -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;
 }
 
index 570108c93f1dbc482d2a7c84207018d150117c3c..ce42860d9b0cf35ea53a015e90b84c9b10dfa33e 100644 (file)
@@ -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 */
index 0a23236ea163e51b14b3a9d82aa8165f84743775..8a440672b3fc20abe1a05ebca468bf33e526310b 100644 (file)
@@ -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
 }