git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 18/18] remote-mediawiki: use "sh" to eliminate unquoted commands

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Sep 21, 2020, 10:40 UTC
Message-ID
<20200921104000.2304-19-avarab@gmail.com>
In-Reply-To
<20200916102918.29805-1-avarab@gmail.com>

Remove the use of run_git_unquoted() completely with a use of "sh -c" suggested by Jeff King, i.e.:

    sh -c '"$@" 2>/dev/null' -- echo sneaky 'argument;id'

I don't think this is needed now for any potential RCE issue. The $remotename argument is ultimately picked by the local user (and similarly, the $local variable comes from a user-supplied refspec).

But completely eliminating the use of unquoted shell arguments has a value in and of itself, by making the code easier to review. As noted in an earlier commit I think the use of IPC::Open3 would be too verbose here, but this "sh -c" trick strikes the right balance between readability and semantic sanity.

Suggested-by: Jeff King <peff@peff.net>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
 contrib/mw-to-git/git-remote-mediawiki.perl | 24 +++++++--------------
 1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/contrib/mw-to-git/git-remote-mediawiki.perl b/contrib/mw-to-git/git-remote-mediawiki.perl
index d21c18df7b..a5624413dc 100755
--- a/contrib/mw-to-git/git-remote-mediawiki.perl
+++ b/contrib/mw-to-git/git-remote-mediawiki.perl
@@ -371,8 +371,8 @@ sub get_mw_pages {
 
 # usage: $out = run_git_quoted(["command", "args", ...]);
 #        $out = run_git_quoted(["command", "args", ...], "raw"); # don't interpret output as UTF-8.
-#        $out = run_git_unquoted(["command args"); # don't quote arguments
-#        $out = run_git_unquoted(["command args", "raw"); # ditto but raw instead of UTF-8 as above
+#        $out = run_git_quoted_nostderr(["command", "args", ...]); # discard stderr
+#        $out = run_git_quoted_nostderr(["command", "args", ...], "raw"); # ditto but raw instead of UTF-8 as above
 sub _run_git {
 	my $args = shift;
 	my $encoding = (shift || 'encoding(UTF-8)');
@@ -391,8 +391,8 @@ sub run_git_quoted {
     _run_git(["git", @{$_[0]}], $_[1]);
 }
 
-sub run_git_unquoted {
-    _run_git(["git $_[0]"], $_[1]);
+sub run_git_quoted_nostderr {
+    _run_git(['sh', '-c', 'git "$@" 2>/dev/null', '--', @{$_[0]}], $_[1]);
 }
 
 sub get_all_mediafiles {
@@ -521,10 +521,8 @@ sub download_mw_mediafile {
 
 sub get_last_local_revision {
 	# Get note regarding last mediawiki revision.
-	#
-	# It's OK to use run_git_unquoted() here because $remotename is
-	# supplied by the local git itself.
-	my $note = run_git_unquoted("notes --ref=${remotename}/mediawiki show refs/mediawiki/${remotename}/master 2>/dev/null");
+	my $note = run_git_quoted_nostderr(["notes", "--ref=${remotename}/mediawiki",
+					    "show", "refs/mediawiki/${remotename}/master"]);
 	my @note_info = split(/ /, $note);
 
 	my $lastrevision_number;
@@ -1189,16 +1187,10 @@ sub mw_push_revision {
 	my $mw_revision = $last_remote_revid;
 
 	# Get sha1 of commit pointed by local HEAD
-	#
-	# It's OK to use run_git_unquoted() because $local is supplied
-	# by the local git itself.
-	my $HEAD_sha1 = run_git_unquoted("rev-parse ${local} 2>/dev/null");
+	my $HEAD_sha1 = run_git_quoted_nostderr(["rev-parse", $local]);
 	chomp($HEAD_sha1);
 	# Get sha1 of commit pointed by remotes/$remotename/master
-	#
-	# It's OK to use run_git_unquoted() here because $remotename is
-	# supplied by the local git itself.
-	my $remoteorigin_sha1 = run_git_unquoted("rev-parse refs/remotes/${remotename}/master 2>/dev/null");
+	my $remoteorigin_sha1 = run_git_quoted_nostderr(["rev-parse", "refs/remotes/${remotename}/master"]);
 	chomp($remoteorigin_sha1);
 
 	if ($last_local_revid > 0 &&
-- 
2.28.0.297.g1956fa8f8d
Previous: Ævar Arnfjörð BjarmasonNext: Ævar Arnfjörð Bjarmason
Message 50 of 54 in “remote-mediawiki: various fixes to make tests pass”
  1. 00/15 remote-mediawiki: various fixes to make tests passÆvar Arnfjörð Bjarmason, Sep 16, 2020
  2. 13/15 remote-mediawiki tests: use CLI installerÆvar Arnfjörð Bjarmason, Sep 16, 2020
  3. 15/15 remote-mediawiki tests: annotate failing testsÆvar Arnfjörð Bjarmason, Sep 16, 2020
  4. 14/15 remote-mediawiki: fix duplicate revisions being importedÆvar Arnfjörð Bjarmason, Sep 16, 2020
  5. 06/15 remote-mediawiki tests: use test_cmp in testsÆvar Arnfjörð Bjarmason, Sep 16, 2020
  6. Jeff KingSep 16, 2020
  7. 12/15 remote-mediawiki tests: use inline PerlIO for readabilityÆvar Arnfjörð Bjarmason, Sep 16, 2020
  8. 09/15 remote-mediawiki tests: use "$dir/" instead of "$dir."Ævar Arnfjörð Bjarmason, Sep 16, 2020
  9. Jeff KingSep 16, 2020
  10. Junio C HamanoSep 16, 2020
  11. 07/15 remote-mediawiki tests: guard test_cmp with test_path_is_fileÆvar Arnfjörð Bjarmason, Sep 16, 2020
  12. Jeff KingSep 16, 2020
  13. Đoàn Trần Công DanhSep 16, 2020
  14. Eric SunshineSep 16, 2020
  15. Junio C HamanoSep 16, 2020
  16. test_cmp: diagnose incorrect arguments more preciselyEric Sunshine, Oct 3, 2020
  17. Junio C HamanoOct 3, 2020
  18. Ævar Arnfjörð BjarmasonSep 21, 2020
  19. Ævar Arnfjörð BjarmasonSep 21, 2020
  20. 11/15 remote-mediawiki tests: replace deprecated Perl constructÆvar Arnfjörð Bjarmason, Sep 16, 2020
  21. Jeff KingSep 16, 2020
  22. 08/15 remote-mediawiki tests: change `[]` to `test`Ævar Arnfjörð Bjarmason, Sep 16, 2020
  23. 10/15 remote-mediawiki tests: use a more idiomatic dispatch tableÆvar Arnfjörð Bjarmason, Sep 16, 2020
  24. 03/15 remote-mediawiki doc: bump recommended PHP version to 7.3Ævar Arnfjörð Bjarmason, Sep 16, 2020
  25. Đoàn Trần Công DanhSep 16, 2020
  26. Junio C HamanoSep 16, 2020
  27. 02/15 remote-mediawiki doc: link to MediaWiki's current versionÆvar Arnfjörð Bjarmason, Sep 16, 2020
  28. 01/15 remote-mediawiki doc: correct link to GitHub projectÆvar Arnfjörð Bjarmason, Sep 16, 2020
  29. Jeff KingSep 16, 2020
  30. Junio C HamanoSep 17, 2020
  31. 04/15 remote-mediawiki tests: use the login/password variablesÆvar Arnfjörð Bjarmason, Sep 16, 2020
  32. Johannes SchindelinSep 16, 2020
  33. Ævar Arnfjörð BjarmasonSep 21, 2020
  34. 05/15 remote-mediawiki tests: use a 10 character passwordÆvar Arnfjörð Bjarmason, Sep 16, 2020
  35. 00/18 remote-mediawiki: fix RCE issue, and the testsÆvar Arnfjörð Bjarmason, Sep 21, 2020
  36. Jeff KingSep 25, 2020
  37. 03/18 remote-mediawiki doc: don't hardcode Debian PHP versionsÆvar Arnfjörð Bjarmason, Sep 21, 2020
  38. 01/18 remote-mediawiki doc: correct link to GitHub projectÆvar Arnfjörð Bjarmason, Sep 21, 2020
  39. 02/18 remote-mediawiki doc: link to MediaWiki's current versionÆvar Arnfjörð Bjarmason, Sep 21, 2020
  40. 07/18 remote-mediawiki tests: change `[]` to `test`Ævar Arnfjörð Bjarmason, Sep 21, 2020
  41. 09/18 remote-mediawiki tests: use a more idiomatic dispatch tableÆvar Arnfjörð Bjarmason, Sep 21, 2020
  42. 11/18 remote-mediawiki tests: use inline PerlIO for readabilityÆvar Arnfjörð Bjarmason, Sep 21, 2020
  43. 06/18 remote-mediawiki tests: use test_cmp in testsÆvar Arnfjörð Bjarmason, Sep 21, 2020
  44. 08/18 remote-mediawiki tests: use "$dir/" instead of "$dir."Ævar Arnfjörð Bjarmason, Sep 21, 2020
  45. 04/18 remote-mediawiki tests: use the login/password variablesÆvar Arnfjörð Bjarmason, Sep 21, 2020
  46. 05/18 remote-mediawiki tests: use a 10 character passwordÆvar Arnfjörð Bjarmason, Sep 21, 2020
  47. 10/18 remote-mediawiki tests: replace deprecated Perl constructÆvar Arnfjörð Bjarmason, Sep 21, 2020
  48. 17/18 remote-mediawiki: annotate unquoted uses of run_git()Ævar Arnfjörð Bjarmason, Sep 21, 2020
  49. 12/18 remote-mediawiki tests: use CLI installerÆvar Arnfjörð Bjarmason, Sep 21, 2020
  50. 18/18 remote-mediawiki: use "sh" to eliminate unquoted commandsÆvar Arnfjörð Bjarmason, Sep 21, 2020
  51. 16/18 remote-mediawiki: convert to quoted run_git() invocationÆvar Arnfjörð Bjarmason, Sep 21, 2020
  52. 15/18 remote-mediawiki: provide a list form of run_git()Ævar Arnfjörð Bjarmason, Sep 21, 2020
  53. 13/18 remote-mediawiki: fix duplicate revisions being importedÆvar Arnfjörð Bjarmason, Sep 21, 2020
  54. 14/18 remote-mediawiki tests: annotate failing testsÆvar Arnfjörð Bjarmason, Sep 21, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.