aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch')
-rw-r--r--main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch57
1 files changed, 57 insertions, 0 deletions
diff --git a/main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch b/main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch
new file mode 100644
index 0000000000..dc41304726
--- /dev/null
+++ b/main/musl/0015-fix-getopt-handling-of-modifier-for-multibyte-option.patch
@@ -0,0 +1,57 @@
+From 014275b547e3059db5c45986408757c250e8198d Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Thu, 4 Dec 2014 10:23:33 -0500
+Subject: [PATCH] fix getopt handling of ':' modifier for multibyte option
+ characters
+
+the previous hard-coded offsets of +1 and +2 contained a hidden
+assumption that the option character matched was single-byte, despite
+this implementation of getopt attempting to support multibyte option
+characters. this patch reworks the matching logic to leave the final
+index pointing just past the matched character so that fixed offsets
+can be used to check for ':'.
+---
+ src/misc/getopt.c | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/src/misc/getopt.c b/src/misc/getopt.c
+index a698c8d..52aa7a3 100644
+--- a/src/misc/getopt.c
++++ b/src/misc/getopt.c
+@@ -58,7 +58,12 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ if (optstring[0] == '-')
+ optstring++;
+
+- for (i=0; (l = mbtowc(&d, optstring+i, MB_LEN_MAX)) && d!=c; i+=l>0?l:1);
++ i = 0;
++ d = 0;
++ do {
++ l = mbtowc(&d, optstring+i, MB_LEN_MAX);
++ if (l>0) i+=l; else i++;
++ } while (l && d != c);
+
+ if (d != c) {
+ if (optstring[0] != ':' && opterr) {
+@@ -69,8 +74,8 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ }
+ return '?';
+ }
+- if (optstring[i+1] == ':') {
+- if (optstring[i+2] == ':') optarg = 0;
++ if (optstring[i] == ':') {
++ if (optstring[i+1] == ':') optarg = 0;
+ else if (optind >= argc) {
+ if (optstring[0] == ':') return ':';
+ if (opterr) {
+@@ -81,7 +86,7 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ }
+ return '?';
+ }
+- if (optstring[i+2] != ':' || optpos) {
++ if (optstring[i+1] != ':' || optpos) {
+ optarg = argv[optind++] + optpos;
+ optpos = 0;
+ }
+--
+2.2.0
+