aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch')
-rw-r--r--main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch82
1 files changed, 82 insertions, 0 deletions
diff --git a/main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch b/main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch
new file mode 100644
index 0000000000..ad1c637dcb
--- /dev/null
+++ b/main/musl/0004-fix-getopt-_long-clobbering-of-optopt-on-success.patch
@@ -0,0 +1,82 @@
+From 786fda875a901dc1807289c940338487854cd3ba Mon Sep 17 00:00:00 2001
+From: Rich Felker <dalias@aerifal.cx>
+Date: Wed, 4 Jan 2017 19:02:02 -0500
+Subject: [PATCH] fix getopt[_long] clobbering of optopt on success
+
+getopt is only specified to modify optopt on error, and some software
+apparently infers an error from optopt!=0.
+
+getopt_long is changed analogously. the resulting behavior differs
+slightly from the behavior of the GNU implementation of getopt_long,
+which keeps an internal shadow copy of optopt and copies it to the
+public one on return, but since the GNU implementation also exhibits
+this shadow-copy behavior for plain getopt where is is non-conforming,
+I think this can reasonably be considered a bug rather than an
+intentional behavior that merits mimicing.
+---
+ src/misc/getopt.c | 3 ++-
+ src/misc/getopt_long.c | 4 +++-
+ 2 files changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/src/misc/getopt.c b/src/misc/getopt.c
+index 8290aef7..e9bab41c 100644
+--- a/src/misc/getopt.c
++++ b/src/misc/getopt.c
+@@ -60,7 +60,6 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ c = 0xfffd; /* replacement char */
+ }
+ optchar = argv[optind]+optpos;
+- optopt = c;
+ optpos += k;
+
+ if (!argv[optind][optpos]) {
+@@ -79,6 +78,7 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ } while (l && d != c);
+
+ if (d != c) {
++ optopt = c;
+ if (optstring[0] != ':' && opterr)
+ __getopt_msg(argv[0], ": unrecognized option: ", optchar, k);
+ return '?';
+@@ -86,6 +86,7 @@ int getopt(int argc, char * const argv[], const char *optstring)
+ if (optstring[i] == ':') {
+ if (optstring[i+1] == ':') optarg = 0;
+ else if (optind >= argc) {
++ optopt = c;
+ if (optstring[0] == ':') return ':';
+ if (opterr) __getopt_msg(argv[0],
+ ": option requires an argument: ",
+diff --git a/src/misc/getopt_long.c b/src/misc/getopt_long.c
+index c6e14625..568ae7ba 100644
+--- a/src/misc/getopt_long.c
++++ b/src/misc/getopt_long.c
+@@ -75,9 +75,9 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring
+ if (cnt==1) {
+ i = match;
+ optind++;
+- optopt = longopts[i].val;
+ if (*opt == '=') {
+ if (!longopts[i].has_arg) {
++ optopt = longopts[i].val;
+ if (colon || !opterr)
+ return '?';
+ __getopt_msg(argv[0],
+@@ -89,6 +89,7 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring
+ optarg = opt+1;
+ } else if (longopts[i].has_arg == required_argument) {
+ if (!(optarg = argv[optind])) {
++ optopt = longopts[i].val;
+ if (colon) return ':';
+ if (!opterr) return '?';
+ __getopt_msg(argv[0],
+@@ -107,6 +108,7 @@ static int __getopt_long_core(int argc, char *const *argv, const char *optstring
+ return longopts[i].val;
+ }
+ if (argv[optind][1] == '-') {
++ optopt = 0;
+ if (!colon && opterr)
+ __getopt_msg(argv[0], cnt ?
+ ": option is ambiguous: " :
+--
+2.11.0
+