aboutsummaryrefslogtreecommitdiffstats
path: root/meta-networking/recipes-daemons/iscsi-initiator-utils/files/0001-Fix-i586-build-issues-with-string-length-overflow.patch
blob: f945c636f72ce181dd160f0452beff65db3012cf (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
From 24ce8f62e042e69497e1299212504c356179e15b Mon Sep 17 00:00:00 2001
From: Lee Duncan <lduncan@suse.com>
Date: Tue, 6 Nov 2018 11:16:06 -0800
Subject: [PATCH] Fix i586 build issues with string length overflow.

Gcc7 warns of possible string print overflow, on i586,
when printing password length (via a macro), generating
errors like:

[   59s]   ^~~~~~~~~~~~~~~~~~~~
[   59s] In file included from /usr/include/stdio.h:862:0,
[   59s]                  from idbm.h:27,
[   59s]                  from context.h:22,
[   59s]                  from idbm.c:59:
[   59s] /usr/include/bits/stdio2.h:64:10: note:
'__builtin___snprintf_chk' output between 2 and 11 bytes into a
destination of size 8
[   59s]    return __builtin___snprintf_chk (__s, __n,
__USE_FORTIFY_LEVEL - 1,
[   59s]           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~
[   59s]         __bos (__s), __fmt, __va_arg_pack ());
[   59s]         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[   59s] cc1: all warnings being treated as errors
[   59s] make[1]: *** [<builtin>: idbm.o] Error 1
[   59s] make[1]: Leaving directory

The fix is to limit the size of the string printed, so that no
overflow is possible.

The print macros in usr/idbm.c were updated, as well, to match
the newer version in libopeniscsiusr/idbm.c, also to help the
i586 build.

Upstream-Status: Backport[https://github.com/open-iscsi/open-iscsi/commit/24ce8f62e042e69497e1299212504c356179e15b]

Signed-off-by: Mingli Yu <mingli.yu@windriver.com>
---
 libopeniscsiusr/idbm.c |  2 +-
 usr/idbm.c             | 11 ++++++-----
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/libopeniscsiusr/idbm.c b/libopeniscsiusr/idbm.c
index 7724de2..055dd9a 100644
--- a/libopeniscsiusr/idbm.c
+++ b/libopeniscsiusr/idbm.c
@@ -676,7 +676,7 @@ updated:
 	if (!passwd_done && !strcmp(#_param, name)) { \
 		passwd_done = 1; \
 		name = #_param "_length"; \
-		snprintf(passwd_len, 8, "%d", (int)strlen(value)); \
+		snprintf(passwd_len, 8, "%.7d", (int)strlen(value) & 0xffff); \
 		value = passwd_len; \
 		goto setup_passwd_len; \
 	}
diff --git a/usr/idbm.c b/usr/idbm.c
index a0207e2..89a6c27 100644
--- a/usr/idbm.c
+++ b/usr/idbm.c
@@ -30,6 +30,7 @@
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/file.h>
+#include <inttypes.h>
 
 #include "idbm.h"
 #include "idbm_fields.h"
@@ -65,7 +66,7 @@ static struct idbm *db;
 #define __recinfo_int(_key, _info, _rec, _name, _show, _n, _mod) do { \
 	_info[_n].type = TYPE_INT; \
 	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
-	snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \
+	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIi32, _rec->_name); \
 	_info[_n].data = &_rec->_name; \
 	_info[_n].data_len = sizeof(_rec->_name); \
 	_info[_n].visible = _show; \
@@ -76,7 +77,7 @@ static struct idbm *db;
 #define __recinfo_uint8(_key, _info, _rec, _name, _show, _n, _mod) do { \
 	_info[_n].type = TYPE_UINT8; \
 	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
-	snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \
+	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu8, _rec->_name); \
 	_info[_n].data = &_rec->_name; \
 	_info[_n].data_len = sizeof(_rec->_name); \
 	_info[_n].visible = _show; \
@@ -87,7 +88,7 @@ static struct idbm *db;
 #define __recinfo_uint16(_key, _info, _rec, _name, _show, _n, _mod) do { \
 	_info[_n].type = TYPE_UINT16; \
 	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
-	snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \
+	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu16, _rec->_name); \
 	_info[_n].data = &_rec->_name; \
 	_info[_n].data_len = sizeof(_rec->_name); \
 	_info[_n].visible = _show; \
@@ -98,7 +99,7 @@ static struct idbm *db;
 #define __recinfo_uint32(_key, _info, _rec, _name, _show, _n, _mod) do { \
 	_info[_n].type = TYPE_UINT32; \
 	strlcpy(_info[_n].name, _key, NAME_MAXVAL); \
-	snprintf(_info[_n].value, VALUE_MAXVAL, "%d", _rec->_name); \
+	snprintf(_info[_n].value, VALUE_MAXVAL, "%" PRIu32, _rec->_name); \
 	_info[_n].data = &_rec->_name; \
 	_info[_n].data_len = sizeof(_rec->_name); \
 	_info[_n].visible = _show; \
@@ -1041,7 +1042,7 @@ updated:
 	if (!passwd_done && !strcmp(#_param, name)) { \
 		passwd_done = 1; \
 		name = #_param "_length"; \
-		snprintf(passwd_len, 8, "%d", (int)strlen(value)); \
+		snprintf(passwd_len, 8, "%.7" PRIi32, (int)strlen(value) & 0xffff); \
 		value = passwd_len; \
 		goto setup_passwd_len; \
 	}
-- 
2.7.4