summaryrefslogtreecommitdiffstats
path: root/package/network/utils/nftables/patches/203-erec-use-stdio-vasprintf-instead-of-gmp_vasprintf.patch
blob: dc4d965497e33aaf821f4184f184bf3d2c9aac41 (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
From ee23bda1e4a85243fa02dc712f0f323e366dbf8c Mon Sep 17 00:00:00 2001
From: Steven Barth <cyrus@openwrt.org>
Date: Mon, 15 Dec 2014 14:14:46 +0100
Subject: [PATCH 3/5] erec: use stdio vasprintf instead of gmp_vasprintf

Use stdio's vasprintf instead of gmp_vasprintf which is not part
of the mini-gmp function subset. Furthermore convert the only
gmp-specific user and allow the compiler to verify format-strings.

Signed-off-by: Steven Barth <cyrus@openwrt.org>
---
 src/erec.c     | 6 +++++-
 src/evaluate.c | 8 ++++++--
 2 files changed, 11 insertions(+), 3 deletions(-)

--- a/src/erec.c
+++ b/src/erec.c
@@ -44,6 +44,7 @@ static void erec_destroy(struct error_re
 	xfree(erec);
 }
 
+__attribute__((format(printf, 3, 0)))
 struct error_record *erec_vcreate(enum error_record_types type,
 				  const struct location *loc,
 				  const char *fmt, va_list ap)
@@ -55,10 +56,13 @@ struct error_record *erec_vcreate(enum e
 	erec->num_locations	= 0;
 	erec_add_location(erec, loc);
 
-	gmp_vasprintf(&erec->msg, fmt, ap);
+	if (vasprintf(&erec->msg, fmt, ap) < 0)
+		erec->msg = NULL;
+
 	return erec;
 }
 
+__attribute__((format(printf, 3, 4)))
 struct error_record *erec_create(enum error_record_types type,
 				 const struct location *loc,
 				 const char *fmt, ...)
--- a/src/evaluate.c
+++ b/src/evaluate.c
@@ -232,9 +232,13 @@ static int expr_evaluate_value(struct ev
 	case TYPE_INTEGER:
 		mpz_init_bitmask(mask, ctx->ectx.len);
 		if (mpz_cmp((*expr)->value, mask) > 0) {
+			char *valstr = mpz_get_str(NULL, 10, (*expr)->value);
+			char *rangestr = mpz_get_str(NULL, 10, mask);
 			expr_error(ctx->msgs, *expr,
-				   "Value %Zu exceeds valid range 0-%Zu",
-				   (*expr)->value, mask);
+				   "Value %s exceeds valid range 0-%s",
+				   valstr, rangestr);
+			free(valstr);
+			free(rangestr);
 			mpz_clear(mask);
 			return -1;
 		}