Package: release.debian.org Severity: normal Tags: bullseye User: release.debian....@packages.debian.org Usertags: pu X-Debbugs-Cc: exuberant-ct...@packages.debian.org Control: affects -1 + src:exuberant-ctags
[ Reason ] I'd like to belatedly fix CVE-2022-4515 in bullseye. [ Impact ] Security vulnerability as described in https://security-tracker.debian.org/tracker/CVE-2022-4515, though the security team has marked it no-dsa and asked that any fix go via a point release instead. [ Tests ] I tested this manually by calling ctags with various -o options, e.g. "ctags -o 'a b' -R", and checking that it produces the requested output file names. [ Risks ] The fix is just a straight cherry-pick from bookworm (which in turn was backported as closely as possible from universal-ctags upstream), and while I hate the continued use of system(3) here it's probably better than introducing a novel rewrite for a security update. [ Checklist ] [x] *all* changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in (old)stable [x] the issue is verified as fixed in unstable [ Changes ] As attached. git-dpm has introduced a small amount of additional noise; I didn't think it was worth the effort to persuade it to avoid that in this case. Thanks, -- Colin Watson (he/him) [cjwat...@debian.org]
diff --git a/debian/.git-dpm b/debian/.git-dpm index be86f1e84..e26b5ab8c 100644 --- a/debian/.git-dpm +++ b/debian/.git-dpm @@ -1,6 +1,6 @@ # see git-dpm(1) from git-dpm package -ed1d00e4c005ecc20f298630cce7635d88f5b669 -ed1d00e4c005ecc20f298630cce7635d88f5b669 +5c9ca1167f9eebf78bf28763e3604b1af79c967d +5c9ca1167f9eebf78bf28763e3604b1af79c967d 4b0ebb9d344fd369c889291478986c65a5a36ea8 4b0ebb9d344fd369c889291478986c65a5a36ea8 exuberant-ctags_5.9~svn20110310.orig.tar.gz diff --git a/debian/changelog b/debian/changelog index 62ccf7654..75c7d8e08 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +exuberant-ctags (1:5.9~svn20110310-14+deb11u1) UNRELEASED; urgency=medium + + * Backport from universal-ctags: + - CVE-2022-4515: main: quote output file name before passing it to + system(3) function (closes: #1026995). + + -- Colin Watson <cjwat...@debian.org> Sun, 24 Dec 2023 12:41:53 +0000 + exuberant-ctags (1:5.9~svn20110310-14) unstable; urgency=low [ Debian Janitor ] diff --git a/debian/patches/gcc-no-common.patch b/debian/patches/gcc-no-common.patch index 024422c9e..308f7d9c9 100644 --- a/debian/patches/gcc-no-common.patch +++ b/debian/patches/gcc-no-common.patch @@ -14,7 +14,7 @@ Patch-Name: gcc-no-common.patch 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/objc.c b/objc.c -index 2a5de58..a5811ec 100644 +index 2a5de58ab..a5811ec59 100644 --- a/objc.c +++ b/objc.c @@ -432,16 +432,16 @@ typedef void (*parseNext) (vString * const ident, objcToken what); @@ -38,7 +38,7 @@ index 2a5de58..a5811ec 100644 /********** Grammar */ diff --git a/ocaml.c b/ocaml.c -index 104a777..235862f 100644 +index 104a77706..235862fd3 100644 --- a/ocaml.c +++ b/ocaml.c @@ -514,26 +514,26 @@ typedef void (*parseNext) (vString * const ident, ocaToken what); diff --git a/debian/patches/go.patch b/debian/patches/go.patch index 760f47bd0..bce44fd73 100644 --- a/debian/patches/go.patch +++ b/debian/patches/go.patch @@ -17,7 +17,7 @@ Patch-Name: go.patch diff --git a/go.c b/go.c new file mode 100644 -index 0000000..6bd3a36 +index 000000000..6bd3a369a --- /dev/null +++ b/go.c @@ -0,0 +1,670 @@ @@ -692,7 +692,7 @@ index 0000000..6bd3a36 + return def; +} diff --git a/parsers.h b/parsers.h -index 600f636..3a24d6e 100644 +index 600f63614..3a24d6e09 100644 --- a/parsers.h +++ b/parsers.h @@ -31,6 +31,7 @@ @@ -704,7 +704,7 @@ index 600f636..3a24d6e 100644 JavaParser, \ JavaScriptParser, \ diff --git a/source.mak b/source.mak -index c97617f..985d56c 100644 +index c97617f34..985d56cfc 100644 --- a/source.mak +++ b/source.mak @@ -24,6 +24,7 @@ SOURCES = \ diff --git a/debian/patches/jscript-set-tag-scope.patch b/debian/patches/jscript-set-tag-scope.patch index baf036ffc..a0958b573 100644 --- a/debian/patches/jscript-set-tag-scope.patch +++ b/debian/patches/jscript-set-tag-scope.patch @@ -17,7 +17,7 @@ Patch-Name: jscript-set-tag-scope.patch 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/jscript.c b/jscript.c -index 5de3367..a790355 100644 +index 5de3367f9..a790355b8 100644 --- a/jscript.c +++ b/jscript.c @@ -215,6 +215,7 @@ static void deleteToken (tokenInfo *const token) diff --git a/debian/patches/memmove.patch b/debian/patches/memmove.patch index d23551a4b..b3e0ad9e1 100644 --- a/debian/patches/memmove.patch +++ b/debian/patches/memmove.patch @@ -16,7 +16,7 @@ Patch-Name: memmove.patch 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/routines.c b/routines.c -index 83bcdcc..8ebe2e0 100644 +index 83bcdccda..8ebe2e0ad 100644 --- a/routines.c +++ b/routines.c @@ -757,13 +757,13 @@ extern char* absoluteFilename (const char *file) diff --git a/debian/patches/python-disable-imports.patch b/debian/patches/python-disable-imports.patch index 99c4e20fb..f77909746 100644 --- a/debian/patches/python-disable-imports.patch +++ b/debian/patches/python-disable-imports.patch @@ -18,7 +18,7 @@ Patch-Name: python-disable-imports.patch 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python.c b/python.c -index a90d072..bf797de 100644 +index a90d072b3..bf797de7c 100644 --- a/python.c +++ b/python.c @@ -56,7 +56,7 @@ static kindOption PythonKinds[] = { diff --git a/debian/patches/quote-output-file-name.patch b/debian/patches/quote-output-file-name.patch new file mode 100644 index 000000000..25e52fbc7 --- /dev/null +++ b/debian/patches/quote-output-file-name.patch @@ -0,0 +1,115 @@ +From 5c9ca1167f9eebf78bf28763e3604b1af79c967d Mon Sep 17 00:00:00 2001 +From: Masatake YAMATO <yam...@redhat.com> +Date: Mon, 24 Oct 2016 23:52:23 +0900 +Subject: main: quote output file name before passing it to system(3) function + +Following command line doesn't work: + + $ ctags -o 'a b' ... + +because a shell lauched from system(3) deals a whitespace between 'a' +and 'b' as a separator. The output file name is passed to system(3) +to run external sort command. + +This commit adds code to put double and single quoets around the output +file name before passing it to system(3). + +The issue is reported by Lorenz Hipp <lh...@idealbonn.de> in a private mail. + +Signed-off-by: Masatake YAMATO <yam...@redhat.com> + +Origin: backport, https://github.com/universal-ctags/ctags/commit/e00c55d7a0204dc1d0ae316141323959e1e16162 +Bug-Debian: https://bugs.debian.org/1026995 +Last-Update: 2022-12-26 + +Patch-Name: quote-output-file-name.patch +--- + sort.c | 53 ++++++++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 42 insertions(+), 11 deletions(-) + +diff --git a/sort.c b/sort.c +index c58defc34..260fbbd21 100644 +--- a/sort.c ++++ b/sort.c +@@ -53,17 +53,44 @@ extern void catFile (const char *const name) + # define PE_CONST const + #endif + ++/* ++ Output file name should not be evaluated in system(3) function. ++ The name must be used as is. Quotations are required to block the ++ evaluation. ++ ++ Normal single-quotes are used to quote a cstring: ++ a => 'a' ++ " => '"' ++ ++ If a single-quote is included in the cstring, use double quotes for quoting it. ++ ' => ''"'"'' ++*/ ++static void appendCstringWithQuotes (vString *dest, const char* cstr) ++{ ++ const char* o; ++ ++ vStringPut (dest, '\''); ++ for (o = cstr; *o; o++) ++ { ++ if (*o == '\'') ++ vStringCatS (dest, "'\"'\"'"); ++ else ++ vStringPut (dest, *o); ++ } ++ vStringPut (dest, '\''); ++} ++ + extern void externalSortTags (const boolean toStdout) + { + const char *const sortNormalCommand = "sort -u -o"; + const char *const sortFoldedCommand = "sort -u -f -o"; + const char *sortCommand = + Option.sorted == SO_FOLDSORTED ? sortFoldedCommand : sortNormalCommand; ++# ifndef HAVE_SETENV + PE_CONST char *const sortOrder1 = "LC_COLLATE=C"; + PE_CONST char *const sortOrder2 = "LC_ALL=C"; +- const size_t length = 4 + strlen (sortOrder1) + strlen (sortOrder2) + +- strlen (sortCommand) + (2 * strlen (tagFileName ())); +- char *const cmd = (char *) malloc (length + 1); ++# endif ++ vString *cmd = vStringNew (); + int ret = -1; + + if (cmd != NULL) +@@ -73,21 +100,25 @@ extern void externalSortTags (const boolean toStdout) + #ifdef HAVE_SETENV + setenv ("LC_COLLATE", "C", 1); + setenv ("LC_ALL", "C", 1); +- sprintf (cmd, "%s %s %s", sortCommand, tagFileName (), tagFileName ()); + #else + # ifdef HAVE_PUTENV + putenv (sortOrder1); + putenv (sortOrder2); +- sprintf (cmd, "%s %s %s", sortCommand, tagFileName (), tagFileName ()); + # else +- sprintf (cmd, "%s %s %s %s %s", sortOrder1, sortOrder2, sortCommand, +- tagFileName (), tagFileName ()); ++ vStringCatS (cmd, sortOrder1); ++ vStringPut (cmd, ' '); ++ vStringCatS (cmd, sortOrder2); ++ vStringPut (cmd, ' '); + # endif + #endif +- verbose ("system (\"%s\")\n", cmd); +- ret = system (cmd); +- free (cmd); +- ++ vStringCatS (cmd, sortCommand); ++ vStringPut (cmd, ' '); ++ appendCstringWithQuotes (cmd, tagFileName ()); ++ vStringPut (cmd, ' '); ++ appendCstringWithQuotes (cmd, tagFileName ()); ++ verbose ("system (\"%s\")\n", vStringValue (cmd)); ++ ret = system (vStringValue (cmd)); ++ vStringDelete (cmd); + } + if (ret != 0) + error (FATAL | PERROR, "cannot sort tag file"); diff --git a/debian/patches/reproducible.patch b/debian/patches/reproducible.patch index 7d0bae4b0..3571259e8 100644 --- a/debian/patches/reproducible.patch +++ b/debian/patches/reproducible.patch @@ -13,7 +13,7 @@ Patch-Name: reproducible.patch 1 file changed, 1 deletion(-) diff --git a/options.c b/options.c -index d26627f..ae773ef 100644 +index d26627feb..ae773ef1e 100644 --- a/options.c +++ b/options.c @@ -924,7 +924,6 @@ static void printProgramIdentification (void) diff --git a/debian/patches/series b/debian/patches/series index 526a4e48f..a718557cd 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -5,3 +5,4 @@ go.patch jscript-set-tag-scope.patch reproducible.patch gcc-no-common.patch +quote-output-file-name.patch diff --git a/debian/patches/vim-command-loop.patch b/debian/patches/vim-command-loop.patch index 44cfaadc6..1d02302d3 100644 --- a/debian/patches/vim-command-loop.patch +++ b/debian/patches/vim-command-loop.patch @@ -17,7 +17,7 @@ Patch-Name: vim-command-loop.patch 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vim.c b/vim.c -index 4e6fba8..d17a1ba 100644 +index 4e6fba84f..d17a1baed 100644 --- a/vim.c +++ b/vim.c @@ -405,7 +405,9 @@ static boolean parseCommand (const unsigned char *line)