diff options
Diffstat (limited to 'meta/recipes-support/libnl/libnl')
3 files changed, 631 insertions, 0 deletions
diff --git a/meta/recipes-support/libnl/libnl/0001-lib-add-utility-function-nl_strerror_l.patch b/meta/recipes-support/libnl/libnl/0001-lib-add-utility-function-nl_strerror_l.patch new file mode 100644 index 0000000000..b734028c73 --- /dev/null +++ b/meta/recipes-support/libnl/libnl/0001-lib-add-utility-function-nl_strerror_l.patch | |||
@@ -0,0 +1,146 @@ | |||
1 | From 683f27fbb68ca2028a7b3468f17164d484df2759 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <adraszik@tycoint.com> | ||
3 | Date: Thu, 25 Aug 2016 13:14:59 +0100 | ||
4 | Subject: [PATCH 1/3] lib: add utility function nl_strerror_l() | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | libnl currently uses strerror_r() throughout, but this is | ||
10 | problematic because there is a non-standard GNU version | ||
11 | implemented in glibc, and the standard POSIX version, which | ||
12 | differ in signature. When using glibc, one can choose | ||
13 | between the two versions using feature test macros | ||
14 | _GNU_SOURCE and _POSIX_C_SOURCE. | ||
15 | |||
16 | Given libnl is built using the former, we always get the | ||
17 | glibc special version, and all code so far has been written | ||
18 | for that non-standard version. | ||
19 | |||
20 | Other C libraries like musl on the other hand only try | ||
21 | to be posix compliant, and only ever provide the posix | ||
22 | version of strerror_r(), which has a different signature. | ||
23 | |||
24 | The alternative is to use strerror_l() rather than | ||
25 | strerror_r() http://austingroupbugs.net/view.php?id=655 | ||
26 | - this will avoid the non-confirming versions issue | ||
27 | - strerror_l() is now recommended by POSIX to replace | ||
28 | strerror_r() usage | ||
29 | |||
30 | So rather than changing all uses of strerror_r() to be in | ||
31 | line with posix, we are going to switch to the recommended | ||
32 | interface strerror_l(). | ||
33 | |||
34 | Since strerror_l() is slightly more difficuly to use, we | ||
35 | add a little (private) wrapper that we can use from all | ||
36 | current callsites of strerror_r(). | ||
37 | |||
38 | Signed-off-by: André Draszik <adraszik@tycoint.com> | ||
39 | Reviewed-by: Stephane Ayotte <sayotte@tycoint.com> | ||
40 | Signed-off-by: Thomas Haller <thaller@redhat.com> | ||
41 | --- | ||
42 | Upstream-Status: Backport https://github.com/thom311/libnl/commit/683f27fbb68ca2028a7b3468f17164d484df2759 | ||
43 | include/Makefile.am | 1 + | ||
44 | include/netlink-private/utils.h | 17 +++++++++++++++++ | ||
45 | lib/utils.c | 24 ++++++++++++++++++++++++ | ||
46 | libnl-3.sym | 5 +++++ | ||
47 | 4 files changed, 47 insertions(+) | ||
48 | create mode 100644 include/netlink-private/utils.h | ||
49 | |||
50 | diff --git a/include/Makefile.am b/include/Makefile.am | ||
51 | index 804e984..f8b977a 100644 | ||
52 | --- a/include/Makefile.am | ||
53 | +++ b/include/Makefile.am | ||
54 | @@ -166,6 +166,7 @@ noinst_HEADERS = \ | ||
55 | netlink-private/socket.h \ | ||
56 | netlink-private/tc.h \ | ||
57 | netlink-private/types.h \ | ||
58 | + netlink-private/utils.h \ | ||
59 | netlink-private/cache-api.h \ | ||
60 | netlink-private/object-api.h \ | ||
61 | netlink-private/route/link/api.h \ | ||
62 | diff --git a/include/netlink-private/utils.h b/include/netlink-private/utils.h | ||
63 | new file mode 100644 | ||
64 | index 0000000..77aadb3 | ||
65 | --- /dev/null | ||
66 | +++ b/include/netlink-private/utils.h | ||
67 | @@ -0,0 +1,17 @@ | ||
68 | +/* | ||
69 | + * netlink-private/utils.h Local Utility Functions | ||
70 | + * | ||
71 | + * This library is free software; you can redistribute it and/or | ||
72 | + * modify it under the terms of the GNU Lesser General Public | ||
73 | + * License as published by the Free Software Foundation version 2.1 | ||
74 | + * of the License. | ||
75 | + * | ||
76 | + * Copyright (c) 2003-2012 Thomas Graf <tgraf@suug.ch> | ||
77 | + */ | ||
78 | + | ||
79 | +#ifndef NETLINK_UTILS_PRIV_H_ | ||
80 | +#define NETLINK_UTILS_PRIV_H_ | ||
81 | + | ||
82 | +extern const char * nl_strerror_l(int err); | ||
83 | + | ||
84 | +#endif | ||
85 | diff --git a/lib/utils.c b/lib/utils.c | ||
86 | index 61c3d95..c1c1b72 100644 | ||
87 | --- a/lib/utils.c | ||
88 | +++ b/lib/utils.c | ||
89 | @@ -25,10 +25,12 @@ | ||
90 | */ | ||
91 | |||
92 | #include <netlink-private/netlink.h> | ||
93 | +#include <netlink-private/utils.h> | ||
94 | #include <netlink/netlink.h> | ||
95 | #include <netlink/utils.h> | ||
96 | #include <linux/socket.h> | ||
97 | #include <stdlib.h> /* exit() */ | ||
98 | +#include <locale.h> | ||
99 | |||
100 | /** | ||
101 | * Global variable indicating the desired level of debugging output. | ||
102 | @@ -118,6 +120,28 @@ int __nl_read_num_str_file(const char *path, int (*cb)(long, const char *)) | ||
103 | |||
104 | return 0; | ||
105 | } | ||
106 | + | ||
107 | +const char *nl_strerror_l(int err) | ||
108 | +{ | ||
109 | + int errno_save = errno; | ||
110 | + locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0); | ||
111 | + const char *buf; | ||
112 | + | ||
113 | + if (loc == (locale_t)0) { | ||
114 | + if (errno == ENOENT) | ||
115 | + loc = newlocale(LC_MESSAGES_MASK, | ||
116 | + "POSIX", (locale_t)0); | ||
117 | + } | ||
118 | + if (loc != (locale_t)0) { | ||
119 | + buf = strerror_l(err, loc); | ||
120 | + freelocale(loc); | ||
121 | + } else { | ||
122 | + buf = "newlocale() failed"; | ||
123 | + } | ||
124 | + | ||
125 | + errno = errno_save; | ||
126 | + return buf; | ||
127 | +} | ||
128 | /** @endcond */ | ||
129 | |||
130 | /** | ||
131 | diff --git a/libnl-3.sym b/libnl-3.sym | ||
132 | index 4e09bdd..9119e66 100644 | ||
133 | --- a/libnl-3.sym | ||
134 | +++ b/libnl-3.sym | ||
135 | @@ -351,3 +351,8 @@ libnl_3_2_28 { | ||
136 | global: | ||
137 | nl_object_diff64; | ||
138 | } libnl_3_2_27; | ||
139 | + | ||
140 | +libnl_3_2_29 { | ||
141 | +global: | ||
142 | + nl_strerror_l; | ||
143 | +} libnl_3_2_28; | ||
144 | -- | ||
145 | 2.9.3 | ||
146 | |||
diff --git a/meta/recipes-support/libnl/libnl/0002-lib-switch-to-using-strerror_l-instead-of-strerror_r.patch b/meta/recipes-support/libnl/libnl/0002-lib-switch-to-using-strerror_l-instead-of-strerror_r.patch new file mode 100644 index 0000000000..6347ec0b91 --- /dev/null +++ b/meta/recipes-support/libnl/libnl/0002-lib-switch-to-using-strerror_l-instead-of-strerror_r.patch | |||
@@ -0,0 +1,403 @@ | |||
1 | From c1948ec29b8dcdc58d2d92700c325abdeab111a6 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <adraszik@tycoint.com> | ||
3 | Date: Thu, 25 Aug 2016 13:15:00 +0100 | ||
4 | Subject: [PATCH 2/3] lib: switch to using strerror_l() instead of strerror_r() | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | glibc provides two versions of strerror_r(), which | ||
10 | can be chosen between using feature test macros | ||
11 | _GNU_SOURCE and _POSIX_C_SOURCE. libnl is built using | ||
12 | the former, hence we get the glibc special version, | ||
13 | and all code so far has been written for this. | ||
14 | |||
15 | Other C libraries like musl on the other hand only try | ||
16 | to be posix compliant, and only ever provide the posix | ||
17 | version of strerror_r(), which has a different signature. | ||
18 | |||
19 | Uses in libnl hence generally cause printf() of an *int* | ||
20 | with a *string format* specifier for that reason. | ||
21 | |||
22 | Additionally, strerror_r() has been deprecated: | ||
23 | http://austingroupbugs.net/view.php?id=655 | ||
24 | |||
25 | Switch to using strerror_l() (via our wrapper just | ||
26 | introduced). | ||
27 | |||
28 | Signed-off-by: André Draszik <adraszik@tycoint.com> | ||
29 | Reviewed-by: Stephane Ayotte <sayotte@tycoint.com> | ||
30 | Signed-off-by: Thomas Haller <thaller@redhat.com> | ||
31 | --- | ||
32 | Upstream-Status: Backport https://github.com/thom311/libnl/commit/c1948ec29b8dcdc58d2d92700c325abdeab111a6 | ||
33 | lib/cache_mngr.c | 5 ++--- | ||
34 | lib/fib_lookup/lookup.c | 3 ++- | ||
35 | lib/handlers.c | 4 ++-- | ||
36 | lib/msg.c | 4 ++-- | ||
37 | lib/nl.c | 26 +++++++++----------------- | ||
38 | lib/route/route_obj.c | 3 ++- | ||
39 | lib/socket.c | 33 +++++++++++---------------------- | ||
40 | 7 files changed, 30 insertions(+), 48 deletions(-) | ||
41 | |||
42 | diff --git a/lib/cache_mngr.c b/lib/cache_mngr.c | ||
43 | index b9eb345..1f23eb1 100644 | ||
44 | --- a/lib/cache_mngr.c | ||
45 | +++ b/lib/cache_mngr.c | ||
46 | @@ -33,6 +33,7 @@ | ||
47 | */ | ||
48 | |||
49 | #include <netlink-private/netlink.h> | ||
50 | +#include <netlink-private/utils.h> | ||
51 | #include <netlink/netlink.h> | ||
52 | #include <netlink/cache.h> | ||
53 | #include <netlink/utils.h> | ||
54 | @@ -392,10 +393,8 @@ int nl_cache_mngr_poll(struct nl_cache_mngr *mngr, int timeout) | ||
55 | ret = poll(&fds, 1, timeout); | ||
56 | NL_DBG(3, "Cache manager %p, poll() returned %d\n", mngr, ret); | ||
57 | if (ret < 0) { | ||
58 | - char buf[64]; | ||
59 | - | ||
60 | NL_DBG(4, "nl_cache_mngr_poll(%p): poll() failed with %d (%s)\n", | ||
61 | - mngr, errno, strerror_r(errno, buf, sizeof(buf))); | ||
62 | + mngr, errno, nl_strerror_l(errno)); | ||
63 | return -nl_syserr2nlerr(errno); | ||
64 | } | ||
65 | |||
66 | diff --git a/lib/fib_lookup/lookup.c b/lib/fib_lookup/lookup.c | ||
67 | index 43b6126..efc862b 100644 | ||
68 | --- a/lib/fib_lookup/lookup.c | ||
69 | +++ b/lib/fib_lookup/lookup.c | ||
70 | @@ -17,6 +17,7 @@ | ||
71 | */ | ||
72 | |||
73 | #include <netlink-private/netlink.h> | ||
74 | +#include <netlink-private/utils.h> | ||
75 | #include <netlink/netlink.h> | ||
76 | #include <netlink/attr.h> | ||
77 | #include <netlink/utils.h> | ||
78 | @@ -133,7 +134,7 @@ static void result_dump_line(struct nl_object *obj, struct nl_dump_params *p) | ||
79 | nl_rtntype2str(res->fr_type, buf, sizeof(buf))); | ||
80 | nl_dump(p, "scope %s error %s (%d)\n", | ||
81 | rtnl_scope2str(res->fr_scope, buf, sizeof(buf)), | ||
82 | - strerror_r(-res->fr_error, buf, sizeof(buf)), res->fr_error); | ||
83 | + nl_strerror_l(-res->fr_error), res->fr_error); | ||
84 | } | ||
85 | |||
86 | static void result_dump_details(struct nl_object *obj, struct nl_dump_params *p) | ||
87 | diff --git a/lib/handlers.c b/lib/handlers.c | ||
88 | index 97a0d9c..4a48b99 100644 | ||
89 | --- a/lib/handlers.c | ||
90 | +++ b/lib/handlers.c | ||
91 | @@ -26,6 +26,7 @@ | ||
92 | */ | ||
93 | |||
94 | #include <netlink-private/netlink.h> | ||
95 | +#include <netlink-private/utils.h> | ||
96 | #include <netlink/netlink.h> | ||
97 | #include <netlink/utils.h> | ||
98 | #include <netlink/msg.h> | ||
99 | @@ -79,10 +80,9 @@ static int nl_error_handler_verbose(struct sockaddr_nl *who, | ||
100 | struct nlmsgerr *e, void *arg) | ||
101 | { | ||
102 | FILE *ofd = arg ? arg : stderr; | ||
103 | - char buf[256]; | ||
104 | |||
105 | fprintf(ofd, "-- Error received: %s\n-- Original message: ", | ||
106 | - strerror_r(-e->error, buf, sizeof(buf))); | ||
107 | + nl_strerror_l(-e->error)); | ||
108 | print_header_content(ofd, &e->msg); | ||
109 | fprintf(ofd, "\n"); | ||
110 | |||
111 | diff --git a/lib/msg.c b/lib/msg.c | ||
112 | index e8a7e99..9af3f3a 100644 | ||
113 | --- a/lib/msg.c | ||
114 | +++ b/lib/msg.c | ||
115 | @@ -27,6 +27,7 @@ | ||
116 | */ | ||
117 | |||
118 | #include <netlink-private/netlink.h> | ||
119 | +#include <netlink-private/utils.h> | ||
120 | #include <netlink/netlink.h> | ||
121 | #include <netlink/utils.h> | ||
122 | #include <netlink/cache.h> | ||
123 | @@ -913,11 +914,10 @@ static void dump_error_msg(struct nl_msg *msg, FILE *ofd) | ||
124 | fprintf(ofd, " [ERRORMSG] %zu octets\n", sizeof(*err)); | ||
125 | |||
126 | if (nlmsg_len(hdr) >= sizeof(*err)) { | ||
127 | - char buf[256]; | ||
128 | struct nl_msg *errmsg; | ||
129 | |||
130 | fprintf(ofd, " .error = %d \"%s\"\n", err->error, | ||
131 | - strerror_r(-err->error, buf, sizeof(buf))); | ||
132 | + nl_strerror_l(-err->error)); | ||
133 | fprintf(ofd, " [ORIGINAL MESSAGE] %zu octets\n", sizeof(*hdr)); | ||
134 | |||
135 | errmsg = nlmsg_inherit(&err->msg); | ||
136 | diff --git a/lib/nl.c b/lib/nl.c | ||
137 | index 123f657..a45c3ea 100644 | ||
138 | --- a/lib/nl.c | ||
139 | +++ b/lib/nl.c | ||
140 | @@ -27,6 +27,7 @@ | ||
141 | |||
142 | #include <netlink-private/netlink.h> | ||
143 | #include <netlink-private/socket.h> | ||
144 | +#include <netlink-private/utils.h> | ||
145 | #include <netlink/netlink.h> | ||
146 | #include <netlink/utils.h> | ||
147 | #include <netlink/handlers.h> | ||
148 | @@ -105,7 +106,6 @@ int nl_connect(struct nl_sock *sk, int protocol) | ||
149 | int errsv; | ||
150 | socklen_t addrlen; | ||
151 | struct sockaddr_nl local = { 0 }; | ||
152 | - char buf[64]; | ||
153 | int try_bind = 1; | ||
154 | |||
155 | #ifdef SOCK_CLOEXEC | ||
156 | @@ -119,7 +119,7 @@ int nl_connect(struct nl_sock *sk, int protocol) | ||
157 | if (sk->s_fd < 0) { | ||
158 | errsv = errno; | ||
159 | NL_DBG(4, "nl_connect(%p): socket() failed with %d (%s)\n", sk, errsv, | ||
160 | - strerror_r(errsv, buf, sizeof(buf))); | ||
161 | + nl_strerror_l(errsv)); | ||
162 | err = -nl_syserr2nlerr(errsv); | ||
163 | goto errout; | ||
164 | } | ||
165 | @@ -158,7 +158,7 @@ int nl_connect(struct nl_sock *sk, int protocol) | ||
166 | _nl_socket_used_ports_set(used_ports, port); | ||
167 | } else { | ||
168 | NL_DBG(4, "nl_connect(%p): bind() for port %u failed with %d (%s)\n", | ||
169 | - sk, (unsigned) port, errsv, strerror_r(errsv, buf, sizeof(buf))); | ||
170 | + sk, (unsigned) port, errsv, nl_strerror_l(errsv)); | ||
171 | _nl_socket_used_ports_release_all(used_ports); | ||
172 | err = -nl_syserr2nlerr(errsv); | ||
173 | goto errout; | ||
174 | @@ -172,7 +172,7 @@ int nl_connect(struct nl_sock *sk, int protocol) | ||
175 | if (err != 0) { | ||
176 | errsv = errno; | ||
177 | NL_DBG(4, "nl_connect(%p): bind() failed with %d (%s)\n", | ||
178 | - sk, errsv, strerror_r(errsv, buf, sizeof(buf))); | ||
179 | + sk, errsv, nl_strerror_l(errsv)); | ||
180 | err = -nl_syserr2nlerr(errsv); | ||
181 | goto errout; | ||
182 | } | ||
183 | @@ -183,7 +183,7 @@ int nl_connect(struct nl_sock *sk, int protocol) | ||
184 | &addrlen); | ||
185 | if (err < 0) { | ||
186 | NL_DBG(4, "nl_connect(%p): getsockname() failed with %d (%s)\n", | ||
187 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
188 | + sk, errno, nl_strerror_l(errno)); | ||
189 | err = -nl_syserr2nlerr(errno); | ||
190 | goto errout; | ||
191 | } | ||
192 | @@ -280,10 +280,8 @@ int nl_sendto(struct nl_sock *sk, void *buf, size_t size) | ||
193 | ret = sendto(sk->s_fd, buf, size, 0, (struct sockaddr *) | ||
194 | &sk->s_peer, sizeof(sk->s_peer)); | ||
195 | if (ret < 0) { | ||
196 | - char errbuf[64]; | ||
197 | - | ||
198 | NL_DBG(4, "nl_sendto(%p): sendto() failed with %d (%s)\n", | ||
199 | - sk, errno, strerror_r(errno, errbuf, sizeof(errbuf))); | ||
200 | + sk, errno, nl_strerror_l(errno)); | ||
201 | return -nl_syserr2nlerr(errno); | ||
202 | } | ||
203 | |||
204 | @@ -343,10 +341,8 @@ int nl_sendmsg(struct nl_sock *sk, struct nl_msg *msg, struct msghdr *hdr) | ||
205 | |||
206 | ret = sendmsg(sk->s_fd, hdr, 0); | ||
207 | if (ret < 0) { | ||
208 | - char errbuf[64]; | ||
209 | - | ||
210 | NL_DBG(4, "nl_sendmsg(%p): sendmsg() failed with %d (%s)\n", | ||
211 | - sk, errno, strerror_r(errno, errbuf, sizeof(errbuf))); | ||
212 | + sk, errno, nl_strerror_l(errno)); | ||
213 | return -nl_syserr2nlerr(errno); | ||
214 | } | ||
215 | |||
216 | @@ -706,15 +702,13 @@ retry: | ||
217 | goto abort; | ||
218 | } | ||
219 | if (n < 0) { | ||
220 | - char errbuf[64]; | ||
221 | - | ||
222 | if (errno == EINTR) { | ||
223 | NL_DBG(3, "recvmsg() returned EINTR, retrying\n"); | ||
224 | goto retry; | ||
225 | } | ||
226 | |||
227 | NL_DBG(4, "nl_sendmsg(%p): nl_recv() failed with %d (%s)\n", | ||
228 | - sk, errno, strerror_r(errno, errbuf, sizeof(errbuf))); | ||
229 | + sk, errno, nl_strerror_l(errno)); | ||
230 | retval = -nl_syserr2nlerr(errno); | ||
231 | goto abort; | ||
232 | } | ||
233 | @@ -980,10 +974,8 @@ continue_reading: | ||
234 | goto out; | ||
235 | } | ||
236 | } else if (e->error) { | ||
237 | - char buf[64]; | ||
238 | - | ||
239 | NL_DBG(4, "recvmsgs(%p): RTNETLINK responded with %d (%s)\n", | ||
240 | - sk, -e->error, strerror_r(-e->error, buf, sizeof(buf))); | ||
241 | + sk, -e->error, nl_strerror_l(-e->error)); | ||
242 | |||
243 | /* Error message reported back from kernel. */ | ||
244 | if (cb->cb_err) { | ||
245 | diff --git a/lib/route/route_obj.c b/lib/route/route_obj.c | ||
246 | index 7347ed2..21b67b1 100644 | ||
247 | --- a/lib/route/route_obj.c | ||
248 | +++ b/lib/route/route_obj.c | ||
249 | @@ -31,6 +31,7 @@ | ||
250 | */ | ||
251 | |||
252 | #include <netlink-private/netlink.h> | ||
253 | +#include <netlink-private/utils.h> | ||
254 | #include <netlink/netlink.h> | ||
255 | #include <netlink/cache.h> | ||
256 | #include <netlink/utils.h> | ||
257 | @@ -259,7 +260,7 @@ static void route_dump_details(struct nl_object *a, struct nl_dump_params *p) | ||
258 | if ((r->ce_mask & ROUTE_ATTR_CACHEINFO) && r->rt_cacheinfo.rtci_error) { | ||
259 | nl_dump_line(p, " cacheinfo error %d (%s)\n", | ||
260 | r->rt_cacheinfo.rtci_error, | ||
261 | - strerror_r(-r->rt_cacheinfo.rtci_error, buf, sizeof(buf))); | ||
262 | + nl_strerror_l(-r->rt_cacheinfo.rtci_error)); | ||
263 | } | ||
264 | |||
265 | if (r->ce_mask & ROUTE_ATTR_METRICS) { | ||
266 | diff --git a/lib/socket.c b/lib/socket.c | ||
267 | index 97b2f69..55153b4 100644 | ||
268 | --- a/lib/socket.c | ||
269 | +++ b/lib/socket.c | ||
270 | @@ -33,6 +33,7 @@ | ||
271 | |||
272 | #include <netlink-private/netlink.h> | ||
273 | #include <netlink-private/socket.h> | ||
274 | +#include <netlink-private/utils.h> | ||
275 | #include <netlink/netlink.h> | ||
276 | #include <netlink/utils.h> | ||
277 | #include <netlink/handlers.h> | ||
278 | @@ -449,11 +450,9 @@ int nl_socket_add_memberships(struct nl_sock *sk, int group, ...) | ||
279 | err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, | ||
280 | &group, sizeof(group)); | ||
281 | if (err < 0) { | ||
282 | - char buf[64]; | ||
283 | - | ||
284 | va_end(ap); | ||
285 | NL_DBG(4, "nl_socket_add_memberships(%p): setsockopt() failed with %d (%s)\n", | ||
286 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
287 | + sk, errno, nl_strerror_l(errno)); | ||
288 | return -nl_syserr2nlerr(errno); | ||
289 | } | ||
290 | |||
291 | @@ -501,11 +500,9 @@ int nl_socket_drop_memberships(struct nl_sock *sk, int group, ...) | ||
292 | err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_DROP_MEMBERSHIP, | ||
293 | &group, sizeof(group)); | ||
294 | if (err < 0) { | ||
295 | - char buf[64]; | ||
296 | - | ||
297 | va_end(ap); | ||
298 | NL_DBG(4, "nl_socket_drop_memberships(%p): setsockopt() failed with %d (%s)\n", | ||
299 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
300 | + sk, errno, nl_strerror_l(errno)); | ||
301 | return -nl_syserr2nlerr(errno); | ||
302 | } | ||
303 | |||
304 | @@ -619,7 +616,6 @@ int nl_socket_set_fd(struct nl_sock *sk, int protocol, int fd) | ||
305 | { | ||
306 | int err = 0; | ||
307 | socklen_t addrlen; | ||
308 | - char buf[64]; | ||
309 | struct sockaddr_nl local = { 0 }; | ||
310 | int so_type = -1, so_protocol = -1; | ||
311 | |||
312 | @@ -633,7 +629,7 @@ int nl_socket_set_fd(struct nl_sock *sk, int protocol, int fd) | ||
313 | &addrlen); | ||
314 | if (err < 0) { | ||
315 | NL_DBG(4, "nl_socket_set_fd(%p,%d): getsockname() failed with %d (%s)\n", | ||
316 | - sk, fd, errno, strerror_r(errno, buf, sizeof(buf))); | ||
317 | + sk, fd, errno, nl_strerror_l(errno)); | ||
318 | return -nl_syserr2nlerr(errno); | ||
319 | } | ||
320 | if (addrlen != sizeof(local)) | ||
321 | @@ -648,7 +644,7 @@ int nl_socket_set_fd(struct nl_sock *sk, int protocol, int fd) | ||
322 | err = getsockopt(fd, SOL_SOCKET, SO_TYPE, &so_type, &addrlen); | ||
323 | if (err < 0) { | ||
324 | NL_DBG(4, "nl_socket_set_fd(%p,%d): getsockopt() for SO_TYPE failed with %d (%s)\n", | ||
325 | - sk, fd, errno, strerror_r(errno, buf, sizeof(buf))); | ||
326 | + sk, fd, errno, nl_strerror_l(errno)); | ||
327 | return -nl_syserr2nlerr(errno); | ||
328 | } | ||
329 | if (addrlen != sizeof(so_type)) | ||
330 | @@ -666,7 +662,7 @@ int nl_socket_set_fd(struct nl_sock *sk, int protocol, int fd) | ||
331 | if (errno == ENOPROTOOPT) | ||
332 | goto no_so_protocol; | ||
333 | NL_DBG(4, "nl_socket_set_fd(%p,%d): getsockopt() for SO_PROTOCOL failed with %d (%s)\n", | ||
334 | - sk, fd, errno, strerror_r(errno, buf, sizeof(buf))); | ||
335 | + sk, fd, errno, nl_strerror_l(errno)); | ||
336 | return -nl_syserr2nlerr(errno); | ||
337 | } | ||
338 | if (addrlen != sizeof(so_protocol)) | ||
339 | @@ -709,10 +705,8 @@ int nl_socket_set_nonblocking(const struct nl_sock *sk) | ||
340 | return -NLE_BAD_SOCK; | ||
341 | |||
342 | if (fcntl(sk->s_fd, F_SETFL, O_NONBLOCK) < 0) { | ||
343 | - char buf[64]; | ||
344 | - | ||
345 | NL_DBG(4, "nl_socket_set_nonblocking(%p): fcntl() failed with %d (%s)\n", | ||
346 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
347 | + sk, errno, nl_strerror_l(errno)); | ||
348 | return -nl_syserr2nlerr(errno); | ||
349 | } | ||
350 | |||
351 | @@ -813,7 +807,6 @@ int nl_socket_modify_err_cb(struct nl_sock *sk, enum nl_cb_kind kind, | ||
352 | int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf) | ||
353 | { | ||
354 | int err; | ||
355 | - char buf[64]; | ||
356 | |||
357 | if (rxbuf <= 0) | ||
358 | rxbuf = 32768; | ||
359 | @@ -828,7 +821,7 @@ int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf) | ||
360 | &txbuf, sizeof(txbuf)); | ||
361 | if (err < 0) { | ||
362 | NL_DBG(4, "nl_socket_set_buffer_size(%p): setsockopt() failed with %d (%s)\n", | ||
363 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
364 | + sk, errno, nl_strerror_l(errno)); | ||
365 | return -nl_syserr2nlerr(errno); | ||
366 | } | ||
367 | |||
368 | @@ -836,7 +829,7 @@ int nl_socket_set_buffer_size(struct nl_sock *sk, int rxbuf, int txbuf) | ||
369 | &rxbuf, sizeof(rxbuf)); | ||
370 | if (err < 0) { | ||
371 | NL_DBG(4, "nl_socket_set_buffer_size(%p): setsockopt() failed with %d (%s)\n", | ||
372 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
373 | + sk, errno, nl_strerror_l(errno)); | ||
374 | return -nl_syserr2nlerr(errno); | ||
375 | } | ||
376 | |||
377 | @@ -890,10 +883,8 @@ int nl_socket_set_passcred(struct nl_sock *sk, int state) | ||
378 | err = setsockopt(sk->s_fd, SOL_SOCKET, SO_PASSCRED, | ||
379 | &state, sizeof(state)); | ||
380 | if (err < 0) { | ||
381 | - char buf[64]; | ||
382 | - | ||
383 | NL_DBG(4, "nl_socket_set_passcred(%p): setsockopt() failed with %d (%s)\n", | ||
384 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
385 | + sk, errno, nl_strerror_l(errno)); | ||
386 | return -nl_syserr2nlerr(errno); | ||
387 | } | ||
388 | |||
389 | @@ -922,10 +913,8 @@ int nl_socket_recv_pktinfo(struct nl_sock *sk, int state) | ||
390 | err = setsockopt(sk->s_fd, SOL_NETLINK, NETLINK_PKTINFO, | ||
391 | &state, sizeof(state)); | ||
392 | if (err < 0) { | ||
393 | - char buf[64]; | ||
394 | - | ||
395 | NL_DBG(4, "nl_socket_recv_pktinfo(%p): setsockopt() failed with %d (%s)\n", | ||
396 | - sk, errno, strerror_r(errno, buf, sizeof(buf))); | ||
397 | + sk, errno, nl_strerror_l(errno)); | ||
398 | return -nl_syserr2nlerr(errno); | ||
399 | } | ||
400 | |||
401 | -- | ||
402 | 2.9.3 | ||
403 | |||
diff --git a/meta/recipes-support/libnl/libnl/0003-src-switch-to-using-strerror_l-instead-of-strerror_r.patch b/meta/recipes-support/libnl/libnl/0003-src-switch-to-using-strerror_l-instead-of-strerror_r.patch new file mode 100644 index 0000000000..a0f5a78092 --- /dev/null +++ b/meta/recipes-support/libnl/libnl/0003-src-switch-to-using-strerror_l-instead-of-strerror_r.patch | |||
@@ -0,0 +1,82 @@ | |||
1 | From 6c2d111177e91184073c44f83d4a6182aaba06d7 Mon Sep 17 00:00:00 2001 | ||
2 | From: =?UTF-8?q?Andr=C3=A9=20Draszik?= <adraszik@tycoint.com> | ||
3 | Date: Thu, 25 Aug 2016 13:15:01 +0100 | ||
4 | Subject: [PATCH 3/3] src: switch to using strerror_l() instead of strerror_r() | ||
5 | MIME-Version: 1.0 | ||
6 | Content-Type: text/plain; charset=UTF-8 | ||
7 | Content-Transfer-Encoding: 8bit | ||
8 | |||
9 | glibc provides two versions of strerror_r(), which | ||
10 | can be chosen between using feature test macros | ||
11 | _GNU_SOURCE and _POSIX_C_SOURCE. libnl is built using | ||
12 | the former, hence we get the glibc special version, | ||
13 | and all code so far has been written for this. | ||
14 | |||
15 | Other C libraries like musl on the other hand only try | ||
16 | to be posix compliant, and only ever provide the posix | ||
17 | version of strerror_r(), which has a different signature. | ||
18 | |||
19 | Uses in libnl hence generally cause printf() of an *int* | ||
20 | with a *string format* specifier for that reason. | ||
21 | |||
22 | Additionally, strerror_r() has been deprecated: | ||
23 | http://austingroupbugs.net/view.php?id=655 | ||
24 | |||
25 | Switch to using strerror_l(). | ||
26 | |||
27 | Signed-off-by: André Draszik <adraszik@tycoint.com> | ||
28 | Reviewed-by: Stephane Ayotte <sayotte@tycoint.com> | ||
29 | Signed-off-by: Thomas Haller <thaller@redhat.com> | ||
30 | --- | ||
31 | Upstream-Status: Backport https://github.com/thom311/libnl/commit/6c2d111177e91184073c44f83d4a6182aaba06d7 | ||
32 | src/lib/utils.c | 20 +++++++++++++++++--- | ||
33 | 1 file changed, 17 insertions(+), 3 deletions(-) | ||
34 | |||
35 | diff --git a/src/lib/utils.c b/src/lib/utils.c | ||
36 | index 467aaed..5878f27 100644 | ||
37 | --- a/src/lib/utils.c | ||
38 | +++ b/src/lib/utils.c | ||
39 | @@ -22,6 +22,7 @@ | ||
40 | */ | ||
41 | |||
42 | #include <netlink/cli/utils.h> | ||
43 | +#include <locale.h> | ||
44 | |||
45 | /** | ||
46 | * Parse a text based 32 bit unsigned integer argument | ||
47 | @@ -70,7 +71,6 @@ void nl_cli_print_version(void) | ||
48 | void nl_cli_fatal(int err, const char *fmt, ...) | ||
49 | { | ||
50 | va_list ap; | ||
51 | - char buf[256]; | ||
52 | |||
53 | fprintf(stderr, "Error: "); | ||
54 | |||
55 | @@ -79,8 +79,22 @@ void nl_cli_fatal(int err, const char *fmt, ...) | ||
56 | vfprintf(stderr, fmt, ap); | ||
57 | va_end(ap); | ||
58 | fprintf(stderr, "\n"); | ||
59 | - } else | ||
60 | - fprintf(stderr, "%s\n", strerror_r(err, buf, sizeof(buf))); | ||
61 | + } else { | ||
62 | + char *buf; | ||
63 | + locale_t loc = newlocale(LC_MESSAGES_MASK, "", (locale_t)0); | ||
64 | + if (loc == (locale_t)0) { | ||
65 | + if (errno == ENOENT) | ||
66 | + loc = newlocale(LC_MESSAGES_MASK, | ||
67 | + "POSIX", (locale_t)0); | ||
68 | + if (loc == (locale_t)0) | ||
69 | + buf = "newlocale() failed"; | ||
70 | + } | ||
71 | + if (loc != (locale_t)0) | ||
72 | + buf = strerror_l(err, loc); | ||
73 | + fprintf(stderr, "%s\n", buf); | ||
74 | + if (loc != (locale_t)0) | ||
75 | + freelocale(loc); | ||
76 | + } | ||
77 | |||
78 | exit(abs(err)); | ||
79 | } | ||
80 | -- | ||
81 | 2.9.3 | ||
82 | |||