diff options
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.patch | 57 |
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 + |