user/dev discussion of public-inbox itself
 help / color / mirror / code / Atom feed
* [PATCH] git: fix numerous bugs in git_quote and git_unquote
@ 2021-05-09 11:16 Eric Wong
  0 siblings, 0 replies; only message in thread
From: Eric Wong @ 2021-05-09 11:16 UTC (permalink / raw)
  To: meta

git always quotes with leading zeros to ensure the octal
representation is 3 characters long.  We enforce that to match
low ASCII characters (e.g. [x01-\x06]) that don't need the
range provided by 3 characters.

git_unquote now does a single pass so it won't get fooled by
decoded backslashes into parsing a digit as an octal character.
git_unquote is also capped to "\377" so we don't overflow a
byte.
---
 lib/PublicInbox/Git.pm | 5 ++---
 t/git.t                | 2 ++
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 96ac17a3..e557f6d6 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -50,14 +50,13 @@ my %ESC_GIT = map { $GIT_ESC{$_} => $_ } keys %GIT_ESC;
 sub git_unquote ($) {
 	return $_[0] unless ($_[0] =~ /\A"(.*)"\z/);
 	$_[0] = $1;
-	$_[0] =~ s/\\([\\"abfnrtv])/$GIT_ESC{$1}/g;
-	$_[0] =~ s/\\([0-7]{1,3})/chr(oct($1))/ge;
+	$_[0] =~ s!\\([\\"abfnrtv]|[0-3][0-7]{2})!$GIT_ESC{$1}//chr(oct($1))!ge;
 	$_[0];
 }
 
 sub git_quote ($) {
 	if ($_[0] =~ s/([\\"\a\b\f\n\r\t\013]|[^[:print:]])/
-		      '\\'.($ESC_GIT{$1}||sprintf("%0o",ord($1)))/egs) {
+		      '\\'.($ESC_GIT{$1}||sprintf("%03o",ord($1)))/egs) {
 		return qq{"$_[0]"};
 	}
 	$_[0];
diff --git a/t/git.t b/t/git.t
index 4a45bbaf..bc1dea50 100644
--- a/t/git.t
+++ b/t/git.t
@@ -168,5 +168,7 @@ is(git_quote($s = "Eléanor"), '"El\\303\\251anor"', 'quoted octal');
 is(git_quote($s = "hello\"world"), '"hello\"world"', 'quoted dq');
 is(git_quote($s = "hello\\world"), '"hello\\\\world"', 'quoted backslash');
 is(git_quote($s = "hello\nworld"), '"hello\\nworld"', 'quoted LF');
+is(git_quote($s = "hello\x06world"), '"hello\\006world"', 'quoted \\x06');
+is(git_unquote($s = '"hello\\006world"'), "hello\x06world", 'unquoted \\x06');
 
 done_testing();

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-05-09 11:16 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-09 11:16 [PATCH] git: fix numerous bugs in git_quote and git_unquote Eric Wong

user/dev discussion of public-inbox itself

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://public-inbox.org/meta
	git clone --mirror http://czquwvybam4bgbro.onion/meta
	git clone --mirror http://hjrcffqmbrq6wope.onion/meta
	git clone --mirror http://ou63pmih66umazou.onion/meta

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V1 meta meta/ https://public-inbox.org/meta \
		meta@public-inbox.org
	public-inbox-index meta

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.public-inbox.org/inbox.comp.mail.public-inbox.meta
	nntp://7fh6tueqddpjyxjmgtdiueylzoqt6pt7hec3pukyptlmohoowvhde4yd.onion/inbox.comp.mail.public-inbox.meta
	nntp://ie5yzdi7fg72h7s4sdcztq5evakq23rdt33mfyfcddc5u3ndnw24ogqd.onion/inbox.comp.mail.public-inbox.meta
	nntp://4uok3hntl7oi7b4uf4rtfwefqeexfzil2w6kgk2jn5z2f764irre7byd.onion/inbox.comp.mail.public-inbox.meta
	nntp://news.gmane.io/gmane.mail.public-inbox.general
 note: .onion URLs require Tor: https://www.torproject.org/

code repositories for project(s) associated with this inbox:

	https://80x24.org/public-inbox.git

AGPL code for this site: git clone https://public-inbox.org/public-inbox.git