Commit c48a7c44 authored by Vegard Nossum's avatar Vegard Nossum Committed by Jonathan Corbet

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 3231dd58 ("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/111676532203641247Reported-by: default avatarJani Nikula <jani.nikula@intel.com>
Signed-off-by: default avatarVegard Nossum <vegard.nossum@oracle.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarJonathan Corbet <corbet@lwn.net>
Link: https://lore.kernel.org/r/20240110174758.3680506-1-vegard.nossum@oracle.com
parent 1f4cac0f
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features .. kernel-feat:: features
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features arc .. kernel-feat:: features arc
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features arm .. kernel-feat:: features arm
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features arm64 .. kernel-feat:: features arm64
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features loongarch .. kernel-feat:: features loongarch
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features m68k .. kernel-feat:: features m68k
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features mips .. kernel-feat:: features mips
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features nios2 .. kernel-feat:: features nios2
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features openrisc .. kernel-feat:: features openrisc
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features parisc .. kernel-feat:: features parisc
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features powerpc .. kernel-feat:: features powerpc
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features riscv .. kernel-feat:: features riscv
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features s390 .. kernel-feat:: features s390
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features sh .. kernel-feat:: features sh
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features sparc .. kernel-feat:: features sparc
.. SPDX-License-Identifier: GPL-2.0 .. SPDX-License-Identifier: GPL-2.0
.. kernel-feat:: $srctree/Documentation/features x86 .. kernel-feat:: features x86
.. 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 ...@@ -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): ...@@ -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 "
cmd += self.arguments[0]
if len(self.arguments) > 1:
cmd += " --arch " + self.arguments[1]
srctree = path.abspath(os.environ["srctree"]) srctree = os.path.abspath(os.environ["srctree"])
fname = cmd args = [
os.path.join(srctree, 'scripts/get_feat.pl'),
'rest',
'--enable-fname',
'--dir',
os.path.join(srctree, 'Documentation', self.arguments[0]),
]
# extend PATH with $(srctree)/scripts if len(self.arguments) > 1:
path_env = os.pathsep.join([ args.extend(['--arch', self.arguments[1]])
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) lines = subprocess.check_output(args, cwd=os.path.dirname(doc.current_source)).decode('utf-8')
line_regex = re.compile(r"^\.\. FILE (\S+)$") line_regex = re.compile(r"^\.\. FILE (\S+)$")
...@@ -121,30 +112,6 @@ class KernelFeat(Directive): ...@@ -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 @@ ...@@ -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 @@ ...@@ -10,4 +10,4 @@
.. _cn_features: .. _cn_features:
.. kernel-feat:: $srctree/Documentation/features mips .. kernel-feat:: features mips
...@@ -5,5 +5,5 @@ ...@@ -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 @@ ...@@ -10,5 +10,5 @@
.. _tw_features: .. _tw_features:
.. kernel-feat:: $srctree/Documentation/features mips .. kernel-feat:: features mips
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment