aboutsummaryrefslogtreecommitdiffstats
path: root/main/asterisk/fix-strerror_r.patch
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2016-11-18 09:35:46 +0200
committerTimo Teräs <timo.teras@iki.fi>2016-11-18 09:37:08 +0200
commite30b06dd6ea3c6330c2904973fb541fdbb630984 (patch)
tree20c9e34d6b6142be836cc27aee90c0a32771cf35 /main/asterisk/fix-strerror_r.patch
parent8cc23c434a914599ff1d806f405de7e76f0ffd07 (diff)
downloadaports-e30b06dd6ea3c6330c2904973fb541fdbb630984.tar.bz2
aports-e30b06dd6ea3c6330c2904973fb541fdbb630984.tar.xz
main/asterisk: add upstream submitted portability fixes
fixes #3503 fixes #6394
Diffstat (limited to 'main/asterisk/fix-strerror_r.patch')
-rw-r--r--main/asterisk/fix-strerror_r.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/main/asterisk/fix-strerror_r.patch b/main/asterisk/fix-strerror_r.patch
new file mode 100644
index 0000000000..97894309bd
--- /dev/null
+++ b/main/asterisk/fix-strerror_r.patch
@@ -0,0 +1,72 @@
+From 3d7089121731a1122e1306e631adaf5004ac323c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
+Date: Fri, 11 Nov 2016 08:29:40 +0200
+Subject: [PATCH] addons/chan_mobile: do not use strerror_r
+
+The two reasons why it might be used are that some systems do not
+implement strerror in thread safe manner, and that strerror_r returns
+the error code in the string in case there's no error message.
+
+However, all of asterisk elsewhere uses strerror() and assumes it
+to be thread safe. And in chan_mobile the errno is also explicitly
+printed so neither of the above reasons are valid.
+
+The reasoning to remove usage is that there are actually two versions
+of strerror_r: XSI and GNU. They are incompatible in their return
+value, and there's no easy way to figure out which one is being
+used. glibc gives you the GNU version if _GNU_SOURCE is defined,
+but the same feature test macro is needed for other symbols. On
+all other systems you assumedly get XSI symbol, and compilation warnings
+as well as non-working error printing.
+
+Thus the easiest solution is to just remove strerror_r and use
+strerror as rest of the code. Alternative is to introduce ast_strerror
+in separate translation unit so it can request the XSI symbol in
+glibc case, and replace all usage of strerror.
+
+Change-Id: I84d35225b5642d85d48bc35fdf399afbae28a91d
+---
+ addons/chan_mobile.c | 13 +++----------
+ 1 file changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/addons/chan_mobile.c b/addons/chan_mobile.c
+index 64d53b7..8d13c96 100644
+--- a/addons/chan_mobile.c
++++ b/addons/chan_mobile.c
+@@ -3855,10 +3855,7 @@ static void *do_monitor_phone(void *data)
+ }
+
+ if ((at_msg = at_read_full(hfp->rsock, buf, sizeof(buf))) < 0) {
+- /* XXX gnu specific strerror_r is assummed here, this
+- * is not really safe. See the strerror(3) man page
+- * for more info. */
+- ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror_r(errno, buf, sizeof(buf)), errno);
++ ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
+ break;
+ }
+
+@@ -3995,7 +3992,7 @@ static void *do_monitor_phone(void *data)
+ ast_debug(1, "[%s] error parsing message\n", pvt->id);
+ goto e_cleanup;
+ case AT_READ_ERROR:
+- ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror_r(errno, buf, sizeof(buf)), errno);
++ ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
+ goto e_cleanup;
+ default:
+ break;
+@@ -4073,11 +4070,7 @@ static void *do_monitor_headset(void *data)
+ continue;
+
+ if ((at_msg = at_read_full(pvt->rfcomm_socket, buf, sizeof(buf))) < 0) {
+- if (strerror_r(errno, buf, sizeof(buf)))
+- ast_debug(1, "[%s] error reading from device\n", pvt->id);
+- else
+- ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, buf, errno);
+-
++ ast_debug(1, "[%s] error reading from device: %s (%d)\n", pvt->id, strerror(errno), errno);
+ goto e_cleanup;
+ }
+ ast_debug(1, "[%s] %s\n", pvt->id, buf);
+--
+2.10.2
+