summaryrefslogtreecommitdiff
path: root/core/util-linux/0001-libfdisk-do-not-use-va_list-in-the-Ask-API.patch
blob: 86bb6e5721c16f9bbc86129b0454c74975f72347 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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