import file-5.33-24.el8

c8 imports/c8/file-5.33-24.el8
CentOS Sources 2 years ago committed by MSVSphere Packaging Team
commit d63e7d3cac

@ -0,0 +1 @@
31a67e4dc0a3d7a8d1b850429c3f625314700240 SOURCES/file-5.33.tar.gz

1
.gitignore vendored

@ -0,0 +1 @@
SOURCES/file-5.33.tar.gz

@ -0,0 +1,12 @@
diff --git a/magic/Magdir/rpm b/magic/Magdir/rpm
index 9a795f8..31db083 100644
--- a/magic/Magdir/rpm
+++ b/magic/Magdir/rpm
@@ -29,6 +29,7 @@
>>8 beshort 17 SuperH
>>8 beshort 18 Xtensa
>>8 beshort 255 noarch
+>>10 string x %s
#delta RPM Daniel Novotny (dnovotny@redhat.com)
0 string drpm Delta RPM

@ -0,0 +1,10 @@
diff --git a/magic/Magdir/securitycerts b/magic/Magdir/securitycerts
index 8785dd8..1c340be 100644
--- a/magic/Magdir/securitycerts
+++ b/magic/Magdir/securitycerts
@@ -4,3 +4,5 @@
0 search/1 -----BEGIN\ CERTIFICATE------ RFC1421 Security Certificate text
0 search/1 -----BEGIN\ NEW\ CERTIFICATE RFC1421 Security Certificate Signing Request text
0 belong 0xedfeedfe Sun 'jks' Java Keystore File data
+
+0 string \0volume_key volume_key escrow packet

@ -0,0 +1,28 @@
From 8616080aecf07436e80a27f68c336382c1d1c22d Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Sat, 9 Jun 2018 16:00:06 +0000
Subject: [PATCH] Avoid reading past the end of buffer (Rui Reis)
Upstream-commit: a642587a9c9e2dd7feacdf513c3643ce26ad3c22
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/readelf.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/readelf.c b/src/readelf.c
index 3df0836..d96a538 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -825,7 +825,8 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
cname = (unsigned char *)
&nbuf[doff + prpsoffsets(i)];
- for (cp = cname; *cp && isprint(*cp); cp++)
+ for (cp = cname; cp < nbuf + size && *cp
+ && isprint(*cp); cp++)
continue;
/*
* Linux apparently appends a space at the end
--
2.14.4

@ -0,0 +1,68 @@
diff -urp file-5.33.orig/src/softmagic.c file-5.33/src/softmagic.c
--- file-5.33.orig/src/softmagic.c 2020-12-14 12:26:50.286849841 -0500
+++ file-5.33/src/softmagic.c 2020-12-14 12:35:52.679166211 -0500
@@ -1748,7 +1748,8 @@ mget(struct magic_set *ms, struct magic
}
private uint64_t
-file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags)
+file_strncmp(const char *s1, const char *s2, size_t len, size_t maxlen,
+ uint32_t flags)
{
/*
* Convert the source args to unsigned here so that (1) the
@@ -1760,7 +1761,7 @@ file_strncmp(const char *s1, const char
const unsigned char *b = (const unsigned char *)s2;
uint32_t ws = flags & (STRING_COMPACT_WHITESPACE |
STRING_COMPACT_OPTIONAL_WHITESPACE);
- const unsigned char *eb = b + (ws ? strlen(s2) : len);
+ const unsigned char *eb = b + (ws ? maxlen : len);
uint64_t v;
/*
@@ -1818,7 +1819,8 @@ file_strncmp(const char *s1, const char
}
private uint64_t
-file_strncmp16(const char *a, const char *b, size_t len, uint32_t flags)
+file_strncmp16(const char *a, const char *b, size_t len, size_t maxlen,
+ uint32_t flags)
{
/*
* XXX - The 16-bit string compare probably needs to be done
@@ -1826,7 +1828,7 @@ file_strncmp16(const char *a, const char
* At the moment, I am unsure.
*/
flags = 0;
- return file_strncmp(a, b, len, flags);
+ return file_strncmp(a, b, len, maxlen, flags);
}
private int
@@ -1954,13 +1956,15 @@ magiccheck(struct magic_set *ms, struct
case FILE_STRING:
case FILE_PSTRING:
l = 0;
- v = file_strncmp(m->value.s, p->s, (size_t)m->vallen, m->str_flags);
+ v = file_strncmp(m->value.s, p->s, (size_t)m->vallen,
+ sizeof(p->s), m->str_flags);
break;
case FILE_BESTRING16:
case FILE_LESTRING16:
l = 0;
- v = file_strncmp16(m->value.s, p->s, (size_t)m->vallen, m->str_flags);
+ v = file_strncmp16(m->value.s, p->s, (size_t)m->vallen,
+ sizeof(p->s), m->str_flags);
break;
case FILE_SEARCH: { /* search ms->search.s for the string m->value.s */
@@ -1979,7 +1983,7 @@ magiccheck(struct magic_set *ms, struct
return 0;
v = file_strncmp(m->value.s, ms->search.s + idx, slen,
- m->str_flags);
+ ms->search.s_len - idx, m->str_flags);
if (v == 0) { /* found match */
ms->search.offset += idx;
ms->search.rm_len = ms->search.s_len - idx;

@ -0,0 +1,37 @@
From fb1604080767501fde17eb601382e84f1c1ddca3 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Mon, 16 Jul 2018 12:30:41 +0000
Subject: [PATCH] remember to put a space between the version and the number,
plus more version parsing (Kamil Dudka)
Upstream-commit: 1a7f58c9f253e3b902bfb7a77afd8375b0b428b7
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/fsav | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/magic/Magdir/fsav b/magic/Magdir/fsav
index 5714798..5d72ab9 100644
--- a/magic/Magdir/fsav
+++ b/magic/Magdir/fsav
@@ -48,13 +48,15 @@
>11 string >\0 Clam AntiVirus database %-.23s
>>34 string :
>>>35 string !: \b, version
->>>>35 string x \b%-.1s
->>>>>36 string !:
+>>>>35 string x \b %-.1s
+>>>>>36 string !:
>>>>>>36 string x \b%-.1s
>>>>>>>37 string !:
>>>>>>>>37 string x \b%-.1s
>>>>>>>>>38 string !:
>>>>>>>>>>38 string x \b%-.1s
+>>>>>>>>>>>39 string !:
+>>>>>>>>>>>>39 string x \b%-.1s
>512 string \037\213 \b, gzipped
>769 string ustar\0 \b, tarred
--
2.14.4

@ -0,0 +1,31 @@
From 7bd1d499157caa391082f594d197f49f5327bd56 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Wed, 1 Aug 2018 09:59:45 +0000
Subject: [PATCH] fix leak on error, found by coverity.
Upstream-commit: e0805be4909e47dac47bab9d0caf3725da43e645
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/compress.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/compress.c b/src/compress.c
index 184011b..cb11303 100644
--- a/src/compress.c
+++ b/src/compress.c
@@ -249,8 +249,11 @@ file_zmagic(struct magic_set *ms, const struct buffer *b, const char *name)
* XXX: If file_buffer fails here, we overwrite
* the compressed text. FIXME.
*/
- if (file_buffer(ms, -1, NULL, buf, nbytes) == -1)
+ if (file_buffer(ms, -1, NULL, buf, nbytes) == -1) {
+ if (file_pop_buffer(ms, pb) != NULL)
+ abort();
goto error;
+ }
if ((rbuf = file_pop_buffer(ms, pb)) != NULL) {
if (file_printf(ms, "%s", rbuf) == -1) {
free(rbuf);
--
2.17.2

@ -0,0 +1,42 @@
diff --git a/src/compress.c b/src/compress.c
index cb11303..5677412 100644
--- a/src/compress.c
+++ b/src/compress.c
@@ -723,25 +723,24 @@ uncompressbuf(int fd, size_t bytes_max, size_t method, const unsigned char *old,
rv = OKDATA;
if ((r = sread(fdp[STDOUT_FILENO][0], *newch, bytes_max, 0)) > 0)
break;
- DPRINTF("Read stdout failed %d (%s)\n", fdp[STDOUT_FILENO][0],
- r != -1 ? strerror(errno) : "no data");
-
- rv = ERRDATA;
- if (r == 0 &&
- (r = sread(fdp[STDERR_FILENO][0], *newch, bytes_max, 0)) > 0)
- {
+ if (r < 0) {
+ rv = ERRDATA;
+ DPRINTF("Read stdout failed %d (%s)\n", fdp[STDOUT_FILENO][0],
+ strerror(errno));
+ goto err;
+ } else if ((r = sread(fdp[STDERR_FILENO][0], *newch, bytes_max, 0)) > 0){
+ rv = ERRDATA;
r = filter_error(*newch, r);
break;
}
- free(*newch);
if (r == 0)
- rv = makeerror(newch, n, "Read failed, %s",
- strerror(errno));
- else
- rv = makeerror(newch, n, "No data");
+ break;
+ free(*newch);
+ rv = ERRDATA;
+ rv = makeerror(newch, n, "Read stderr failed, %s",
+ strerror(errno));
goto err;
}
-
*n = r;
/* NUL terminate, as every buffer is handled here. */
(*newch)[*n] = '\0';

@ -0,0 +1,77 @@
diff --git a/src/Makefile.am b/src/Makefile.am
index a9b245d..c7f184d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -17,10 +17,10 @@ MINGWLIBS = -lgnurx -lshlwapi
else
MINGWLIBS =
endif
-libmagic_la_LIBADD = $(LTLIBOBJS) $(MINGWLIBS)
+libmagic_la_LIBADD = -lm $(LTLIBOBJS) $(MINGWLIBS)
file_SOURCES = file.c seccomp.c
-file_LDADD = libmagic.la
+file_LDADD = libmagic.la -lm
CLEANFILES = magic.h
EXTRA_DIST = magic.h.in
HDR= $(top_srcdir)/src/magic.h.in
diff --git a/src/softmagic.c b/src/softmagic.c
index 3e76517..57b4677 100644
--- a/src/softmagic.c
+++ b/src/softmagic.c
@@ -37,6 +37,7 @@ FILE_RCSID("@(#)$File: softmagic.c,v 1.259 2018/03/11 01:23:52 christos Exp $")
#include "magic.h"
#include <assert.h>
+#include <math.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
@@ -1893,19 +1894,19 @@ magiccheck(struct magic_set *ms, struct magic *m)
break;
case '!':
- matched = fv != fl;
+ matched = isunordered(fl, fv) ? 1 : fv != fl;
break;
case '=':
- matched = fv == fl;
+ matched = isunordered(fl, fv) ? 0 : fv == fl;
break;
case '>':
- matched = fv > fl;
+ matched = isgreater(fv, fl);
break;
case '<':
- matched = fv < fl;
+ matched = isless(fv, fl);
break;
default:
@@ -1926,19 +1927,19 @@ magiccheck(struct magic_set *ms, struct magic *m)
break;
case '!':
- matched = dv != dl;
+ matched = isunordered(dv, dl) ? 1 : dv != dl;
break;
case '=':
- matched = dv == dl;
+ matched = isunordered(dv, dl) ? 0 : dv == dl;
break;
case '>':
- matched = dv > dl;
+ matched = isgreater(dv, dl);
break;
case '<':
- matched = dv < dl;
+ matched = isless(dv, dl);
break;
default:

@ -0,0 +1,30 @@
From f0e846528e1c839ab44895a1f13d167a4ad8def3 Mon Sep 17 00:00:00 2001
From: Marek Cermak <macermak@redhat.com>
Date: Wed, 20 Dec 2017 16:18:46 +0100
Subject: [PATCH] Resolves: #1515180 - image/gif classifed as
application/octet-stream
https://bugzilla.redhat.com/show_bug.cgi?id=1515180
Signed-off-by: Marek Cermak <macermak@redhat.com>
---
magic/Magdir/images | 2 ++
1 file changed, 2 insertions(+)
diff --git a/magic/Magdir/images b/magic/Magdir/images
index 69e8e90f..76f7e7da 100644
--- a/magic/Magdir/images
+++ b/magic/Magdir/images
@@ -468,7 +468,9 @@
!:mime image/x-unknown
# GIF
+# Strength set up to beat 0x55AA DOS/MBR signature word lookups (+65)
0 string GIF8 GIF image data
+!:strength +80
!:mime image/gif
!:apple 8BIMGIFf
>4 string 7a \b, version 8%s,
--
2.13.6

@ -0,0 +1,22 @@
diff -urp file-5.33.orig/magic/Magdir/python file-5.33/magic/Magdir/python
--- file-5.33.orig/magic/Magdir/python 2020-12-17 13:19:08.610803723 -0500
+++ file-5.33/magic/Magdir/python 2020-12-17 13:26:07.346954161 -0500
@@ -43,6 +43,18 @@
!:strength + 15
!:mime text/x-python
+0 search/1/wt #!\ /usr/libexec/platform-python Python script text executable
+!:strength + 15
+!:mime text/x-python
+
+0 search/1/wt #!\ /usr/bin/python2 Python script text executable
+!:strength + 15
+!:mime text/x-python
+
+0 search/1/wt #!\ /usr/bin/python3 Python script text executable
+!:strength + 15
+!:mime text/x-python
+
# from module.submodule import func1, func2
0 regex \^from[\040\t\f\r\n]+([A-Za-z0-9_]|\\.)+[\040\t\f\r\n]+import.*$ Python script text executable

@ -0,0 +1,24 @@
diff --git a/magic/Magdir/msooxml b/magic/Magdir/msooxml
index bde098e..7d0bcc7 100644
--- a/magic/Magdir/msooxml
+++ b/magic/Magdir/msooxml
@@ -28,16 +28,16 @@
# skip to the second local file header
# since some documents include a 520-byte extra field following the file
# header, we need to scan for the next header
->>(18.l+49) search/2000 PK\003\004
+>>(18.l+49) search/6000 PK\003\004
# now skip to the *third* local file header; again, we need to scan due to a
# 520-byte extra field following the file header
->>>&26 search/1000 PK\003\004
+>>>&26 search/6000 PK\003\004
# and check the subdirectory name to determine which type of OOXML
# file we have. Correct the mimetype with the registered ones:
# http://technet.microsoft.com/en-us/library/cc179224.aspx
>>>>&26 use msooxml
>>>>&26 default x
# OpenOffice/Libreoffice orders ZIP entry differently, so check the 4th file
->>>>>&26 search/1000 PK\003\004
+>>>>>&26 search/6000 PK\003\004
>>>>>>&26 use msooxml
>>>>>>&26 default x Microsoft OOXML

@ -0,0 +1,35 @@
diff -urp file-5.33.orig/magic/Magdir/commands file-5.33/magic/Magdir/commands
--- file-5.33.orig/magic/Magdir/commands 2017-08-14 03:40:38.000000000 -0400
+++ file-5.33/magic/Magdir/commands 2020-12-17 13:30:07.063162185 -0500
@@ -8,6 +8,8 @@
!:mime text/x-shellscript
0 string/wb #!\ /bin/sh POSIX shell script executable (binary data)
!:mime text/x-shellscript
+0 string/w #!\ /usr/bin/sh Shell script text executable
+!:mime text/x-shellscript
0 string/wt #!\ /bin/csh C shell script text executable
!:mime text/x-shellscript
diff -urp file-5.33.orig/magic/Magdir/javascript file-5.33/magic/Magdir/javascript
--- file-5.33.orig/magic/Magdir/javascript 2012-06-16 09:30:36.000000000 -0400
+++ file-5.33/magic/Magdir/javascript 2020-12-17 13:36:56.276843745 -0500
@@ -15,3 +15,5 @@
!:mime application/javascript
0 search/1 #!/usr/bin/env\ nodejs Node.js script text executable
!:mime application/javascript
+0 string/wt #!\ /usr/bin/gjs Gnome Javascript text executable
+!:mime text/javascript
diff -urp file-5.33.orig/magic/Magdir/tcl file-5.33/magic/Magdir/tcl
--- file-5.33.orig/magic/Magdir/tcl 2014-01-08 17:29:21.000000000 -0500
+++ file-5.33/magic/Magdir/tcl 2020-12-17 13:36:20.855391803 -0500
@@ -12,6 +12,10 @@
!:mime text/x-tcl
0 search/1 #!\ /usr/bin/env\ tcl Tcl script text executable
!:mime text/x-tcl
+0 string/wt #!\ /usr/bin/jimsh Jim TCL text executable
+!:mime text/x-tcl
+0 search/1/wt #!\ /usr/bin/tclsh Tcl/Tk script text executable
+!:mime text/x-tcl
0 search/1/w #!\ /usr/bin/wish Tcl/Tk script text executable
!:mime text/x-tcl
0 search/1/w #!\ /usr/local/bin/wish Tcl/Tk script text executable

@ -0,0 +1,34 @@
From 719116b196fd873f5a463dfdb0fd6258cee51591 Mon Sep 17 00:00:00 2001
From: Kamil Dudka <kdudka@redhat.com>
Date: Tue, 22 May 2018 18:18:06 +0200
Subject: [PATCH] Revert "add a conditional in description"
Upstream-commit: 6876ebadcdf27224b3ffa9dfa4343127aa97c9b2
... and partially revert upstream commit
7dbecfe406a6bb2de1fe7ec2fe413dcd8871ac74
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/elf | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/magic/Magdir/elf b/magic/Magdir/elf
index 7fd5de1..dba5a73 100644
--- a/magic/Magdir/elf
+++ b/magic/Magdir/elf
@@ -48,9 +48,8 @@
!:mime application/x-object
>16 leshort 2 executable,
!:mime application/x-executable
->16 leshort 3 ${x?pie executable:shared object}
-
-!:mime application/x-${x?pie-executable:sharedlib}
+>16 leshort 3 shared object,
+!:mime application/x-sharedlib
>16 leshort 4 core file
!:mime application/x-coredump
# Core file detection is not reliable.
--
2.14.3

@ -0,0 +1,35 @@
From ed6062995ae60d6772f2dabc39e03cbf28ee7343 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Mon, 16 Jul 2018 12:32:08 +0000
Subject: [PATCH] more info for ppc swapspace (Kamil Dudka)
Upstream-commit: 65f9c7053548df8945df600c07123c9151531ee6
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/linux | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/magic/Magdir/linux b/magic/Magdir/linux
index 0630a8a..11e9237 100644
--- a/magic/Magdir/linux
+++ b/magic/Magdir/linux
@@ -94,6 +94,16 @@
# From Daniel Novotny <dnovotny@redhat.com>
# swap file for PowerPC
65526 string SWAPSPACE2 Linux/ppc swap file
+>0x400 long x version %d,
+>0x404 long x size %d pages,
+>1052 string \0 no label,
+>1052 string >\0 LABEL=%s,
+>0x40c belong x UUID=%08x
+>0x410 beshort x \b-%04x
+>0x412 beshort x \b-%04x
+>0x414 beshort x \b-%04x
+>0x416 belong x \b-%08x
+>0x41a beshort x \b%04x
16374 string SWAPSPACE2 Linux/ia64 swap file
#
# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>
--
2.14.4

@ -0,0 +1,23 @@
diff -urp file-5.33.orig/magic/Magdir/python file-5.33/magic/Magdir/python
--- file-5.33.orig/magic/Magdir/python 2017-08-14 03:40:38.000000000 -0400
+++ file-5.33/magic/Magdir/python 2020-12-14 12:24:42.084905613 -0500
@@ -30,16 +30,16 @@
0 belong 0x3e0d0d0a python 3.7 byte-compiled
-0 search/1/w #!\ /usr/bin/python Python script text executable
+0 search/1/w #!\040/usr/bin/python Python script text executable
!:strength + 15
!:mime text/x-python
-0 search/1/w #!\ /usr/local/bin/python Python script text executable
+0 search/1/w #!\040/usr/local/bin/python Python script text executable
!:strength + 15
!:mime text/x-python
0 search/1 #!/usr/bin/env\ python Python script text executable
!:strength + 15
!:mime text/x-python
-0 search/10 #!\ /usr/bin/env\ python Python script text executable
+0 search/10 #!\040/usr/bin/env\ python Python script text executable
!:strength + 15
!:mime text/x-python

@ -0,0 +1,53 @@
From 4ae8a24b5ccbee904875a10b7b2301369080a88d Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Sun, 6 May 2018 16:36:41 +0000
Subject: [PATCH] add more syscalls; newfstatat is used for stat'ing the magic
file, getdents64 is used for getting the magic entries during compilation.
Upstream-commit: aeddbff330fad0edff2ab4b02dbf0863cd593c3c
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/seccomp.c | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/seccomp.c b/src/seccomp.c
index 7c8a3144..481a5624 100644
--- a/src/seccomp.c
+++ b/src/seccomp.c
@@ -59,12 +59,7 @@ enable_sandbox_basic(void)
if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) == -1)
return -1;
-#if 0
- // prevent escape via ptrace
- prctl(PR_SET_DUMPABLE, 0);
-#endif
-
- if (prctl (PR_SET_DUMPABLE, 0, 0, 0, 0) == -1)
+ if (prctl(PR_SET_DUMPABLE, 0, 0, 0, 0) == -1)
return -1;
// initialize the filter
@@ -171,6 +166,9 @@ enable_sandbox_full(void)
ALLOW_RULE(fcntl);
ALLOW_RULE(fstat);
ALLOW_RULE(getdents);
+#ifdef __NR_getdents64
+ ALLOW_RULE(getdents64);
+#endif
ALLOW_RULE(ioctl);
ALLOW_RULE(lseek);
ALLOW_RULE(lstat);
@@ -178,6 +176,9 @@ enable_sandbox_full(void)
ALLOW_RULE(mprotect);
ALLOW_RULE(mremap);
ALLOW_RULE(munmap);
+#ifdef __NR_newfstatat
+ ALLOW_RULE(newfstatat);
+#endif
ALLOW_RULE(open);
ALLOW_RULE(openat);
ALLOW_RULE(pread64);
--
2.17.0

@ -0,0 +1,236 @@
From 3951ed6ab1ba4b7d6d4d2dd5700858c470627c46 Mon Sep 17 00:00:00 2001
From: Vincent Mihalkovic <vmihalko@redhat.com>
Date: Thu, 9 Feb 2023 16:46:43 +0100
Subject: [PATCH] store copy of the mode info in the magic_set
---
src/file.h | 1 +
src/funcs.c | 53 +++++++++++++++++++++++++++++++------------------
src/softmagic.c | 27 +++++++++++--------------
3 files changed, 47 insertions(+), 34 deletions(-)
diff --git a/src/file.h b/src/file.h
index 66598bc..b3d015d 100644
--- a/src/file.h
+++ b/src/file.h
@@ -413,6 +413,7 @@ struct magic_set {
#define EVENT_HAD_ERR 0x01
const char *file;
size_t line; /* current magic line number */
+ mode_t mode; /* copy of current stat mode */
/* data for searches */
struct {
diff --git a/src/funcs.c b/src/funcs.c
index f59f4a1..0bf92fe 100644
--- a/src/funcs.c
+++ b/src/funcs.c
@@ -27,7 +27,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: funcs.c,v 1.94 2017/11/02 20:25:39 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.95 2018/05/24 18:09:17 christos Exp $")
#endif /* lint */
#include "magic.h"
@@ -183,9 +183,11 @@ file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((__u
const char *type = "application/octet-stream";
const char *def = "data";
const char *ftype = NULL;
+ char *rbuf = NULL;
struct buffer b;
buffer_init(&b, fd, buf, nb);
+ ms->mode = b.st.st_mode;
if (nb == 0) {
def = "empty";
@@ -248,31 +250,43 @@ file_buffer(struct magic_set *ms, int fd, const char *inname __attribute__ ((__u
goto done;
}
}
+#ifdef BUILTIN_ELF
+ if ((ms->flags & MAGIC_NO_CHECK_ELF) == 0 && nb > 5 && fd != -1) {
+ file_pushbuf_t *pb;
+ /*
+ * We matched something in the file, so this
+ * *might* be an ELF file, and the file is at
+ * least 5 bytes long, so if it's an ELF file
+ * it has at least one byte past the ELF magic
+ * number - try extracting information from the
+ * ELF headers that cannot easily be extracted
+ * with rules in the magic file. We we don't
+ * print the information yet.
+ */
+ if ((pb = file_push_buffer(ms)) == NULL)
+ return -1;
+
+ rv = file_tryelf(ms, &b);
+ rbuf = file_pop_buffer(ms, pb);
+ if (rv != 1) {
+ free(rbuf);
+ rbuf = NULL;
+ }
+ if ((ms->flags & MAGIC_DEBUG) != 0)
+ (void)fprintf(stderr, "[try elf %d]\n", m);
+ }
+#endif
/* try soft magic tests */
if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0) {
m = file_softmagic(ms, &b, NULL, NULL, BINTEST, looks_text);
if ((ms->flags & MAGIC_DEBUG) != 0)
(void)fprintf(stderr, "[try softmagic %d]\n", m);
+ if (m == 1 && rbuf) {
+ if (file_printf(ms, "%s", rbuf) == -1)
+ goto done;
+ }
if (m) {
-#ifdef BUILTIN_ELF
- if ((ms->flags & MAGIC_NO_CHECK_ELF) == 0 && m == 1 &&
- nb > 5 && fd != -1) {
- /*
- * We matched something in the file, so this
- * *might* be an ELF file, and the file is at
- * least 5 bytes long, so if it's an ELF file
- * it has at least one byte past the ELF magic
- * number - try extracting information from the
- * ELF headers that cannot easily * be
- * extracted with rules in the magic file.
- */
- m = file_tryelf(ms, &b);
- if ((ms->flags & MAGIC_DEBUG) != 0)
- (void)fprintf(stderr, "[try elf %d]\n",
- m);
- }
-#endif
if (checkdone(ms, &rv))
goto done;
}
@@ -318,6 +332,7 @@ simple:
#if HAVE_FORK
done_encoding:
#endif
+ free(rbuf);
buffer_fini(&b);
if (rv)
return rv;
diff --git a/src/softmagic.c b/src/softmagic.c
index 57b4677..0197ec4 100644
--- a/src/softmagic.c
+++ b/src/softmagic.c
@@ -54,8 +54,7 @@ private int mget(struct magic_set *, struct magic *, const struct buffer *,
private int msetoffset(struct magic_set *, struct magic *, struct buffer *,
const struct buffer *, size_t, unsigned int);
private int magiccheck(struct magic_set *, struct magic *);
-private int32_t mprint(struct magic_set *, struct magic *,
- const struct buffer *);
+private int32_t mprint(struct magic_set *, struct magic *);
private int moffset(struct magic_set *, struct magic *, const struct buffer *,
int32_t *);
private void mdebug(uint32_t, const char *, size_t);
@@ -63,8 +62,7 @@ private int mcopy(struct magic_set *, union VALUETYPE *, int, int,
const unsigned char *, uint32_t, size_t, struct magic *);
private int mconvert(struct magic_set *, struct magic *, int);
private int print_sep(struct magic_set *, int);
-private int handle_annotation(struct magic_set *, struct magic *,
- const struct buffer *, int);
+private int handle_annotation(struct magic_set *, struct magic *, int);
private int cvt_8(union VALUETYPE *, const struct magic *);
private int cvt_16(union VALUETYPE *, const struct magic *);
private int cvt_32(union VALUETYPE *, const struct magic *);
@@ -241,7 +239,7 @@ flush:
goto flush;
}
- if ((e = handle_annotation(ms, m, b, firstline)) != 0) {
+ if ((e = handle_annotation(ms, m, firstline)) != 0) {
*need_separator = 1;
*printed_something = 1;
*returnval = 1;
@@ -259,7 +257,7 @@ flush:
return -1;
}
- if (print && mprint(ms, m, b) == -1)
+ if (print && mprint(ms, m) == -1)
return -1;
switch (moffset(ms, m, &bb, &ms->c.li[cont_level].off)) {
@@ -340,7 +338,7 @@ flush:
} else
ms->c.li[cont_level].got_match = 1;
- if ((e = handle_annotation(ms, m, b, firstline))
+ if ((e = handle_annotation(ms, m, firstline))
!= 0) {
*need_separator = 1;
*printed_something = 1;
@@ -374,7 +372,7 @@ flush:
return -1;
*need_separator = 0;
}
- if (print && mprint(ms, m, b) == -1)
+ if (print && mprint(ms, m) == -1)
return -1;
switch (moffset(ms, m, &bb,
@@ -454,7 +452,7 @@ strndup(const char *str, size_t n)
#endif /* HAVE_STRNDUP */
static int
-varexpand(char *buf, size_t len, const struct buffer *b, const char *str)
+varexpand(struct magic_set *ms, char *buf, size_t len, const char *str)
{
const char *ptr, *sptr, *e, *t, *ee, *et;
size_t l;
@@ -479,7 +477,7 @@ varexpand(char *buf, size_t len, const struct buffer *b, const char *str)
return -1;
switch (*ptr) {
case 'x':
- if (b->st.st_mode & 0111) {
+ if (ms->mode & 0111) {
ptr = t;
l = et - t;
} else {
@@ -509,7 +507,7 @@ varexpand(char *buf, size_t len, const struct buffer *b, const char *str)
private int32_t
-mprint(struct magic_set *ms, struct magic *m, const struct buffer *b)
+mprint(struct magic_set *ms, struct magic *m)
{
uint64_t v;
float vf;
@@ -519,7 +517,7 @@ mprint(struct magic_set *ms, struct magic *m, const struct buffer *b)
const char *desc;
union VALUETYPE *p = &ms->ms_value;
- if (varexpand(ebuf, sizeof(ebuf), b, m->desc) == -1)
+ if (varexpand(ms, ebuf, sizeof(ebuf), m->desc) == -1)
desc = m->desc;
else
desc = ebuf;
@@ -2166,8 +2164,7 @@ magiccheck(struct magic_set *ms, struct magic *m)
}
private int
-handle_annotation(struct magic_set *ms, struct magic *m, const struct buffer *b,
- int firstline)
+handle_annotation(struct magic_set *ms, struct magic *m, int firstline)
{
if ((ms->flags & MAGIC_APPLE) && m->apple[0]) {
if (!firstline && file_printf(ms, "\n- ") == -1)
@@ -2188,7 +2185,7 @@ handle_annotation(struct magic_set *ms, struct magic *m, const struct buffer *b,
const char *p;
if (!firstline && file_printf(ms, "\n- ") == -1)
return -1;
- if (varexpand(buf, sizeof(buf), b, m->mimetype) == -1)
+ if (varexpand(ms, buf, sizeof(buf), m->mimetype) == -1)
p = m->mimetype;
else
p = buf;
--
2.39.1

@ -0,0 +1,767 @@
From 493e2676626b530a45fcc17040915f34fa0c5dd3 Mon Sep 17 00:00:00 2001
From: Vincent Mihalkovic <vmihalko@redhat.com>
Date: Mon, 6 Feb 2023 14:39:29 +0100
Subject: [PATCH] add parsing for dynamic sections
9109a696f3289ba00eaa222fd432755ec4287e28
---
src/readelf.c | 295 +++++++++++++++++++++++++++++++-------------------
src/readelf.h | 103 ++++++++++++++++++
2 files changed, 289 insertions(+), 109 deletions(-)
diff --git a/src/readelf.c b/src/readelf.c
index c101483..cdc211f 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -62,13 +62,12 @@ private uint64_t getu64(int, uint64_t);
#define MAX_PHNUM 128
#define MAX_SHNUM 32768
-#define SIZE_UNKNOWN ((off_t)-1)
+#define SIZE_UNKNOWN CAST(off_t, -1)
private int
toomany(struct magic_set *ms, const char *name, uint16_t num)
{
- if (file_printf(ms, ", too many %s (%u)", name, num
- ) == -1)
+ if (file_printf(ms, ", too many %s (%u)", name, num) == -1)
return -1;
return 0;
}
@@ -143,54 +142,55 @@ getu64(int swap, uint64_t value)
#define elf_getu64(swap, value) getu64(swap, value)
#define xsh_addr (clazz == ELFCLASS32 \
- ? (void *)&sh32 \
- : (void *)&sh64)
+ ? CAST(void *, &sh32) \
+ : CAST(void *, &sh64))
#define xsh_sizeof (clazz == ELFCLASS32 \
? sizeof(sh32) \
: sizeof(sh64))
-#define xsh_size (size_t)(clazz == ELFCLASS32 \
+#define xsh_size CAST(size_t, (clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_size) \
- : elf_getu64(swap, sh64.sh_size))
-#define xsh_offset (off_t)(clazz == ELFCLASS32 \
+ : elf_getu64(swap, sh64.sh_size)))
+#define xsh_offset CAST(off_t, (clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_offset) \
- : elf_getu64(swap, sh64.sh_offset))
+ : elf_getu64(swap, sh64.sh_offset)))
#define xsh_type (clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_type) \
: elf_getu32(swap, sh64.sh_type))
#define xsh_name (clazz == ELFCLASS32 \
? elf_getu32(swap, sh32.sh_name) \
: elf_getu32(swap, sh64.sh_name))
+
#define xph_addr (clazz == ELFCLASS32 \
- ? (void *) &ph32 \
- : (void *) &ph64)
+ ? CAST(void *, &ph32) \
+ : CAST(void *, &ph64))
#define xph_sizeof (clazz == ELFCLASS32 \
? sizeof(ph32) \
: sizeof(ph64))
#define xph_type (clazz == ELFCLASS32 \
? elf_getu32(swap, ph32.p_type) \
: elf_getu32(swap, ph64.p_type))
-#define xph_offset (off_t)(clazz == ELFCLASS32 \
+#define xph_offset CAST(off_t, (clazz == ELFCLASS32 \
? elf_getu32(swap, ph32.p_offset) \
- : elf_getu64(swap, ph64.p_offset))
-#define xph_align (size_t)((clazz == ELFCLASS32 \
- ? (off_t) (ph32.p_align ? \
- elf_getu32(swap, ph32.p_align) : 4) \
- : (off_t) (ph64.p_align ? \
- elf_getu64(swap, ph64.p_align) : 4)))
-#define xph_vaddr (size_t)((clazz == ELFCLASS32 \
- ? (off_t) (ph32.p_vaddr ? \
- elf_getu32(swap, ph32.p_vaddr) : 4) \
- : (off_t) (ph64.p_vaddr ? \
- elf_getu64(swap, ph64.p_vaddr) : 4)))
-#define xph_filesz (size_t)((clazz == ELFCLASS32 \
+ : elf_getu64(swap, ph64.p_offset)))
+#define xph_align CAST(size_t, (clazz == ELFCLASS32 \
+ ? CAST(off_t, (ph32.p_align ? \
+ elf_getu32(swap, ph32.p_align) : 4))\
+ : CAST(off_t, (ph64.p_align ? \
+ elf_getu64(swap, ph64.p_align) : 4))))
+#define xph_vaddr CAST(size_t, (clazz == ELFCLASS32 \
+ ? CAST(off_t, (ph32.p_vaddr ? \
+ elf_getu32(swap, ph32.p_vaddr) : 4))\
+ : CAST(off_t, (ph64.p_vaddr ? \
+ elf_getu64(swap, ph64.p_vaddr) : 4))))
+#define xph_filesz CAST(size_t, (clazz == ELFCLASS32 \
? elf_getu32(swap, ph32.p_filesz) \
: elf_getu64(swap, ph64.p_filesz)))
-#define xnh_addr (clazz == ELFCLASS32 \
- ? (void *)&nh32 \
- : (void *)&nh64)
-#define xph_memsz (size_t)((clazz == ELFCLASS32 \
+#define xph_memsz CAST(size_t, ((clazz == ELFCLASS32 \
? elf_getu32(swap, ph32.p_memsz) \
- : elf_getu64(swap, ph64.p_memsz)))
+ : elf_getu64(swap, ph64.p_memsz))))
+#define xnh_addr (clazz == ELFCLASS32 \
+ ? CAST(void *, &nh32) \
+ : CAST(void *, &nh64))
#define xnh_sizeof (clazz == ELFCLASS32 \
? sizeof(nh32) \
: sizeof(nh64))
@@ -203,24 +203,36 @@ getu64(int swap, uint64_t value)
#define xnh_descsz (clazz == ELFCLASS32 \
? elf_getu32(swap, nh32.n_descsz) \
: elf_getu32(swap, nh64.n_descsz))
-#define prpsoffsets(i) (clazz == ELFCLASS32 \
- ? prpsoffsets32[i] \
- : prpsoffsets64[i])
+
+#define xdh_addr (clazz == ELFCLASS32 \
+ ? CAST(void *, &dh32) \
+ : CAST(void *, &dh64))
+#define xdh_sizeof (clazz == ELFCLASS32 \
+ ? sizeof(dh32) \
+ : sizeof(dh64))
+#define xdh_tag (clazz == ELFCLASS32 \
+ ? elf_getu32(swap, dh32.d_tag) \
+ : elf_getu64(swap, dh64.d_tag))
+#define xdh_val (clazz == ELFCLASS32 \
+ ? elf_getu32(swap, dh32.d_un.d_val) \
+ : elf_getu64(swap, dh64.d_un.d_val))
+
#define xcap_addr (clazz == ELFCLASS32 \
- ? (void *)&cap32 \
- : (void *)&cap64)
+ ? CAST(void *, &cap32) \
+ : CAST(void *, &cap64))
#define xcap_sizeof (clazz == ELFCLASS32 \
- ? sizeof cap32 \
- : sizeof cap64)
+ ? sizeof(cap32) \
+ : sizeof(cap64))
#define xcap_tag (clazz == ELFCLASS32 \
? elf_getu32(swap, cap32.c_tag) \
: elf_getu64(swap, cap64.c_tag))
#define xcap_val (clazz == ELFCLASS32 \
? elf_getu32(swap, cap32.c_un.c_val) \
: elf_getu64(swap, cap64.c_un.c_val))
+
#define xauxv_addr (clazz == ELFCLASS32 \
- ? (void *)&auxv32 \
- : (void *)&auxv64)
+ ? CAST(void *, &auxv32) \
+ : CAST(void *, &auxv64))
#define xauxv_sizeof (clazz == ELFCLASS32 \
? sizeof(auxv32) \
: sizeof(auxv64))
@@ -231,6 +243,10 @@ getu64(int swap, uint64_t value)
? elf_getu32(swap, auxv32.a_v) \
: elf_getu64(swap, auxv64.a_v))
+#define prpsoffsets(i) (clazz == ELFCLASS32 \
+ ? prpsoffsets32[i] \
+ : prpsoffsets64[i])
+
#ifdef ELFCORE
/*
* Try larger offsets first to avoid false matches
@@ -269,8 +285,8 @@ static const size_t prpsoffsets64[] = {
16, /* FreeBSD, 64-bit */
};
-#define NOFFSETS32 (sizeof prpsoffsets32 / sizeof prpsoffsets32[0])
-#define NOFFSETS64 (sizeof prpsoffsets64 / sizeof prpsoffsets64[0])
+#define NOFFSETS32 (sizeof(prpsoffsets32) / sizeof(prpsoffsets32[0]))
+#define NOFFSETS64 (sizeof(prpsoffsets64) / sizeof(prpsoffsets64[0]))
#define NOFFSETS (clazz == ELFCLASS32 ? NOFFSETS32 : NOFFSETS64)
@@ -349,7 +365,8 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
* Loop through all the program headers.
*/
for ( ; num; num--) {
- if (pread(fd, xph_addr, xph_sizeof, off) < (ssize_t)xph_sizeof) {
+ if (pread(fd, xph_addr, xph_sizeof, off) <
+ CAST(ssize_t, xph_sizeof)) {
file_badread(ms);
return -1;
}
@@ -392,7 +409,7 @@ static void
do_note_netbsd_version(struct magic_set *ms, int swap, void *v)
{
uint32_t desc;
- (void)memcpy(&desc, v, sizeof(desc));
+ memcpy(&desc, v, sizeof(desc));
desc = elf_getu32(swap, desc);
if (file_printf(ms, ", for NetBSD") == -1)
@@ -438,7 +455,7 @@ do_note_freebsd_version(struct magic_set *ms, int swap, void *v)
{
uint32_t desc;
- (void)memcpy(&desc, v, sizeof(desc));
+ memcpy(&desc, v, sizeof(desc));
desc = elf_getu32(swap, desc);
if (file_printf(ms, ", for FreeBSD") == -1)
return;
@@ -536,7 +553,7 @@ do_bid_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
}
if (file_printf(ms, ", BuildID[%s]=", btype) == -1)
return 1;
- (void)memcpy(desc, &nbuf[doff], descsz);
+ memcpy(desc, &nbuf[doff], descsz);
for (i = 0; i < descsz; i++)
if (file_printf(ms, "%02x", desc[i]) == -1)
return 1;
@@ -560,7 +577,7 @@ do_os_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
type == NT_GNU_VERSION && descsz == 16) {
uint32_t desc[4];
- (void)memcpy(desc, &nbuf[doff], sizeof(desc));
+ memcpy(desc, &nbuf[doff], sizeof(desc));
*flags |= FLAGS_DID_OS_NOTE;
if (file_printf(ms, ", for GNU/") == -1)
@@ -627,7 +644,7 @@ do_os_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
*flags |= FLAGS_DID_OS_NOTE;
if (file_printf(ms, ", for DragonFly") == -1)
return 1;
- (void)memcpy(&desc, &nbuf[doff], sizeof(desc));
+ memcpy(&desc, &nbuf[doff], sizeof(desc));
desc = elf_getu32(swap, desc);
if (file_printf(ms, " %d.%d.%d", desc / 100000,
desc / 10000 % 10, desc % 10000) == -1)
@@ -657,7 +674,7 @@ do_pax_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
int did = 0;
*flags |= FLAGS_DID_NETBSD_PAX;
- (void)memcpy(&desc, &nbuf[doff], sizeof(desc));
+ memcpy(&desc, &nbuf[doff], sizeof(desc));
desc = elf_getu32(swap, desc);
if (desc && file_printf(ms, ", PaX: ") == -1)
@@ -957,7 +974,7 @@ do_auxv_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
nval = 0;
for (size_t off = 0; off + elsize <= descsz; off += elsize) {
- (void)memcpy(xauxv_addr, &nbuf[doff + off], xauxv_sizeof);
+ memcpy(xauxv_addr, &nbuf[doff + off], xauxv_sizeof);
/* Limit processing to 50 vector entries to prevent DoS */
if (nval++ >= 50) {
file_error(ms, 0, "Too many ELF Auxv elements");
@@ -1021,6 +1038,38 @@ do_auxv_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
#endif
}
+private size_t
+dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
+ int clazz, int swap)
+{
+ Elf32_Dyn dh32;
+ Elf64_Dyn dh64;
+ unsigned char *dbuf = CAST(unsigned char *, vbuf);
+
+ if (xdh_sizeof + offset > size) {
+ /*
+ * We're out of note headers.
+ */
+ return xdh_sizeof + offset;
+ }
+
+ memcpy(xdh_addr, &dbuf[offset], xdh_sizeof);
+ offset += xdh_sizeof;
+
+ switch (xdh_tag) {
+ case DT_FLAGS_1:
+ if (xdh_val == DF_1_PIE)
+ ms->mode |= 0111;
+ else
+ ms->mode &= ~0111;
+ break;
+ default:
+ break;
+ }
+ return offset;
+}
+
+
private size_t
donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
int clazz, int swap, size_t align, int *flags, uint16_t *notecount,
@@ -1043,7 +1092,7 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
return xnh_sizeof + offset;
}
- (void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
+ memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
offset += xnh_sizeof;
namesz = xnh_namesz;
@@ -1057,14 +1106,14 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
}
if (namesz & 0x80000000) {
- (void)file_printf(ms, ", bad note name size %#lx",
- (unsigned long)namesz);
+ file_printf(ms, ", bad note name size %#lx",
+ CAST(unsigned long, namesz));
return 0;
}
if (descsz & 0x80000000) {
- (void)file_printf(ms, ", bad note description size %#lx",
- (unsigned long)descsz);
+ file_printf(ms, ", bad note description size %#lx",
+ CAST(unsigned long, descsz));
return 0;
}
@@ -1118,35 +1167,25 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
return offset;
}
- if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0) {
+ if (namesz == 7 && strcmp(CAST(char *, &nbuf[noff]), "NetBSD") == 0) {
+ int descw, flag;
+ const char *str, *tag;
if (descsz > 100)
descsz = 100;
switch (xnh_type) {
case NT_NETBSD_VERSION:
return offset;
case NT_NETBSD_MARCH:
- if (*flags & FLAGS_DID_NETBSD_MARCH)
- return offset;
- *flags |= FLAGS_DID_NETBSD_MARCH;
- if (file_printf(ms, ", compiled for: %.*s",
- (int)descsz, (const char *)&nbuf[doff]) == -1)
- return offset;
+ flag = FLAGS_DID_NETBSD_MARCH;
+ tag = "compiled for";
break;
case NT_NETBSD_CMODEL:
- if (*flags & FLAGS_DID_NETBSD_CMODEL)
- return offset;
- *flags |= FLAGS_DID_NETBSD_CMODEL;
- if (file_printf(ms, ", compiler model: %.*s",
- (int)descsz, (const char *)&nbuf[doff]) == -1)
- return offset;
+ flag = FLAGS_DID_NETBSD_CMODEL;
+ tag = "compiler model";
break;
case NT_NETBSD_EMULATION:
- if (*flags & FLAGS_DID_NETBSD_EMULATION)
- return offset;
- *flags |= FLAGS_DID_NETBSD_EMULATION;
- if (file_printf(ms, ", emulation: %.*s",
- (int)descsz, (const char *)&nbuf[doff]) == -1)
- return offset;
+ flag = FLAGS_DID_NETBSD_EMULATION;
+ tag = "emulation:";
break;
default:
if (*flags & FLAGS_DID_NETBSD_UNKNOWN)
@@ -1154,8 +1193,15 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
*flags |= FLAGS_DID_NETBSD_UNKNOWN;
if (file_printf(ms, ", note=%u", xnh_type) == -1)
return offset;
- break;
+ return offset;
}
+
+ if (*flags & flag)
+ return offset;
+ str = CAST(const char *, &nbuf[doff]);
+ descw = CAST(int, descsz);
+ *flags |= flag;
+ file_printf(ms, ", %s: %.*s", tag, descw, str);
return offset;
}
@@ -1236,7 +1282,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
/* Read offset of name section to be able to read section names later */
if (pread(fd, xsh_addr, xsh_sizeof, CAST(off_t, (off + size * strtab)))
- < (ssize_t)xsh_sizeof) {
+ < CAST(ssize_t, xsh_sizeof)) {
if (file_printf(ms, ", missing section headers") == -1)
return -1;
return 0;
@@ -1245,7 +1291,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
for ( ; num; num--) {
/* Read the name of this section. */
- if ((namesize = pread(fd, name, sizeof(name) - 1, name_off + xsh_name)) == -1) {
+ if ((namesize = pread(fd, name, sizeof(name) - 1,
+ name_off + xsh_name)) == -1) {
file_badread(ms);
return -1;
}
@@ -1255,7 +1302,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
stripped = 0;
}
- if (pread(fd, xsh_addr, xsh_sizeof, off) < (ssize_t)xsh_sizeof) {
+ if (pread(fd, xsh_addr, xsh_sizeof, off) <
+ CAST(ssize_t, xsh_sizeof)) {
file_badread(ms);
return -1;
}
@@ -1281,14 +1329,15 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
/* Things we can determine when we seek */
switch (xsh_type) {
case SHT_NOTE:
- if ((uintmax_t)(xsh_size + xsh_offset) >
- (uintmax_t)fsize) {
+ if (CAST(uintmax_t, (xsh_size + xsh_offset)) >
+ CAST(uintmax_t, fsize)) {
if (file_printf(ms,
", note offset/size %#" INTMAX_T_FORMAT
"x+%#" INTMAX_T_FORMAT "x exceeds"
" file size %#" INTMAX_T_FORMAT "x",
- (uintmax_t)xsh_offset, (uintmax_t)xsh_size,
- (uintmax_t)fsize) == -1)
+ CAST(uintmax_t, xsh_offset),
+ CAST(uintmax_t, xsh_size),
+ CAST(uintmax_t, fsize)) == -1)
return -1;
return 0;
}
@@ -1298,7 +1347,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
return -1;
}
if (pread(fd, nbuf, xsh_size, xsh_offset) <
- (ssize_t)xsh_size) {
+ CAST(ssize_t, xsh_size)) {
file_badread(ms);
free(nbuf);
return -1;
@@ -1306,9 +1355,9 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
noff = 0;
for (;;) {
- if (noff >= (off_t)xsh_size)
+ if (noff >= CAST(off_t, xsh_size))
break;
- noff = donote(ms, nbuf, (size_t)noff,
+ noff = donote(ms, nbuf, CAST(size_t, noff),
xsh_size, clazz, swap, 4, flags, notecount,
fd, 0, 0, 0);
if (noff == 0)
@@ -1330,7 +1379,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
if (nbadcap > 5)
break;
- if (lseek(fd, xsh_offset, SEEK_SET) == (off_t)-1) {
+ if (lseek(fd, xsh_offset, SEEK_SET)
+ == CAST(off_t, -1)) {
file_badseek(ms);
return -1;
}
@@ -1339,11 +1389,12 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
Elf32_Cap cap32;
Elf64_Cap cap64;
char cbuf[/*CONSTCOND*/
- MAX(sizeof cap32, sizeof cap64)];
- if ((coff += xcap_sizeof) > (off_t)xsh_size)
+ MAX(sizeof(cap32), sizeof(cap64))];
+ if ((coff += xcap_sizeof) >
+ CAST(off_t, xsh_size))
break;
- if (read(fd, cbuf, (size_t)xcap_sizeof) !=
- (ssize_t)xcap_sizeof) {
+ if (read(fd, cbuf, CAST(size_t, xcap_sizeof)) !=
+ CAST(ssize_t, xcap_sizeof)) {
file_badread(ms);
return -1;
}
@@ -1377,7 +1428,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
#endif
break;
}
- (void)memcpy(xcap_addr, cbuf, xcap_sizeof);
+ memcpy(xcap_addr, cbuf, xcap_sizeof);
switch (xcap_tag) {
case CA_SUNW_NULL:
break;
@@ -1392,8 +1443,9 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
", with unknown capability "
"%#" INT64_T_FORMAT "x = %#"
INT64_T_FORMAT "x",
- (unsigned long long)xcap_tag,
- (unsigned long long)xcap_val) == -1)
+ CAST(unsigned long long, xcap_tag),
+ CAST(unsigned long long, xcap_val))
+ == -1)
return -1;
if (nbadcap++ > 2)
coff = xsh_size;
@@ -1446,12 +1498,12 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
if (file_printf(ms,
" unknown hardware capability %#"
INT64_T_FORMAT "x",
- (unsigned long long)cap_hw1) == -1)
+ CAST(unsigned long long, cap_hw1)) == -1)
return -1;
} else {
if (file_printf(ms,
" hardware capability %#" INT64_T_FORMAT "x",
- (unsigned long long)cap_hw1) == -1)
+ CAST(unsigned long long, cap_hw1)) == -1)
return -1;
}
}
@@ -1468,7 +1520,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
if (file_printf(ms,
", with unknown software capability %#"
INT64_T_FORMAT "x",
- (unsigned long long)cap_sf1) == -1)
+ CAST(unsigned long long, cap_sf1)) == -1)
return -1;
}
return 0;
@@ -1487,9 +1539,9 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
Elf32_Phdr ph32;
Elf64_Phdr ph64;
const char *linking_style = "statically";
- const char *interp = "";
unsigned char nbuf[BUFSIZ];
char ibuf[BUFSIZ];
+ char interp[BUFSIZ];
ssize_t bufsize;
size_t offset, align, len;
@@ -1499,8 +1551,11 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
return 0;
}
+ interp[0] = '\0';
for ( ; num; num--) {
- if (pread(fd, xph_addr, xph_sizeof, off) < (ssize_t)xph_sizeof) {
+ int doread;
+ if (pread(fd, xph_addr, xph_sizeof, off) <
+ CAST(ssize_t, xph_sizeof)) {
file_badread(ms);
return -1;
}
@@ -1513,6 +1568,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
switch (xph_type) {
case PT_DYNAMIC:
linking_style = "dynamically";
+ doread = 1;
break;
case PT_NOTE:
if (sh_num) /* Did this through section headers */
@@ -1521,21 +1577,16 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
align < 4) {
if (file_printf(ms,
", invalid note alignment %#lx",
- (unsigned long)align) == -1)
+ CAST(unsigned long, align)) == -1)
return -1;
align = 4;
}
/*FALLTHROUGH*/
case PT_INTERP:
- len = xph_filesz < sizeof(nbuf) ? xph_filesz
- : sizeof(nbuf);
- bufsize = pread(fd, nbuf, len, xph_offset);
- if (bufsize == -1) {
- file_badread(ms);
- return -1;
- }
+ doread = 1;
break;
default:
+ doread = 0;
if (fsize != SIZE_UNKNOWN && xph_offset > fsize) {
/* Maybe warn here? */
continue;
@@ -1543,14 +1594,39 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
break;
}
+ if (doread) {
+ len = xph_filesz < sizeof(nbuf) ? xph_filesz
+ : sizeof(nbuf);
+ bufsize = pread(fd, nbuf, len, xph_offset);
+ if (bufsize == -1) {
+ file_badread(ms);
+ return -1;
+ }
+ } else
+ len = 0;
+
/* Things we can determine when we seek */
switch (xph_type) {
+ case PT_DYNAMIC:
+ offset = 0;
+ for (;;) {
+ if (offset >= (size_t)bufsize)
+ break;
+ offset = dodynamic(ms, nbuf, offset,
+ CAST(size_t, bufsize), clazz, swap);
+ if (offset == 0)
+ break;
+ }
+ if (ms->flags & MAGIC_MIME)
+ continue;
+ break;
+
case PT_INTERP:
if (bufsize && nbuf[0]) {
nbuf[bufsize - 1] = '\0';
- interp = (const char *)nbuf;
+ memcpy(interp, nbuf, bufsize);
} else
- interp = "*empty*";
+ strlcpy(interp, "*empty*", sizeof(interp));
break;
case PT_NOTE:
/*
@@ -1562,7 +1638,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset,
- (size_t)bufsize, clazz, swap, align,
+ CAST(size_t, bufsize), clazz, swap, align,
flags, notecount, fd, 0, 0, 0);
if (offset == 0)
break;
@@ -1591,7 +1667,7 @@ file_tryelf(struct magic_set *ms, const struct buffer *b)
size_t nbytes = b->flen;
union {
int32_t l;
- char c[sizeof (int32_t)];
+ char c[sizeof(int32_t)];
} u;
int clazz;
int swap;
@@ -1619,7 +1695,8 @@ file_tryelf(struct magic_set *ms, const struct buffer *b)
/*
* If we cannot seek, it must be a pipe, socket or fifo.
*/
- if((lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1) && (errno == ESPIPE))
+ if((lseek(fd, CAST(off_t, 0), SEEK_SET) == CAST(off_t, -1))
+ && (errno == ESPIPE))
fd = file_pipe2file(ms, fd, buf, nbytes);
if (fstat(fd, &st) == -1) {
diff --git a/src/readelf.h b/src/readelf.h
index ef880b9..f2f3dc3 100644
--- a/src/readelf.h
+++ b/src/readelf.h
@@ -430,4 +430,107 @@ typedef struct {
#define AV_386_SSE4_1 0x00800000
#define AV_386_SSE4_2 0x01000000
+/*
+ * Dynamic Section structure array
+ */
+typedef struct {
+ Elf32_Word d_tag; /* entry tag value */
+ union {
+ Elf32_Addr d_ptr;
+ Elf32_Word d_val;
+ } d_un;
+} Elf32_Dyn;
+
+typedef struct {
+ Elf64_Xword d_tag; /* entry tag value */
+ union {
+ Elf64_Addr d_ptr;
+ Elf64_Xword d_val;
+ } d_un;
+} Elf64_Dyn;
+
+/* d_tag */
+#define DT_NULL 0 /* Marks end of dynamic array */
+#define DT_NEEDED 1 /* Name of needed library (DT_STRTAB offset) */
+#define DT_PLTRELSZ 2 /* Size, in bytes, of relocations in PLT */
+#define DT_PLTGOT 3 /* Address of PLT and/or GOT */
+#define DT_HASH 4 /* Address of symbol hash table */
+#define DT_STRTAB 5 /* Address of string table */
+#define DT_SYMTAB 6 /* Address of symbol table */
+#define DT_RELA 7 /* Address of Rela relocation table */
+#define DT_RELASZ 8 /* Size, in bytes, of DT_RELA table */
+#define DT_RELAENT 9 /* Size, in bytes, of one DT_RELA entry */
+#define DT_STRSZ 10 /* Size, in bytes, of DT_STRTAB table */
+#define DT_SYMENT 11 /* Size, in bytes, of one DT_SYMTAB entry */
+#define DT_INIT 12 /* Address of initialization function */
+#define DT_FINI 13 /* Address of termination function */
+#define DT_SONAME 14 /* Shared object name (DT_STRTAB offset) */
+#define DT_RPATH 15 /* Library search path (DT_STRTAB offset) */
+#define DT_SYMBOLIC 16 /* Start symbol search within local object */
+#define DT_REL 17 /* Address of Rel relocation table */
+#define DT_RELSZ 18 /* Size, in bytes, of DT_REL table */
+#define DT_RELENT 19 /* Size, in bytes, of one DT_REL entry */
+#define DT_PLTREL 20 /* Type of PLT relocation entries */
+#define DT_DEBUG 21 /* Used for debugging; unspecified */
+#define DT_TEXTREL 22 /* Relocations might modify non-writable seg */
+#define DT_JMPREL 23 /* Address of relocations associated with PLT */
+#define DT_BIND_NOW 24 /* Process all relocations at load-time */
+#define DT_INIT_ARRAY 25 /* Address of initialization function array */
+#define DT_FINI_ARRAY 26 /* Size, in bytes, of DT_INIT_ARRAY array */
+#define DT_INIT_ARRAYSZ 27 /* Address of termination function array */
+#define DT_FINI_ARRAYSZ 28 /* Size, in bytes, of DT_FINI_ARRAY array*/
+#define DT_RUNPATH 29 /* overrides DT_RPATH */
+#define DT_FLAGS 30 /* Encodes ORIGIN, SYMBOLIC, TEXTREL, BIND_NOW, STATIC_TLS */
+#define DT_ENCODING 31 /* ??? */
+#define DT_PREINIT_ARRAY 32 /* Address of pre-init function array */
+#define DT_PREINIT_ARRAYSZ 33 /* Size, in bytes, of DT_PREINIT_ARRAY array */
+#define DT_NUM 34
+
+#define DT_LOOS 0x60000000 /* Operating system specific range */
+#define DT_VERSYM 0x6ffffff0 /* Symbol versions */
+#define DT_FLAGS_1 0x6ffffffb /* ELF dynamic flags */
+#define DT_VERDEF 0x6ffffffc /* Versions defined by file */
+#define DT_VERDEFNUM 0x6ffffffd /* Number of versions defined by file */
+#define DT_VERNEED 0x6ffffffe /* Versions needed by file */
+#define DT_VERNEEDNUM 0x6fffffff /* Number of versions needed by file */
+#define DT_HIOS 0x6fffffff
+#define DT_LOPROC 0x70000000 /* Processor-specific range */
+#define DT_HIPROC 0x7fffffff
+
+/* Flag values for DT_FLAGS */
+#define DF_ORIGIN 0x00000001 /* uses $ORIGIN */
+#define DF_SYMBOLIC 0x00000002 /* */
+#define DF_TEXTREL 0x00000004 /* */
+#define DF_BIND_NOW 0x00000008 /* */
+#define DF_STATIC_TLS 0x00000010 /* */
+
+/* Flag values for DT_FLAGS_1 */
+#define DF_1_NOW 0x00000001 /* Same as DF_BIND_NOW */
+#define DF_1_GLOBAL 0x00000002 /* Unused */
+#define DF_1_GROUP 0x00000004 /* Is member of group */
+#define DF_1_NODELETE 0x00000008 /* Cannot be deleted from process */
+#define DF_1_LOADFLTR 0x00000010 /* Immediate loading of filters */
+#define DF_1_INITFIRST 0x00000020 /* init/fini takes priority */
+#define DF_1_NOOPEN 0x00000040 /* Do not allow loading on dlopen() */
+#define DF_1_ORIGIN 0x00000080 /* Require $ORIGIN processing */
+#define DF_1_DIRECT 0x00000100 /* Enable direct bindings */
+#define DF_1_INTERPOSE 0x00000400 /* Is an interposer */
+#define DF_1_NODEFLIB 0x00000800 /* Ignore default library search path */
+#define DF_1_NODUMP 0x00001000 /* Cannot be dumped with dldump(3C) */
+#define DF_1_CONFALT 0x00002000 /* Configuration alternative */
+#define DF_1_ENDFILTEE 0x00004000 /* Filtee ends filter's search */
+#define DF_1_DISPRELDNE 0x00008000 /* Did displacement relocation */
+#define DF_1_DISPRELPND 0x00010000 /* Pending displacement relocation */
+#define DF_1_NODIRECT 0x00020000 /* Has non-direct bindings */
+#define DF_1_IGNMULDEF 0x00040000 /* Used internally */
+#define DF_1_NOKSYMS 0x00080000 /* Used internally */
+#define DF_1_NOHDR 0x00100000 /* Used internally */
+#define DF_1_EDITED 0x00200000 /* Has been modified since build */
+#define DF_1_NORELOC 0x00400000 /* Used internally */
+#define DF_1_SYMINTPOSE 0x00800000 /* Has individual symbol interposers */
+#define DF_1_GLOBAUDIT 0x01000000 /* Require global auditing */
+#define DF_1_SINGLETON 0x02000000 /* Has singleton symbols */
+#define DF_1_STUB 0x04000000 /* Stub */
+#define DF_1_PIE 0x08000000 /* Position Independent Executable */
+
#endif
--
2.39.1

@ -0,0 +1,68 @@
From f8ba1437114e408de0f66efb272fdc1de986017a Mon Sep 17 00:00:00 2001
From: Vincent Mihalkovic <vmihalko@redhat.com>
Date: Mon, 6 Feb 2023 14:39:58 +0100
Subject: [PATCH] We need to process the dynamic section so that we can set $x
for mime.
9ffbd485ba4647827c4bdacf3a2de690f6765b0c
---
src/readelf.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/readelf.c b/src/readelf.c
index cdc211f..94cdaca 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1273,6 +1273,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilities */
char name[50];
ssize_t namesize;
+ if (ms->flags & MAGIC_MIME)
+ return 0;
if (size != xsh_sizeof) {
if (file_printf(ms, ", corrupted section header size") == -1)
@@ -1622,6 +1624,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
break;
case PT_INTERP:
+ if (ms->flags & MAGIC_MIME)
+ continue;
if (bufsize && nbuf[0]) {
nbuf[bufsize - 1] = '\0';
memcpy(interp, nbuf, bufsize);
@@ -1629,6 +1633,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
strlcpy(interp, "*empty*", sizeof(interp));
break;
case PT_NOTE:
+ if (ms->flags & MAGIC_MIME)
+ return 0;
/*
* This is a PT_NOTE section; loop through all the notes
* in the section.
@@ -1645,9 +1651,13 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
}
break;
default:
+ if (ms->flags & MAGIC_MIME)
+ continue;
break;
}
}
+ if (ms->flags & MAGIC_MIME)
+ return 0;
if (file_printf(ms, ", %s linked", linking_style)
== -1)
return -1;
@@ -1678,7 +1688,7 @@ file_tryelf(struct magic_set *ms, const struct buffer *b)
Elf64_Ehdr elf64hdr;
uint16_t type, phnum, shnum, notecount;
- if (ms->flags & (MAGIC_MIME|MAGIC_APPLE|MAGIC_EXTENSION))
+ if (ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION))
return 0;
/*
* ELF executables have multiple section headers in arbitrary
--
2.39.1

@ -0,0 +1,36 @@
From 27c951adbd5d7ebe95f08c18257ea031bdd59ee1 Mon Sep 17 00:00:00 2001
From: Vincent Mihalkovic <vmihalko@redhat.com>
Date: Mon, 6 Feb 2023 15:00:16 +0100
Subject: [PATCH] For dynamic binaries let the df_1 pie flag determine if we
are pie or a shared object, and ignore the mode bits.
upstream commit: 03084b161cf888b5286dbbcd964c31ccad4f64d9
---
src/readelf.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/readelf.c b/src/readelf.c
index 94cdaca..9c75c0a 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1058,7 +1058,7 @@ dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
switch (xdh_tag) {
case DT_FLAGS_1:
- if (xdh_val == DF_1_PIE)
+ if (xdh_val & DF_1_PIE)
ms->mode |= 0111;
else
ms->mode &= ~0111;
@@ -1611,6 +1611,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
switch (xph_type) {
case PT_DYNAMIC:
offset = 0;
+ // Let DF_1 determine if we are PIE or not.
+ ms->mode &= ~0111;
for (;;) {
if (offset >= (size_t)bufsize)
break;
--
2.39.1

@ -0,0 +1,125 @@
From 948d0e24f33c3b411b5ec1e320acec889e6781b8 Mon Sep 17 00:00:00 2001
From: Vincent Mihalkovic <vmihalko@redhat.com>
Date: Mon, 6 Feb 2023 15:04:33 +0100
Subject: [PATCH] Improve detection of static-pie binaries, and don't call them
"dynamically linked", but call them "static-pie" linked.
363d7fcf703ad3ebf37b45693b2c9e43eb8b4176
---
src/readelf.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/src/readelf.c b/src/readelf.c
index 9c75c0a..0011659 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -1040,7 +1040,7 @@ do_auxv_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
private size_t
dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
- int clazz, int swap)
+ int clazz, int swap, int *pie, size_t *need)
{
Elf32_Dyn dh32;
Elf64_Dyn dh64;
@@ -1058,11 +1058,15 @@ dodynamic(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
switch (xdh_tag) {
case DT_FLAGS_1:
+ *pie = 1;
if (xdh_val & DF_1_PIE)
ms->mode |= 0111;
else
ms->mode &= ~0111;
break;
+ case DT_NEEDED:
+ (*need)++;
+ break;
default:
break;
}
@@ -1529,9 +1533,10 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
}
/*
- * Look through the program headers of an executable image, searching
- * for a PT_INTERP section; if one is found, it's dynamically linked,
- * otherwise it's statically linked.
+ * Look through the program headers of an executable image, to determine
+ * if it is statically or dynamically linked. If it has a dynamic section,
+ * it is pie, and does not have an interpreter or needed libraries, we
+ * call it static pie.
*/
private int
dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
@@ -1540,12 +1545,13 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
- const char *linking_style = "statically";
+ const char *linking_style;
unsigned char nbuf[BUFSIZ];
char ibuf[BUFSIZ];
char interp[BUFSIZ];
ssize_t bufsize;
- size_t offset, align, len;
+ size_t offset, align, len, need = 0;
+ int pie = 0, dynamic = 0;
if (size != xph_sizeof) {
if (file_printf(ms, ", corrupted program header size") == -1)
@@ -1569,7 +1575,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
/* Things we can determine before we seek */
switch (xph_type) {
case PT_DYNAMIC:
- linking_style = "dynamically";
doread = 1;
break;
case PT_NOTE:
@@ -1610,6 +1615,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
/* Things we can determine when we seek */
switch (xph_type) {
case PT_DYNAMIC:
+ dynamic = 1;
offset = 0;
// Let DF_1 determine if we are PIE or not.
ms->mode &= ~0111;
@@ -1617,7 +1623,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset >= (size_t)bufsize)
break;
offset = dodynamic(ms, nbuf, offset,
- CAST(size_t, bufsize), clazz, swap);
+ CAST(size_t, bufsize), clazz, swap,
+ &pie, &need);
if (offset == 0)
break;
}
@@ -1626,6 +1633,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
break;
case PT_INTERP:
+ need++;
if (ms->flags & MAGIC_MIME)
continue;
if (bufsize && nbuf[0]) {
@@ -1660,8 +1668,15 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
}
if (ms->flags & MAGIC_MIME)
return 0;
- if (file_printf(ms, ", %s linked", linking_style)
- == -1)
+ if (dynamic) {
+ if (pie && need == 0)
+ linking_style = "static-pie";
+ else
+ linking_style = "dynamically";
+ } else {
+ linking_style = "statically";
+ }
+ if (file_printf(ms, ", %s linked", linking_style) == -1)
return -1;
if (interp[0])
if (file_printf(ms, ", interpreter %s",
--
2.39.1

@ -0,0 +1,13 @@
diff --git a/src/readelf.c b/src/readelf.c
index d836e68..6d4b40b 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -69,7 +69,7 @@ toomany(struct magic_set *ms, const char *name, uint16_t num)
{
if (file_printf(ms, ", too many %s (%u)", name, num) == -1)
return -1;
- return 0;
+ return 1;
}
private uint16_t

@ -0,0 +1,14 @@
diff -urp file-5.33.orig/src/softmagic.c file-5.33/src/softmagic.c
--- file-5.33.orig/src/softmagic.c 2018-04-15 14:49:15.000000000 -0400
+++ file-5.33/src/softmagic.c 2020-12-14 12:21:13.298285158 -0500
@@ -1758,7 +1758,9 @@ file_strncmp(const char *s1, const char
*/
const unsigned char *a = (const unsigned char *)s1;
const unsigned char *b = (const unsigned char *)s2;
- const unsigned char *eb = b + len;
+ uint32_t ws = flags & (STRING_COMPACT_WHITESPACE |
+ STRING_COMPACT_OPTIONAL_WHITESPACE);
+ const unsigned char *eb = b + (ws ? strlen(s2) : len);
uint64_t v;
/*

@ -0,0 +1,26 @@
From b675e1cf6c5f047a1ab52b7dcea3c83ea6aac69f Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Fri, 9 Nov 2018 17:51:12 +0000
Subject: [PATCH] Add eBPF magic from Matteo Croce
Upstream-commit: 4cf4e817457ce6ca32452a7c80b27e96be6441dc
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/elf | 1 +
1 file changed, 1 insertion(+)
diff --git a/magic/Magdir/elf b/magic/Magdir/elf
index 133bd1f..7c6011c 100644
--- a/magic/Magdir/elf
+++ b/magic/Magdir/elf
@@ -263,6 +263,7 @@
>18 leshort 217 iCelero CoolEngine,
>18 leshort 218 Nanoradio Optimized RISC,
>18 leshort 243 UCB RISC-V,
+>18 leshort 247 eBPF,
>18 leshort 0x1057 AVR (unofficial),
>18 leshort 0x1059 MSP430 (unofficial),
>18 leshort 0x1223 Adapteva Epiphany (unofficial),
--
2.17.2

@ -0,0 +1,56 @@
From 5bccda402a33b4b6fee13cbc910580a85f1ab73a Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Mon, 18 Feb 2019 18:59:25 +0000
Subject: [PATCH 1/2] Mention that the apple filetype/creator is only available for
entries that have it (Kamil Dudka)
Upstream-commit: 642f269ef99930b44daa2236908da7d05a68eb08
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
doc/file.man | 3 +++
1 file changed, 3 insertions(+)
diff --git a/doc/file.man b/doc/file.man
index 0968321..98061ba 100644
--- a/doc/file.man
+++ b/doc/file.man
@@ -171,6 +171,9 @@ Causes the file command to output the file type and creator code as
used by older MacOS versions.
The code consists of eight letters,
the first describing the file type, the latter the creator.
+the first describing the file type, the latter the creator.
+This option works properly only for file formats that have the
+apple-style output defined.
.It Fl b , Fl Fl brief
Do not prepend filenames to output lines (brief mode).
.It Fl C , Fl Fl compile
--
2.20.1
From f7f3e751c0e606592b4d377a479b40f6964705ab Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Sun, 3 Mar 2019 02:32:40 +0000
Subject: [PATCH 2/2] remove duplicate line (chefe)
Upstream-commit: cde5f5962ebfd057fc2e330da3b36470e6ee3724
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
doc/file.man | 1 -
1 file changed, 1 deletion(-)
diff --git a/doc/file.man b/doc/file.man
index 98061ba..05da3a7 100644
--- a/doc/file.man
+++ b/doc/file.man
@@ -171,7 +171,6 @@ Causes the file command to output the file type and creator code as
used by older MacOS versions.
The code consists of eight letters,
the first describing the file type, the latter the creator.
-the first describing the file type, the latter the creator.
This option works properly only for file formats that have the
apple-style output defined.
.It Fl b , Fl Fl brief
--
2.21.1

@ -0,0 +1,67 @@
From b3842fb61c829b0b62e7b8a058b8a86cd83aa0e7 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Tue, 22 Jan 2019 16:17:25 +0000
Subject: [PATCH] Make netpbm beat DOS/MBR magic again (Kamil Dudka)
Upstream-commit: d2f82e2601e551badc03c4ac7a463d8e18f53e32
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/images | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/magic/Magdir/images b/magic/Magdir/images
index fd20261..afe906c 100644
--- a/magic/Magdir/images
+++ b/magic/Magdir/images
@@ -175,42 +175,42 @@
>0 regex/4 P1[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, bitmap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-bitmap
0 search/1 P2
>0 regex/4 P2[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, greymap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-greymap
0 search/1 P3
>0 regex/4 P3[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, pixmap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-pixmap
0 string P4
>0 regex/4 P4[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, rawbits, bitmap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-bitmap
0 string P5
>0 regex/4 P5[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, rawbits, greymap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-greymap
0 string P6
>0 regex/4 P6[\040\t\f\r\n]
>>0 use netpbm
>>>0 string x \b, rawbits, pixmap
-!:strength + 45
+!:strength + 65
!:mime image/x-portable-pixmap
0 string P7 Netpbm PAM image file
--
2.20.1

@ -0,0 +1,62 @@
From 7a4b49897c3bc63bdf680f8cb1d7a04ac932a4ff Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Mon, 21 May 2018 16:32:34 +0000
Subject: [PATCH 1/2] Add missing commas.
Upstream-commit: defcf7e39943780dd19ca002c478e52ec9ee5cbc
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/elf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/magic/Magdir/elf b/magic/Magdir/elf
index 7c6ac8f..d5b2d02 100644
--- a/magic/Magdir/elf
+++ b/magic/Magdir/elf
@@ -50,7 +50,7 @@
!:mime application/x-executable
>16 leshort 3 shared object,
!:mime application/x-sharedlib
->16 leshort 4 core file
+>16 leshort 4 core file,
!:mime application/x-coredump
# Core file detection is not reliable.
#>>>(0x38+0xcc) string >\0 of '%s'
--
2.20.1
From 1c7aa7b88ef9f53e19a64961867427b0c1f04857 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Tue, 22 Jan 2019 16:28:42 +0000
Subject: [PATCH 2/2] Add Linux PowerPC core offsets for Linux (which are off-by-4
of the regular offsets), after the regular Linux offsets so that there is no
confusion. The linux offsets are tried first since they are before, so on PPC
they should contain binary data and not match. Addition requested by: Ondrej
Dubaj/Kamil Dudka
Upstream-commit: 6367a7c9b476767a692f76e78e3b355dc9386e48
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/readelf.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/src/readelf.c b/src/readelf.c
index d96a538..c101483 100644
--- a/src/readelf.c
+++ b/src/readelf.c
@@ -246,7 +246,10 @@ static const size_t prpsoffsets32[] = {
84, /* SunOS 5.x (short name) */
44, /* Linux (command line) */
- 28, /* Linux 2.0.36 (short name) */
+ 28, /* Linux (short name) */
+
+ 48, /* Linux PowerPC (command line) */
+ 32, /* Linux PowerPC (short name) */
8, /* FreeBSD */
};
--
2.20.1

@ -0,0 +1,52 @@
From f73ad90e797824569008a054bea6c8215883a3a0 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Mon, 26 Aug 2019 14:31:39 +0000
Subject: [PATCH] Limit the number of elements in a vector (found by oss-fuzz)
Upstream-commit: 46a8443f76cec4b41ec736eca396984c74664f84
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
src/cdf.c | 7 +++----
src/cdf.h | 1 +
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/cdf.c b/src/cdf.c
index 556a3ff..8bb0a6d 100644
--- a/src/cdf.c
+++ b/src/cdf.c
@@ -1013,8 +1013,9 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
goto out;
}
nelements = CDF_GETUINT32(q, 1);
- if (nelements == 0) {
- DPRINTF(("CDF_VECTOR with nelements == 0\n"));
+ if (nelements > CDF_ELEMENT_LIMIT || nelements == 0) {
+ DPRINTF(("CDF_VECTOR with nelements == %"
+ SIZE_T_FORMAT "u\n", nelements));
goto out;
}
slen = 2;
@@ -1056,8 +1057,6 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
goto out;
inp += nelem;
}
- DPRINTF(("nelements = %" SIZE_T_FORMAT "u\n",
- nelements));
for (j = 0; j < nelements && i < sh.sh_properties;
j++, i++)
{
diff --git a/src/cdf.h b/src/cdf.h
index 2f7e554..0505666 100644
--- a/src/cdf.h
+++ b/src/cdf.h
@@ -48,6 +48,7 @@
typedef int32_t cdf_secid_t;
#define CDF_LOOP_LIMIT 10000
+#define CDF_ELEMENT_LIMIT 100000
#define CDF_SECID_NULL 0
#define CDF_SECID_FREE -1
--
2.20.1

@ -0,0 +1,40 @@
From 432267e707aca36bec55704fd404fa572e2c4b45 Mon Sep 17 00:00:00 2001
From: Christos Zoulas <christos@zoulas.com>
Date: Fri, 15 Nov 2019 23:49:38 +0000
Subject: [PATCH] fix JFFS2 (the old magic was just hex encoded 0x1984 which is
wrong (Kamil Dudka)
Upstream-commit: 5ad78c726bb03e0fbdb6d237ef2b13e51968ffea
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/Magdir/filesystems | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/magic/Magdir/filesystems b/magic/Magdir/filesystems
index 1920e56..da5c580 100644
--- a/magic/Magdir/filesystems
+++ b/magic/Magdir/filesystems
@@ -2057,10 +2057,6 @@
>0x10040 lelong 2 yura hash
>0x10040 lelong 3 r5 hash
-# JFFS - russell@coker.com.au
-0 lelong 0x34383931 Linux Journalled Flash File system, little endian
-0 belong 0x34383931 Linux Journalled Flash File system, big endian
-
# EST flat binary format (which isn't, but anyway)
# From: Mark Brown <broonie@sirena.org.uk>
0 string ESTFBINR EST flat binary
@@ -2144,7 +2140,9 @@
# JFFS2 file system
0 leshort 0x1984 Linux old jffs2 filesystem data little endian
+0 beshort 0x1984 Linux old jffs2 filesystem data big endian
0 leshort 0x1985 Linux jffs2 filesystem data little endian
+0 beshort 0x1985 Linux jffs2 filesystem data big endian
# Squashfs
0 string sqsh Squashfs filesystem, big endian,
--
2.20.1

@ -0,0 +1,64 @@
From f25107f625e88726e8ae9d4963573b5a0dda8f4c Mon Sep 17 00:00:00 2001
From: Jan Kaluza <hanzz.k@gmail.com>
Date: Thu, 15 Dec 2011 16:15:41 +0100
Subject: [PATCH] file-localmagic.patch
Upstream says it's up to distributions to add a way to support local-magic.
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
magic/magic.local | 3 +++
src/Makefile.am | 2 +-
src/Makefile.in | 2 +-
src/apprentice.c | 2 +-
4 files changed, 6 insertions(+), 3 deletions(-)
create mode 100644 magic/magic.local
diff --git a/magic/magic.local b/magic/magic.local
new file mode 100644
index 0000000..283a863
--- /dev/null
+++ b/magic/magic.local
@@ -0,0 +1,3 @@
+# Magic local data for file(1) command.
+# Insert here your local magic data. Format is described in magic(5).
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 155aec4..0f22539 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,4 +1,4 @@
-MAGIC = $(pkgdatadir)/magic
+MAGIC = /etc/magic:$(pkgdatadir)/magic
lib_LTLIBRARIES = libmagic.la
nodist_include_HEADERS = magic.h
diff --git a/src/Makefile.in b/src/Makefile.in
index b6eeb20..78dce55 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -337,7 +337,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-MAGIC = $(pkgdatadir)/magic
+MAGIC = /etc/magic:$(pkgdatadir)/magic
lib_LTLIBRARIES = libmagic.la
nodist_include_HEADERS = magic.h
AM_CPPFLAGS = -DMAGIC='"$(MAGIC)"'
diff --git a/src/apprentice.c b/src/apprentice.c
index e395854..ecc1214 100644
--- a/src/apprentice.c
+++ b/src/apprentice.c
@@ -454,7 +454,7 @@ apprentice_1(struct magic_set *ms, const char *fn, int action)
if (map == (struct magic_map *)-1)
return -1;
if (map == NULL) {
- if (ms->flags & MAGIC_CHECK)
+ if (ms->flags & MAGIC_CHECK && strcmp("/etc/magic", fn) != 0)
file_magwarn(ms, "using regular magic file `%s'", fn);
map = apprentice_load(ms, fn, action);
if (map == NULL)
--
2.5.5

@ -0,0 +1,13 @@
diff --git a/magic/Magdir/filesystems b/magic/Magdir/filesystems
index eb41868f..44805a35 100644
--- a/magic/Magdir/filesystems
+++ b/magic/Magdir/filesystems
@@ -1973,7 +1973,7 @@
# to display CD-ROM (70=81-11) after MBR (113=40+72+1), partition-table (71=50+21) and before Apple Driver Map (51)
#!:strength -11
# to display CD-ROM (114=81+33) before MBR (113=40+72+1), partition-table (71=50+21) and Apple Driver Map (51)
-!:strength +34
+!:strength +35
>0 use cdrom
# URL: https://en.wikipedia.org/wiki/NRG_(file_format)

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save