* [PATCH 1/2] viewdiff: assume diffstat and diff order are identical
2020-05-06 10:40 5% [PATCH 0/2] viewdiff: linkification fixes Eric Wong
@ 2020-05-06 10:40 7% ` Eric Wong
0 siblings, 0 replies; 2+ results
From: Eric Wong @ 2020-05-06 10:40 UTC (permalink / raw)
To: meta
For non-malicious messages, we can assume the diffstat and actual
diff appear in the same order. Thus we can store {-long_paths} as
an arrayref and only compare the first element when we encounter
a truncated path.
This should make HTML rendering stable when there's basename
conflicts in message such as
https://lore.kernel.org/backports/1393202754-12919-13-git-send-email-hauke@hauke-m.de/
This diffstat anchor linkification can still be defeated by
users who make actual path names beginning with "...", but we
won't waste CPU cycles on it, either.
---
lib/PublicInbox/ViewDiff.pm | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/lib/PublicInbox/ViewDiff.pm b/lib/PublicInbox/ViewDiff.pm
index 3d6058a9..34df8ad4 100644
--- a/lib/PublicInbox/ViewDiff.pm
+++ b/lib/PublicInbox/ViewDiff.pm
@@ -82,10 +82,8 @@ sub anchor0 ($$$$) {
$fn =~ s/{(?:.+) => (.+)}/$1/ or $fn =~ s/.* => (.+)/$1/;
$fn = git_unquote($fn);
- # long filenames will require us to walk backwards in anchor1
- if ($fn =~ s!\A\.\.\./?!!) {
- $ctx->{-long_path}->{$fn} = qr/\Q$fn\E\z/s;
- }
+ # long filenames will require us to check in anchor1()
+ push(@{$ctx->{-long_path}}, $fn) if $fn =~ s!\A\.\.\./?!!;
if (my $attr = to_attr($ctx->{-apfx}.$fn)) {
$ctx->{-anchors}->{$attr} = 1;
@@ -105,17 +103,14 @@ sub anchor1 ($$) {
my $ok = delete $ctx->{-anchors}->{$attr};
- # unlikely, check the end of all long path names we captured:
+ # unlikely, check the end of long path names we captured,
+ # assume diffstat and diff output follow the same order,
+ # and ignore different ordering (could be malicious input)
unless ($ok) {
- my $lp = $ctx->{-long_path} or return;
- foreach my $fn (keys %$lp) {
- $pb =~ $lp->{$fn} or next;
-
- delete $lp->{$fn};
- $attr = to_attr($ctx->{-apfx}.$fn) or return;
- $ok = delete $ctx->{-anchors}->{$attr} or return;
- last;
- }
+ my $fn = shift(@{$ctx->{-long_path}}) or return;
+ $pb =~ /\Q$fn\E\z/s or return;
+ $attr = to_attr($ctx->{-apfx}.$fn) or return;
+ $ok = delete $ctx->{-anchors}->{$attr} or return;
}
$ok ? "<a\nhref=#i$attr\nid=$attr>diff</a> --git" : undef
}
^ permalink raw reply related [relevance 7%]
* [PATCH 0/2] viewdiff: linkification fixes
@ 2020-05-06 10:40 5% Eric Wong
2020-05-06 10:40 7% ` [PATCH 1/2] viewdiff: assume diffstat and diff order are identical Eric Wong
0 siblings, 1 reply; 2+ results
From: Eric Wong @ 2020-05-06 10:40 UTC (permalink / raw)
To: meta
Diffstat linkification of long file names is no longer hash
order dependent, since I noticed some HTML rendering differences
between PublicInbox::MIME and PublicInbox::Eml (its
non-Email::MIME replacement).
I also noticed some wasted work in patch series cover letters
which included diffstats, as well as over-linkifying
tables in the cover letter which feature no other
diff features.
Eric Wong (2):
viewdiff: assume diffstat and diff order are identical
viewdiff: stricter highlighting and linkification check
lib/PublicInbox/View.pm | 7 +++++--
lib/PublicInbox/ViewDiff.pm | 27 ++++++++++++---------------
2 files changed, 17 insertions(+), 17 deletions(-)
^ permalink raw reply [relevance 5%]
Results 1-2 of 2 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2020-05-06 10:40 5% [PATCH 0/2] viewdiff: linkification fixes Eric Wong
2020-05-06 10:40 7% ` [PATCH 1/2] viewdiff: assume diffstat and diff order are identical Eric Wong
Code repositories for project(s) associated with this public inbox
https://80x24.org/public-inbox.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).