Apply upstream fixes for diff-parseopt issues on s390x
References: https://public-inbox.org/git/20190523150416.GL3654@pobox.com/#t https://public-inbox.org/git/20190524092442.701-1-pclouds@gmail.com/T/
This commit is contained in:
parent
554467c649
commit
9524a99a05
128
0001-diff-parseopt-correct-variable-types-that-are-used-b.patch
Normal file
128
0001-diff-parseopt-correct-variable-types-that-are-used-b.patch
Normal file
@ -0,0 +1,128 @@
|
|||||||
|
From 64144ae182fb4f01fbbce0e3005057ff95aacc58 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?=
|
||||||
|
<pclouds@gmail.com>
|
||||||
|
Date: Fri, 24 May 2019 16:24:40 +0700
|
||||||
|
Subject: [PATCH 1/3] diff-parseopt: correct variable types that are used by
|
||||||
|
parseopt
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Most number-related OPT_ macros store the value in an 'int'
|
||||||
|
variable. Many of the variables in 'struct diff_options' have a
|
||||||
|
different type, but during the conversion to using parse_options() I
|
||||||
|
failed to notice and correct.
|
||||||
|
|
||||||
|
The problem was reported on s360x which is a big-endian
|
||||||
|
architechture. The variable to store '-w' option in this case is
|
||||||
|
xdl_opts, 'long' type, 8 bytes. But since parse_options() assumes
|
||||||
|
'int' (4 bytes), it will store bits in the wrong part of xdl_opts. The
|
||||||
|
problem was found on little-endian platforms because parse_options()
|
||||||
|
will accidentally store at the right part of xdl_opts.
|
||||||
|
|
||||||
|
There aren't much to say about the type change (except that 'int' for
|
||||||
|
xdl_opts should still be big enough, since Windows' long is the same
|
||||||
|
size as 'int' and nobody has complained so far). Some safety checks may
|
||||||
|
be implemented in the future to prevent class of bugs.
|
||||||
|
|
||||||
|
Reported-by: Todd Zullinger <tmz@pobox.com>
|
||||||
|
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
|
||||||
|
---
|
||||||
|
diff.h | 70 +++++++++++++++++++++++++++++-----------------------------
|
||||||
|
1 file changed, 35 insertions(+), 35 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/diff.h b/diff.h
|
||||||
|
index b20cbcc091..4527daf6b7 100644
|
||||||
|
--- a/diff.h
|
||||||
|
+++ b/diff.h
|
||||||
|
@@ -65,39 +65,39 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)
|
||||||
|
|
||||||
|
#define DIFF_FLAGS_INIT { 0 }
|
||||||
|
struct diff_flags {
|
||||||
|
- unsigned recursive;
|
||||||
|
- unsigned tree_in_recursive;
|
||||||
|
- unsigned binary;
|
||||||
|
- unsigned text;
|
||||||
|
- unsigned full_index;
|
||||||
|
- unsigned silent_on_remove;
|
||||||
|
- unsigned find_copies_harder;
|
||||||
|
- unsigned follow_renames;
|
||||||
|
- unsigned rename_empty;
|
||||||
|
- unsigned has_changes;
|
||||||
|
- unsigned quick;
|
||||||
|
- unsigned no_index;
|
||||||
|
- unsigned allow_external;
|
||||||
|
- unsigned exit_with_status;
|
||||||
|
- unsigned reverse_diff;
|
||||||
|
- unsigned check_failed;
|
||||||
|
- unsigned relative_name;
|
||||||
|
- unsigned ignore_submodules;
|
||||||
|
- unsigned dirstat_cumulative;
|
||||||
|
- unsigned dirstat_by_file;
|
||||||
|
- unsigned allow_textconv;
|
||||||
|
- unsigned textconv_set_via_cmdline;
|
||||||
|
- unsigned diff_from_contents;
|
||||||
|
- unsigned dirty_submodules;
|
||||||
|
- unsigned ignore_untracked_in_submodules;
|
||||||
|
- unsigned ignore_dirty_submodules;
|
||||||
|
- unsigned override_submodule_config;
|
||||||
|
- unsigned dirstat_by_line;
|
||||||
|
- unsigned funccontext;
|
||||||
|
- unsigned default_follow_renames;
|
||||||
|
- unsigned stat_with_summary;
|
||||||
|
- unsigned suppress_diff_headers;
|
||||||
|
- unsigned dual_color_diffed_diffs;
|
||||||
|
+ unsigned int recursive;
|
||||||
|
+ unsigned int tree_in_recursive;
|
||||||
|
+ unsigned int binary;
|
||||||
|
+ unsigned int text;
|
||||||
|
+ unsigned int full_index;
|
||||||
|
+ unsigned int silent_on_remove;
|
||||||
|
+ unsigned int find_copies_harder;
|
||||||
|
+ unsigned int follow_renames;
|
||||||
|
+ unsigned int rename_empty;
|
||||||
|
+ unsigned int has_changes;
|
||||||
|
+ unsigned int quick;
|
||||||
|
+ unsigned int no_index;
|
||||||
|
+ unsigned int allow_external;
|
||||||
|
+ unsigned int exit_with_status;
|
||||||
|
+ unsigned int reverse_diff;
|
||||||
|
+ unsigned int check_failed;
|
||||||
|
+ unsigned int relative_name;
|
||||||
|
+ unsigned int ignore_submodules;
|
||||||
|
+ unsigned int dirstat_cumulative;
|
||||||
|
+ unsigned int dirstat_by_file;
|
||||||
|
+ unsigned int allow_textconv;
|
||||||
|
+ unsigned int textconv_set_via_cmdline;
|
||||||
|
+ unsigned int diff_from_contents;
|
||||||
|
+ unsigned int dirty_submodules;
|
||||||
|
+ unsigned int ignore_untracked_in_submodules;
|
||||||
|
+ unsigned int ignore_dirty_submodules;
|
||||||
|
+ unsigned int override_submodule_config;
|
||||||
|
+ unsigned int dirstat_by_line;
|
||||||
|
+ unsigned int funccontext;
|
||||||
|
+ unsigned int default_follow_renames;
|
||||||
|
+ unsigned int stat_with_summary;
|
||||||
|
+ unsigned int suppress_diff_headers;
|
||||||
|
+ unsigned int dual_color_diffed_diffs;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void diff_flags_or(struct diff_flags *a,
|
||||||
|
@@ -151,7 +151,7 @@ struct diff_options {
|
||||||
|
int skip_stat_unmatch;
|
||||||
|
int line_termination;
|
||||||
|
int output_format;
|
||||||
|
- unsigned pickaxe_opts;
|
||||||
|
+ unsigned int pickaxe_opts;
|
||||||
|
int rename_score;
|
||||||
|
int rename_limit;
|
||||||
|
int needed_rename_limit;
|
||||||
|
@@ -169,7 +169,7 @@ struct diff_options {
|
||||||
|
const char *prefix;
|
||||||
|
int prefix_length;
|
||||||
|
const char *stat_sep;
|
||||||
|
- long xdl_opts;
|
||||||
|
+ int xdl_opts;
|
||||||
|
|
||||||
|
/* see Documentation/diff-options.txt */
|
||||||
|
char **anchors;
|
183
0002-diff-parseopt-restore-U-no-argument-behavior.patch
Normal file
183
0002-diff-parseopt-restore-U-no-argument-behavior.patch
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
From 23f586f2524569218de43c10cd41c3d271198a9e Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?=
|
||||||
|
<pclouds@gmail.com>
|
||||||
|
Date: Fri, 24 May 2019 16:24:41 +0700
|
||||||
|
Subject: [PATCH 2/3] diff-parseopt: restore -U (no argument) behavior
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Before d473e2e0e8 (diff.c: convert -U|--unified, 2019-01-27), -U and
|
||||||
|
--unified are implemented with a custom parser opt_arg() in diff.c. I
|
||||||
|
didn't check this code carefully and not realize that it's the
|
||||||
|
equivalent of PARSE_OPT_NONEG | PARSE_OPT_OPTARG.
|
||||||
|
|
||||||
|
In other words, if -U is specified without any argument, the option
|
||||||
|
should be accepted, and the default value should be used. Without
|
||||||
|
PARSE_OPT_OPTARG, parse_options() will reject this case and cause a
|
||||||
|
regression.
|
||||||
|
|
||||||
|
Reported-by: Bryan Turner <bturner@atlassian.com>
|
||||||
|
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
|
||||||
|
---
|
||||||
|
diff.c | 10 +++++----
|
||||||
|
t/t4013-diff-various.sh | 2 ++
|
||||||
|
t/t4013/diff.diff_-U1_initial..side | 29 ++++++++++++++++++++++++++
|
||||||
|
t/t4013/diff.diff_-U2_initial..side | 31 ++++++++++++++++++++++++++++
|
||||||
|
t/t4013/diff.diff_-U_initial..side | 32 +++++++++++++++++++++++++++++
|
||||||
|
5 files changed, 100 insertions(+), 4 deletions(-)
|
||||||
|
create mode 100644 t/t4013/diff.diff_-U1_initial..side
|
||||||
|
create mode 100644 t/t4013/diff.diff_-U2_initial..side
|
||||||
|
create mode 100644 t/t4013/diff.diff_-U_initial..side
|
||||||
|
|
||||||
|
diff --git a/diff.c b/diff.c
|
||||||
|
index 4d3cf83a27..80ddc11671 100644
|
||||||
|
--- a/diff.c
|
||||||
|
+++ b/diff.c
|
||||||
|
@@ -5211,9 +5211,11 @@ static int diff_opt_unified(const struct option *opt,
|
||||||
|
|
||||||
|
BUG_ON_OPT_NEG(unset);
|
||||||
|
|
||||||
|
- options->context = strtol(arg, &s, 10);
|
||||||
|
- if (*s)
|
||||||
|
- return error(_("%s expects a numerical value"), "--unified");
|
||||||
|
+ if (arg) {
|
||||||
|
+ options->context = strtol(arg, &s, 10);
|
||||||
|
+ if (*s)
|
||||||
|
+ return error(_("%s expects a numerical value"), "--unified");
|
||||||
|
+ }
|
||||||
|
enable_patch_output(&options->output_format);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -5272,7 +5274,7 @@ static void prep_parse_options(struct diff_options *options)
|
||||||
|
DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
|
||||||
|
OPT_CALLBACK_F('U', "unified", options, N_("<n>"),
|
||||||
|
N_("generate diffs with <n> lines context"),
|
||||||
|
- PARSE_OPT_NONEG, diff_opt_unified),
|
||||||
|
+ PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_unified),
|
||||||
|
OPT_BOOL('W', "function-context", &options->flags.funccontext,
|
||||||
|
N_("generate diffs with <n> lines context")),
|
||||||
|
OPT_BIT_F(0, "raw", &options->output_format,
|
||||||
|
diff --git a/t/t4013-diff-various.sh b/t/t4013-diff-various.sh
|
||||||
|
index 9f8f0e84ad..a9054d2db1 100755
|
||||||
|
--- a/t/t4013-diff-various.sh
|
||||||
|
+++ b/t/t4013-diff-various.sh
|
||||||
|
@@ -338,6 +338,8 @@ format-patch --inline --stdout initial..master^^
|
||||||
|
format-patch --stdout --cover-letter -n initial..master^
|
||||||
|
|
||||||
|
diff --abbrev initial..side
|
||||||
|
+diff -U initial..side
|
||||||
|
+diff -U1 initial..side
|
||||||
|
diff -r initial..side
|
||||||
|
diff --stat initial..side
|
||||||
|
diff -r --stat initial..side
|
||||||
|
diff --git a/t/t4013/diff.diff_-U1_initial..side b/t/t4013/diff.diff_-U1_initial..side
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..b69f8f048a
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/t/t4013/diff.diff_-U1_initial..side
|
||||||
|
@@ -0,0 +1,29 @@
|
||||||
|
+$ git diff -U1 initial..side
|
||||||
|
+diff --git a/dir/sub b/dir/sub
|
||||||
|
+index 35d242b..7289e35 100644
|
||||||
|
+--- a/dir/sub
|
||||||
|
++++ b/dir/sub
|
||||||
|
+@@ -2 +2,3 @@ A
|
||||||
|
+ B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+diff --git a/file0 b/file0
|
||||||
|
+index 01e79c3..f4615da 100644
|
||||||
|
+--- a/file0
|
||||||
|
++++ b/file0
|
||||||
|
+@@ -3 +3,4 @@
|
||||||
|
+ 3
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++C
|
||||||
|
+diff --git a/file3 b/file3
|
||||||
|
+new file mode 100644
|
||||||
|
+index 0000000..7289e35
|
||||||
|
+--- /dev/null
|
||||||
|
++++ b/file3
|
||||||
|
+@@ -0,0 +1,4 @@
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+$
|
||||||
|
diff --git a/t/t4013/diff.diff_-U2_initial..side b/t/t4013/diff.diff_-U2_initial..side
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..8ffe04f203
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/t/t4013/diff.diff_-U2_initial..side
|
||||||
|
@@ -0,0 +1,31 @@
|
||||||
|
+$ git diff -U2 initial..side
|
||||||
|
+diff --git a/dir/sub b/dir/sub
|
||||||
|
+index 35d242b..7289e35 100644
|
||||||
|
+--- a/dir/sub
|
||||||
|
++++ b/dir/sub
|
||||||
|
+@@ -1,2 +1,4 @@
|
||||||
|
+ A
|
||||||
|
+ B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+diff --git a/file0 b/file0
|
||||||
|
+index 01e79c3..f4615da 100644
|
||||||
|
+--- a/file0
|
||||||
|
++++ b/file0
|
||||||
|
+@@ -2,2 +2,5 @@
|
||||||
|
+ 2
|
||||||
|
+ 3
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++C
|
||||||
|
+diff --git a/file3 b/file3
|
||||||
|
+new file mode 100644
|
||||||
|
+index 0000000..7289e35
|
||||||
|
+--- /dev/null
|
||||||
|
++++ b/file3
|
||||||
|
+@@ -0,0 +1,4 @@
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+$
|
||||||
|
diff --git a/t/t4013/diff.diff_-U_initial..side b/t/t4013/diff.diff_-U_initial..side
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000000..c66c0dd5c6
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/t/t4013/diff.diff_-U_initial..side
|
||||||
|
@@ -0,0 +1,32 @@
|
||||||
|
+$ git diff -U initial..side
|
||||||
|
+diff --git a/dir/sub b/dir/sub
|
||||||
|
+index 35d242b..7289e35 100644
|
||||||
|
+--- a/dir/sub
|
||||||
|
++++ b/dir/sub
|
||||||
|
+@@ -1,2 +1,4 @@
|
||||||
|
+ A
|
||||||
|
+ B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+diff --git a/file0 b/file0
|
||||||
|
+index 01e79c3..f4615da 100644
|
||||||
|
+--- a/file0
|
||||||
|
++++ b/file0
|
||||||
|
+@@ -1,3 +1,6 @@
|
||||||
|
+ 1
|
||||||
|
+ 2
|
||||||
|
+ 3
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++C
|
||||||
|
+diff --git a/file3 b/file3
|
||||||
|
+new file mode 100644
|
||||||
|
+index 0000000..7289e35
|
||||||
|
+--- /dev/null
|
||||||
|
++++ b/file3
|
||||||
|
+@@ -0,0 +1,4 @@
|
||||||
|
++A
|
||||||
|
++B
|
||||||
|
++1
|
||||||
|
++2
|
||||||
|
+$
|
@ -0,0 +1,63 @@
|
|||||||
|
From 9709e02ba78d2408269fc81bd27691714ed26e26 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Nguy=E1=BB=85n=20Th=C3=A1i=20Ng=E1=BB=8Dc=20Duy?=
|
||||||
|
<pclouds@gmail.com>
|
||||||
|
Date: Fri, 24 May 2019 16:24:42 +0700
|
||||||
|
Subject: [PATCH 3/3] parse-options: check empty value in OPT_INTEGER and
|
||||||
|
OPT_ABBREV
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
When parsing the argument for OPT_INTEGER and OPT_ABBREV, we check if we
|
||||||
|
can parse the entire argument to a number with "if (*s)". There is one
|
||||||
|
missing check: if "arg" is empty to begin with, we fail to notice.
|
||||||
|
|
||||||
|
This could happen with long option by writing like
|
||||||
|
|
||||||
|
git diff --inter-hunk-context= blah blah
|
||||||
|
|
||||||
|
Before 16ed6c97cc (diff-parseopt: convert --inter-hunk-context,
|
||||||
|
2019-03-24), --inter-hunk-context is handled by a custom parser
|
||||||
|
opt_arg() and does detect this correctly.
|
||||||
|
|
||||||
|
This restores the bahvior for --inter-hunk-context and make sure all
|
||||||
|
other integer options are handled the same (sane) way. For OPT_ABBREV
|
||||||
|
this is new behavior. But it makes it consistent with the rest.
|
||||||
|
|
||||||
|
PS. OPT_MAGNITUDE has similar code but git_parse_ulong() does detect
|
||||||
|
empty "arg". So it's good to go.
|
||||||
|
|
||||||
|
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
|
||||||
|
---
|
||||||
|
parse-options-cb.c | 3 +++
|
||||||
|
parse-options.c | 3 +++
|
||||||
|
2 files changed, 6 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/parse-options-cb.c b/parse-options-cb.c
|
||||||
|
index 4b95d04a37..a3de795c58 100644
|
||||||
|
--- a/parse-options-cb.c
|
||||||
|
+++ b/parse-options-cb.c
|
||||||
|
@@ -16,6 +16,9 @@ int parse_opt_abbrev_cb(const struct option *opt, const char *arg, int unset)
|
||||||
|
if (!arg) {
|
||||||
|
v = unset ? 0 : DEFAULT_ABBREV;
|
||||||
|
} else {
|
||||||
|
+ if (!*arg)
|
||||||
|
+ return error(_("option `%s' expects a numerical value"),
|
||||||
|
+ opt->long_name);
|
||||||
|
v = strtol(arg, (char **)&arg, 10);
|
||||||
|
if (*arg)
|
||||||
|
return error(_("option `%s' expects a numerical value"),
|
||||||
|
diff --git a/parse-options.c b/parse-options.c
|
||||||
|
index 987e27cb91..87b26a1d92 100644
|
||||||
|
--- a/parse-options.c
|
||||||
|
+++ b/parse-options.c
|
||||||
|
@@ -195,6 +195,9 @@ static enum parse_opt_result get_value(struct parse_opt_ctx_t *p,
|
||||||
|
}
|
||||||
|
if (get_arg(p, opt, flags, &arg))
|
||||||
|
return -1;
|
||||||
|
+ if (!*arg)
|
||||||
|
+ return error(_("%s expects a numerical value"),
|
||||||
|
+ optname(opt, flags));
|
||||||
|
*(int *)opt->value = strtol(arg, (char **)&s, 10);
|
||||||
|
if (*s)
|
||||||
|
return error(_("%s expects a numerical value"),
|
10
git.spec
10
git.spec
@ -88,7 +88,7 @@
|
|||||||
|
|
||||||
Name: git
|
Name: git
|
||||||
Version: 2.22.0
|
Version: 2.22.0
|
||||||
Release: 0.1%{?rcrev}%{?dist}
|
Release: 0.2%{?rcrev}%{?dist}
|
||||||
Summary: Fast Version Control System
|
Summary: Fast Version Control System
|
||||||
License: GPLv2
|
License: GPLv2
|
||||||
URL: https://git-scm.com/
|
URL: https://git-scm.com/
|
||||||
@ -120,6 +120,11 @@ Source99: print-failed-test-output
|
|||||||
# https://bugzilla.redhat.com/490602
|
# https://bugzilla.redhat.com/490602
|
||||||
Patch0: git-cvsimport-Ignore-cvsps-2.2b1-Branches-output.patch
|
Patch0: git-cvsimport-Ignore-cvsps-2.2b1-Branches-output.patch
|
||||||
|
|
||||||
|
# https://public-inbox.org/git/20190524092442.701-1-pclouds@gmail.com/T/
|
||||||
|
Patch1: 0001-diff-parseopt-correct-variable-types-that-are-used-b.patch
|
||||||
|
Patch2: 0002-diff-parseopt-restore-U-no-argument-behavior.patch
|
||||||
|
Patch3: 0003-parse-options-check-empty-value-in-OPT_INTEGER-and-O.patch
|
||||||
|
|
||||||
%if %{with docs}
|
%if %{with docs}
|
||||||
# pod2man is needed to build Git.3pm
|
# pod2man is needed to build Git.3pm
|
||||||
BuildRequires: %{_bindir}/pod2man
|
BuildRequires: %{_bindir}/pod2man
|
||||||
@ -956,6 +961,9 @@ rmdir --ignore-fail-on-non-empty "$testdir"
|
|||||||
%{?with_docs:%{_pkgdocdir}/git-svn.html}
|
%{?with_docs:%{_pkgdocdir}/git-svn.html}
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri May 24 2019 Todd Zullinger <tmz@pobox.com> - 2.22.0-0.2.rc1
|
||||||
|
- Apply upstream fixes for diff-parseopt issues on s390x
|
||||||
|
|
||||||
* Sun May 19 2019 Todd Zullinger <tmz@pobox.com> - 2.22.0-0.1.rc1
|
* Sun May 19 2019 Todd Zullinger <tmz@pobox.com> - 2.22.0-0.1.rc1
|
||||||
- Update to 2.22.0-rc1
|
- Update to 2.22.0-rc1
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user