]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.20-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Feb 2019 07:19:21 +0000 (08:19 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 15 Feb 2019 07:19:21 +0000 (08:19 +0100)
added patches:
revert-exec-load_script-don-t-blindly-truncate-shebang-string.patch

queue-4.20/revert-exec-load_script-don-t-blindly-truncate-shebang-string.patch [new file with mode: 0644]

diff --git a/queue-4.20/revert-exec-load_script-don-t-blindly-truncate-shebang-string.patch b/queue-4.20/revert-exec-load_script-don-t-blindly-truncate-shebang-string.patch
new file mode 100644 (file)
index 0000000..384836f
--- /dev/null
@@ -0,0 +1,45 @@
+From cb5b020a8d38f77209d0472a0fea755299a8ec78 Mon Sep 17 00:00:00 2001
+From: Linus Torvalds <torvalds@linux-foundation.org>
+Date: Thu, 14 Feb 2019 15:02:18 -0800
+Subject: Revert "exec: load_script: don't blindly truncate shebang string"
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+commit cb5b020a8d38f77209d0472a0fea755299a8ec78 upstream.
+
+This reverts commit 8099b047ecc431518b9bb6bdbba3549bbecdc343.
+
+It turns out that people do actually depend on the shebang string being
+truncated, and on the fact that an interpreter (like perl) will often
+just re-interpret it entirely to get the full argument list.
+
+Reported-by: Samuel Dionne-Riel <samuel@dionne-riel.com>
+Acked-by: Kees Cook <keescook@chromium.org>
+Cc: Oleg Nesterov <oleg@redhat.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/binfmt_script.c |   10 +++-------
+ 1 file changed, 3 insertions(+), 7 deletions(-)
+
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -42,14 +42,10 @@ static int load_script(struct linux_binp
+       fput(bprm->file);
+       bprm->file = NULL;
+-      for (cp = bprm->buf+2;; cp++) {
+-              if (cp >= bprm->buf + BINPRM_BUF_SIZE)
+-                      return -ENOEXEC;
+-              if (!*cp || (*cp == '\n'))
+-                      break;
+-      }
++      bprm->buf[BINPRM_BUF_SIZE - 1] = '\0';
++      if ((cp = strchr(bprm->buf, '\n')) == NULL)
++              cp = bprm->buf+BINPRM_BUF_SIZE-1;
+       *cp = '\0';
+-
+       while (cp > bprm->buf) {
+               cp--;
+               if ((*cp == ' ') || (*cp == '\t'))