vim/0001-patch-9.2.0568-pythoncomplete-g-pythoncomplete_allow.patch
RHEL Packaging Agent df0792b607 Fix CVE-2026-52858: possible code execution with python3complete
Backport two upstream commits to fix CVE-2026-52858, which
allowed possible code execution via import/from statements in
python3complete and pythoncomplete omni-completion plugins.

Patch 9.2.0561 disables execution of import/from statements
by default and adds a g:pythoncomplete_allow_import opt-in
variable. Patch 9.2.0568 fixes a bug where the vim module
was not imported in evalsource() scope, causing the opt-in
variable to silently have no effect.

CVE: CVE-2026-52858
Upstream patches:
 - 4b850457e1.patch
 - 868ad62cb8.patch
Resolves: RHEL-186651

This commit was backported by Ymir, a Red Hat Enterprise Linux software maintenance AI agent.

Assisted-by: Ymir
2026-08-05 18:08:07 +02:00

85 lines
3.6 KiB
Diff

From 9fbc96ad3e9d286ec5edf8c7700da8554dd39afb Mon Sep 17 00:00:00 2001
From: thinca <thinca@gmail.com>
Date: Sun, 31 May 2026 12:33:07 +0000
Subject: [PATCH] patch 9.2.0568: pythoncomplete: g:pythoncomplete_allow_import
had no effect
Problem: The security patch 9.2.0561 added a vim.eval() call inside
Completer.evalsource() to honor g:pythoncomplete_allow_import.
But the 'vim' module is only imported inside the outer
vimcomplete() / vimpy3complete() function, not at the script's
top level, so referring to it from a Completer method raises
NameError. The surrounding bare 'except' silently swallows
the error and leaves allow_imports at 0, meaning the opt-in
never takes effect -- 'import os' (and any other
buffer-level import) is always skipped, no candidates are
produced for 'os.<...>' and
Test_popup_and_preview_autocommand() fails on the Windows
CI matrix (Linux skips the test because Python 2 is absent).
Solution: Re-import 'vim' at the top of evalsource() in both
pythoncomplete.vim and python3complete.vim so the eval reads
the global, and set g:pythoncomplete_allow_import = 1 in the
test (it is the opt-in intended for callers that trust the
buffer contents) (thinca).
closes: #20386
Signed-off-by: thinca <thinca@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
---
runtime/autoload/python3complete.vim | 3 +++
runtime/autoload/pythoncomplete.vim | 3 +++
src/testdir/test_popup.vim | 4 ++++
3 files changed, 10 insertions(+)
diff --git a/runtime/autoload/python3complete.vim b/runtime/autoload/python3complete.vim
index aba341229..1c432f3c8 100644
--- a/runtime/autoload/python3complete.vim
+++ b/runtime/autoload/python3complete.vim
@@ -135,6 +135,9 @@ class Completer(object):
self.parser = PyParser()
def evalsource(self,text,line=0):
+ # vim is imported locally in vimpy3complete(); re-import here so the
+ # vim.eval() below works (otherwise NameError, silently caught).
+ import vim
sc = self.parser.parse(text,line)
try: allow_imports = int(
vim.eval("get(g:, 'pythoncomplete_allow_import', 0)"))
diff --git a/runtime/autoload/pythoncomplete.vim b/runtime/autoload/pythoncomplete.vim
index 10147767e..b4340f7ae 100644
--- a/runtime/autoload/pythoncomplete.vim
+++ b/runtime/autoload/pythoncomplete.vim
@@ -149,6 +149,9 @@ class Completer(object):
self.parser = PyParser()
def evalsource(self,text,line=0):
+ # vim is imported locally in vimcomplete(); re-import here so the
+ # vim.eval() below works (otherwise NameError, silently caught).
+ import vim
sc = self.parser.parse(text,line)
try: allow_imports = int(
vim.eval("get(g:, 'pythoncomplete_allow_import', 0)"))
diff --git a/src/testdir/test_popup.vim b/src/testdir/test_popup.vim
index 879d1fa3e..be27097a1 100644
--- a/src/testdir/test_popup.vim
+++ b/src/testdir/test_popup.vim
@@ -724,6 +724,9 @@ func Test_popup_and_preview_autocommand()
au!
au BufAdd * nested tab sball
augroup END
+ " Let pythoncomplete follow the buffer's 'import os' (off by default
+ " since v9.2.0561) so 'os.' can be completed.
+ let g:pythoncomplete_allow_import = 1
set omnifunc=pythoncomplete#Complete
call setline(1, 'import os')
" make the line long
@@ -746,6 +749,7 @@ func Test_popup_and_preview_autocommand()
augroup END
augroup! MyBufAdd
bw!
+ unlet g:pythoncomplete_allow_import
endfunc
func Test_popup_and_previewwindow_dump()