about summary refs log tree commit diff
path: root/src/locale
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2019-01-27 21:34:57 -0600
committerRich Felker <dalias@aerifal.cx>2019-02-07 12:41:16 -0500
commit8d82971775343f3c52294e957c52ad1f758395ef (patch)
tree57b1d12632c339680b8f33935159c82623741b02 /src/locale
parent1691b23955590d1eb66a11158fdd91c86337e886 (diff)
downloadmusl-8d82971775343f3c52294e957c52ad1f758395ef.tar.gz
musl-8d82971775343f3c52294e957c52ad1f758395ef.tar.xz
musl-8d82971775343f3c52294e957c52ad1f758395ef.zip
locale: ensure dcngettext() preserves errno
Some packages call gettext to format a message to be sent to perror.
If the currently set user locale points to a non-existent .mo file,
open via __map_file in dcngettext will set errno to ENOENT.

Maintainer's notes: Non-modification of errno is a documented part of
the interface contract for the GNU version of this function and likely
other versions. The issue being fixed here seems to be a regression
from commit 1b52863e244ecee5b5935b6d36bb9e6efe84c035, which enabled
setting of errno from __map_file.
Diffstat (limited to 'src/locale')
-rw-r--r--src/locale/dcngettext.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/locale/dcngettext.c b/src/locale/dcngettext.c
index 8b891d00..4c304393 100644
--- a/src/locale/dcngettext.c
+++ b/src/locale/dcngettext.c
@@ -122,6 +122,7 @@ char *dcngettext(const char *domainname, const char *msgid1, const char *msgid2,
 	const struct __locale_map *lm;
 	size_t domlen;
 	struct binding *q;
+	int old_errno = errno;
 
 	if ((unsigned)category >= LC_ALL) goto notrans;
 
@@ -138,6 +139,7 @@ char *dcngettext(const char *domainname, const char *msgid1, const char *msgid2,
 	lm = loc->cat[category];
 	if (!lm) {
 notrans:
+		errno = old_errno;
 		return (char *) ((n == 1) ? msgid1 : msgid2);
 	}
 
@@ -250,6 +252,7 @@ notrans:
 			trans += l+1;
 		}
 	}
+	errno = old_errno;
 	return (char *)trans;
 }