tcsh-6.18.01-elf-interpreter.patch removed
This patch was not working in latest tcsh packages in Fedora, and it was not accepted by upstream. Generally, shells (bash, ksh, tcsh, ...) does not want to have this kind of binary parsing inside of them. See: <http://mx.gw.com/pipermail/tcsh-bugs/2013-April/000833.html>
This commit is contained in:
parent
4da5459ce3
commit
0de832d6c5
@ -1,198 +0,0 @@
|
||||
From b913dff5f7c123691b9aea3cee4bf270bc56659b Mon Sep 17 00:00:00 2001
|
||||
From: rpm-build <rpm-build>
|
||||
Date: Wed, 27 Aug 2014 13:55:10 +0200
|
||||
Subject: [PATCH 12/14] report missing ELF interpreter
|
||||
|
||||
Resolves: #711066
|
||||
|
||||
Adjusted for tcsh-6.19.00 by Fridolin Pokorny <fpokorny@redhat.com>
|
||||
|
||||
---
|
||||
configure.in | 5 ++-
|
||||
sh.err.c | 4 +-
|
||||
sh.exec.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 152 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/sh.err.c b/sh.err.c
|
||||
index 29d41c3..262f9bf 100644
|
||||
--- a/sh.err.c
|
||||
+++ b/sh.err.c
|
||||
@@ -189,7 +189,8 @@ char *seterr = NULL; /* Holds last error if there was one */
|
||||
#define ERR_INVALID 133
|
||||
#define ERR_BADCOLORVAR 134
|
||||
#define ERR_EOF 135
|
||||
-#define NO_ERRORS 136
|
||||
+#define ERR_ELFINTERP 136
|
||||
+#define NO_ERRORS 137
|
||||
|
||||
static const char *elst[NO_ERRORS] INIT_ZERO_STRUCT;
|
||||
|
||||
@@ -367,6 +368,7 @@ errinit(void)
|
||||
elst[ERR_BADJOB] = CSAVS(1, 136, "No such job (badjob)");
|
||||
elst[ERR_BADCOLORVAR] = CSAVS(1, 137, "Unknown colorls variable `%c%c'");
|
||||
elst[ERR_EOF] = CSAVS(1, 138, "Unexpected end of file");
|
||||
+ elst[ERR_ELFINTERP] = CSAVS(1, 139, "No such ELF interpreter");
|
||||
}
|
||||
|
||||
/* Cleanup data. */
|
||||
diff --git a/sh.exec.c b/sh.exec.c
|
||||
index 2b41a53..c1f4b7e 100644
|
||||
--- a/sh.exec.c
|
||||
+++ b/sh.exec.c
|
||||
@@ -40,6 +40,10 @@ RCSID("$tcsh: sh.exec.c,v 3.79 2011/02/25 23:58:34 christos Exp $")
|
||||
#include <nt.const.h>
|
||||
#endif /*WINNT_NATIVE*/
|
||||
|
||||
+#ifdef HAVE_ELF_H
|
||||
+#include <elf.h>
|
||||
+#endif /*HAVE_ELF_H*/
|
||||
+
|
||||
/*
|
||||
* C shell
|
||||
*/
|
||||
@@ -509,6 +513,142 @@ texec(Char *sf, Char **st)
|
||||
case 0: /* execv fails and returns 0! */
|
||||
#endif /* _IBMR2 */
|
||||
case ENOENT:
|
||||
+#ifdef HAVE_ELF_H
|
||||
+ /*
|
||||
+ * If dynamically linked ELF binary is not executed and exists,
|
||||
+ * the real reason ENOENT is that ELF interpreter is missing.
|
||||
+ *
|
||||
+ * Written by Ulrich Drepper for bash
|
||||
+ * adopted by Fridolin Pokorny <fpokorny@redhat.com>
|
||||
+ */
|
||||
+ if ((fd = xopen(f, O_RDONLY|O_LARGEFILE)) != -1) {
|
||||
+ int nread;
|
||||
+ char *sample;
|
||||
+ int offset = -1;
|
||||
+ int sample_size;
|
||||
+
|
||||
+ /* Inspect 32 and 64 ELF */
|
||||
+ if (sizeof(Elf64_Ehdr) > sizeof(Elf32_Ehdr))
|
||||
+ sample_size = sizeof(Elf64_Ehdr);
|
||||
+ else
|
||||
+ sample_size = sizeof(Elf32_Ehdr);
|
||||
+
|
||||
+ sample = xmalloc(sample_size);
|
||||
+
|
||||
+ if (sample != 0 &&
|
||||
+ (nread = xread(fd, sample, sample_size)) == sample_size) {
|
||||
+ if (memcmp(sample, ELFMAG, SELFMAG) == 0) {
|
||||
+ if (sample[EI_CLASS] == ELFCLASS32 &&
|
||||
+ sample_size >= sizeof(Elf32_Ehdr)) {
|
||||
+ Elf32_Ehdr ehdr;
|
||||
+ Elf32_Phdr *phdr;
|
||||
+ int nphdr;
|
||||
+
|
||||
+ /*
|
||||
+ * We have to copy the data since the sample buffer
|
||||
+ * might not be aligned correctly to be accessed as
|
||||
+ * an Elf32_Ehdr struct.
|
||||
+ */
|
||||
+ memcpy(&ehdr, sample, sizeof(Elf32_Ehdr));
|
||||
+
|
||||
+ nphdr = ehdr.e_phnum;
|
||||
+ phdr = xmalloc(nphdr * ehdr.e_phentsize);
|
||||
+ if(phdr != NULL) {
|
||||
+#ifdef HAVE_PREAD
|
||||
+ nread = pread(fd, phdr, nphdr * ehdr.e_phentsize,
|
||||
+ ehdr.e_phoff);
|
||||
+#else /* !HAVE_PREAD */
|
||||
+ if (lseek(fd, ehdr.e_phoff, SEEK_SET) != -1)
|
||||
+ nread = read(fd, phdr,
|
||||
+ nphdr * ehdr.e_phentsize);
|
||||
+ else
|
||||
+ nread = -1;
|
||||
+#endif /* HAVE_PREAD */
|
||||
+ if (nread == nphdr * ehdr.e_phentsize) {
|
||||
+ while (nphdr-- > 0) {
|
||||
+ if (phdr[nphdr].p_type == PT_INTERP) {
|
||||
+ offset = phdr[nphdr].p_offset;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ xfree(phdr);
|
||||
+ }
|
||||
+ } else if (sample[EI_CLASS] == ELFCLASS64 &&
|
||||
+ sample_size >= sizeof(Elf64_Ehdr)) {
|
||||
+ Elf64_Ehdr ehdr;
|
||||
+ Elf64_Phdr *phdr;
|
||||
+ int nphdr;
|
||||
+
|
||||
+ /*
|
||||
+ * We have to copy the data since the sample buffer
|
||||
+ * might not be aligned correctly to be accessed as
|
||||
+ * an Elf64_Ehdr struct.
|
||||
+ */
|
||||
+ memcpy(&ehdr, sample, sizeof(Elf64_Ehdr));
|
||||
+
|
||||
+ nphdr = ehdr.e_phnum;
|
||||
+ phdr = xmalloc(nphdr * ehdr.e_phentsize);
|
||||
+ if (phdr != NULL) {
|
||||
+#ifdef HAVE_PREAD
|
||||
+ nread = pread (fd, phdr, nphdr * ehdr.e_phentsize,
|
||||
+ ehdr.e_phoff);
|
||||
+#else /* !HAVE_PREAD */
|
||||
+ if (lseek(fd, ehdr.e_phoff, SEEK_SET) != -1)
|
||||
+ nread = read (fd, phdr,
|
||||
+ nphdr * ehdr.e_phentsize);
|
||||
+ else
|
||||
+ nread = -1;
|
||||
+#endif /* HAVE_PREAD */
|
||||
+ if (nread == nphdr * ehdr.e_phentsize) {
|
||||
+ while (nphdr-- > 0) {
|
||||
+ if (phdr[nphdr].p_type == PT_INTERP) {
|
||||
+ offset = phdr[nphdr].p_offset;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ xfree (phdr);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (offset != -1) {
|
||||
+ size_t maxlen = 0;
|
||||
+ size_t actlen = 0;
|
||||
+ char *interp = NULL;
|
||||
+
|
||||
+ do {
|
||||
+ if (actlen == maxlen) {
|
||||
+ char *newinterp = xrealloc(interp, maxlen += 200);
|
||||
+ if (newinterp == NULL) {
|
||||
+ actlen = 0;
|
||||
+ break;
|
||||
+ }
|
||||
+ interp = newinterp;
|
||||
+#ifdef HAVE_PREAD
|
||||
+ actlen = pread (fd, interp, maxlen, offset);
|
||||
+#else /* !HAVE_PREAD */
|
||||
+ if (lseek (fd, offset, SEEK_SET) != -1)
|
||||
+ actlen = read (fd, interp, maxlen);
|
||||
+ else
|
||||
+ actlen = -1;
|
||||
+#endif /* HAVE_PREAD */
|
||||
+ }
|
||||
+ } while (actlen > 0 &&
|
||||
+ memchr (interp, '\0', actlen) == NULL);
|
||||
+
|
||||
+ if (actlen > 0) {
|
||||
+ xclose (fd);
|
||||
+ xfree (interp);
|
||||
+ setname(f);
|
||||
+ stderror(ERR_NAME | ERR_ELFINTERP);
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ xfree(sample);
|
||||
+ }
|
||||
+#endif /* HAVE_ELF_H */
|
||||
break;
|
||||
|
||||
default:
|
||||
--
|
||||
1.9.3
|
||||
|
@ -35,8 +35,6 @@ Source: ftp://ftp.astron.com/pub/tcsh/%{name}-%{version}.tar.gz
|
||||
Patch4: tcsh-6.15.00-hist-sub.patch
|
||||
Patch9: tcsh-6.13.00-memoryuse.patch
|
||||
Patch11: tcsh-6.14.00-order.patch
|
||||
# Proposed upstream - http://mx.gw.com/pipermail/tcsh-bugs/2013-April/000833.html
|
||||
Patch35: tcsh-6.18.01-elf-interpreter.patch
|
||||
Patch36: tcsh-6.18.01-introduce-tcsh_posix_status.patch
|
||||
# Proposed upstream - http://mx.gw.com/pipermail/tcsh-bugs/2015-May/000944.html
|
||||
Patch39: tcsh-6.19.00-gcc5-calloc.patch
|
||||
@ -150,6 +148,7 @@ fi
|
||||
- Drop tcsh-6.14.00-unprintable.patch - issue not reproducible with 6.19.00 upstream version
|
||||
- Drop tcsh-6.14.00-syntax.patch - patch not accepted by upstream, breaks other things
|
||||
- Drop tcsh-6.18.01-skip-tty-tests.patch - has been fixed in 6.18.05 upstream version
|
||||
- Drop tcsh-6.18.01-elf-interpreter.patch - patch not working anymore, not accepted by upstream
|
||||
|
||||
* Fri Feb 05 2016 Fedora Release Engineering <releng@fedoraproject.org> - 6.19.00-5
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
|
||||
|
Loading…
Reference in New Issue
Block a user