mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
docs: kernel_feat.py: fix potential command injection
The kernel-feat directive passes its argument straight to the shell.
This is unfortunate and unnecessary.
Let's always use paths relative to $srctree/Documentation/ and use
subprocess.check_call() instead of subprocess.Popen(shell=True).
This also makes the code shorter.
This is analogous to commit 3231dd5862
("docs: kernel_abi.py: fix
command injection") where we did exactly the same thing for
kernel_abi.py, somehow I completely missed this one.
Link: https://fosstodon.org/@jani/111676532203641247
Reported-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Vegard Nossum <vegard.nossum@oracle.com>
Cc: stable@vger.kernel.org
Signed-off-by: Jonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/20240110174758.3680506-1-vegard.nossum@oracle.com
This commit is contained in:
parent
1f4cac0f74
commit
c48a7c44a1
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features
|
.. kernel-feat:: features
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features arc
|
.. kernel-feat:: features arc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features arm
|
.. kernel-feat:: features arm
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features arm64
|
.. kernel-feat:: features arm64
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features loongarch
|
.. kernel-feat:: features loongarch
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features m68k
|
.. kernel-feat:: features m68k
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features mips
|
.. kernel-feat:: features mips
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features nios2
|
.. kernel-feat:: features nios2
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features openrisc
|
.. kernel-feat:: features openrisc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features parisc
|
.. kernel-feat:: features parisc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features powerpc
|
.. kernel-feat:: features powerpc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features riscv
|
.. kernel-feat:: features riscv
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features s390
|
.. kernel-feat:: features s390
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features sh
|
.. kernel-feat:: features sh
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features sparc
|
.. kernel-feat:: features sparc
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features x86
|
.. kernel-feat:: features x86
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
.. SPDX-License-Identifier: GPL-2.0
|
.. SPDX-License-Identifier: GPL-2.0
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features xtensa
|
.. kernel-feat:: features xtensa
|
||||||
|
@ -37,8 +37,6 @@ import re
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from os import path
|
|
||||||
|
|
||||||
from docutils import nodes, statemachine
|
from docutils import nodes, statemachine
|
||||||
from docutils.statemachine import ViewList
|
from docutils.statemachine import ViewList
|
||||||
from docutils.parsers.rst import directives, Directive
|
from docutils.parsers.rst import directives, Directive
|
||||||
@ -76,33 +74,26 @@ class KernelFeat(Directive):
|
|||||||
self.state.document.settings.env.app.warn(message, prefix="")
|
self.state.document.settings.env.app.warn(message, prefix="")
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
|
|
||||||
doc = self.state.document
|
doc = self.state.document
|
||||||
if not doc.settings.file_insertion_enabled:
|
if not doc.settings.file_insertion_enabled:
|
||||||
raise self.warning("docutils: file insertion disabled")
|
raise self.warning("docutils: file insertion disabled")
|
||||||
|
|
||||||
env = doc.settings.env
|
env = doc.settings.env
|
||||||
cwd = path.dirname(doc.current_source)
|
|
||||||
cmd = "get_feat.pl rest --enable-fname --dir "
|
srctree = os.path.abspath(os.environ["srctree"])
|
||||||
cmd += self.arguments[0]
|
|
||||||
|
args = [
|
||||||
|
os.path.join(srctree, 'scripts/get_feat.pl'),
|
||||||
|
'rest',
|
||||||
|
'--enable-fname',
|
||||||
|
'--dir',
|
||||||
|
os.path.join(srctree, 'Documentation', self.arguments[0]),
|
||||||
|
]
|
||||||
|
|
||||||
if len(self.arguments) > 1:
|
if len(self.arguments) > 1:
|
||||||
cmd += " --arch " + self.arguments[1]
|
args.extend(['--arch', self.arguments[1]])
|
||||||
|
|
||||||
srctree = path.abspath(os.environ["srctree"])
|
lines = subprocess.check_output(args, cwd=os.path.dirname(doc.current_source)).decode('utf-8')
|
||||||
|
|
||||||
fname = cmd
|
|
||||||
|
|
||||||
# extend PATH with $(srctree)/scripts
|
|
||||||
path_env = os.pathsep.join([
|
|
||||||
srctree + os.sep + "scripts",
|
|
||||||
os.environ["PATH"]
|
|
||||||
])
|
|
||||||
shell_env = os.environ.copy()
|
|
||||||
shell_env["PATH"] = path_env
|
|
||||||
shell_env["srctree"] = srctree
|
|
||||||
|
|
||||||
lines = self.runCmd(cmd, shell=True, cwd=cwd, env=shell_env)
|
|
||||||
|
|
||||||
line_regex = re.compile(r"^\.\. FILE (\S+)$")
|
line_regex = re.compile(r"^\.\. FILE (\S+)$")
|
||||||
|
|
||||||
@ -121,30 +112,6 @@ class KernelFeat(Directive):
|
|||||||
nodeList = self.nestedParse(out_lines, fname)
|
nodeList = self.nestedParse(out_lines, fname)
|
||||||
return nodeList
|
return nodeList
|
||||||
|
|
||||||
def runCmd(self, cmd, **kwargs):
|
|
||||||
u"""Run command ``cmd`` and return its stdout as unicode."""
|
|
||||||
|
|
||||||
try:
|
|
||||||
proc = subprocess.Popen(
|
|
||||||
cmd
|
|
||||||
, stdout = subprocess.PIPE
|
|
||||||
, stderr = subprocess.PIPE
|
|
||||||
, **kwargs
|
|
||||||
)
|
|
||||||
out, err = proc.communicate()
|
|
||||||
|
|
||||||
out, err = codecs.decode(out, 'utf-8'), codecs.decode(err, 'utf-8')
|
|
||||||
|
|
||||||
if proc.returncode != 0:
|
|
||||||
raise self.severe(
|
|
||||||
u"command '%s' failed with return code %d"
|
|
||||||
% (cmd, proc.returncode)
|
|
||||||
)
|
|
||||||
except OSError as exc:
|
|
||||||
raise self.severe(u"problems with '%s' directive: %s."
|
|
||||||
% (self.name, ErrorString(exc)))
|
|
||||||
return out
|
|
||||||
|
|
||||||
def nestedParse(self, lines, fname):
|
def nestedParse(self, lines, fname):
|
||||||
content = ViewList()
|
content = ViewList()
|
||||||
node = nodes.section()
|
node = nodes.section()
|
||||||
|
@ -5,4 +5,4 @@
|
|||||||
:Original: Documentation/arch/loongarch/features.rst
|
:Original: Documentation/arch/loongarch/features.rst
|
||||||
:Translator: Huacai Chen <chenhuacai@loongson.cn>
|
:Translator: Huacai Chen <chenhuacai@loongson.cn>
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features loongarch
|
.. kernel-feat:: features loongarch
|
||||||
|
@ -10,4 +10,4 @@
|
|||||||
|
|
||||||
.. _cn_features:
|
.. _cn_features:
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features mips
|
.. kernel-feat:: features mips
|
||||||
|
@ -5,5 +5,5 @@
|
|||||||
:Original: Documentation/arch/loongarch/features.rst
|
:Original: Documentation/arch/loongarch/features.rst
|
||||||
:Translator: Huacai Chen <chenhuacai@loongson.cn>
|
:Translator: Huacai Chen <chenhuacai@loongson.cn>
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features loongarch
|
.. kernel-feat:: features loongarch
|
||||||
|
|
||||||
|
@ -10,5 +10,5 @@
|
|||||||
|
|
||||||
.. _tw_features:
|
.. _tw_features:
|
||||||
|
|
||||||
.. kernel-feat:: $srctree/Documentation/features mips
|
.. kernel-feat:: features mips
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user