Module Name: src
Committed By: christos
Date: Fri Jan 2 21:15:32 UTC 2015
Modified Files:
src/external/bsd/file/dist: ChangeLog Makefile.in configure
configure.ac
src/external/bsd/file/dist/doc: file.1 libmagic.3 magic.5
src/external/bsd/file/dist/magic: Makefile.am Makefile.in
src/external/bsd/file/dist/magic/magdir: filesystems pgp
src/external/bsd/file/dist/src: Makefile.in apprentice.c cdf.c
cdf_time.c compress.c encoding.c file.c file.h fsmagic.c funcs.c
magic.c print.c readcdf.c readelf.c softmagic.c
src/external/bsd/file/include: config.h
src/external/bsd/file/lib: shlib_version
Log Message:
merge conflicts
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/file/dist/ChangeLog
cvs rdiff -u -r1.11 -r1.12 src/external/bsd/file/dist/Makefile.in
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/file/dist/configure
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/file/dist/configure.ac
cvs rdiff -u -r1.15 -r1.16 src/external/bsd/file/dist/doc/file.1
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/file/dist/doc/libmagic.3 \
src/external/bsd/file/dist/doc/magic.5
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/file/dist/magic/Makefile.am
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/file/dist/magic/Makefile.in
cvs rdiff -u -r1.9 -r1.10 src/external/bsd/file/dist/magic/magdir/filesystems
cvs rdiff -u -r1.2 -r1.3 src/external/bsd/file/dist/magic/magdir/pgp
cvs rdiff -u -r1.11 -r1.12 src/external/bsd/file/dist/src/Makefile.in \
src/external/bsd/file/dist/src/readcdf.c
cvs rdiff -u -r1.13 -r1.14 src/external/bsd/file/dist/src/apprentice.c \
src/external/bsd/file/dist/src/file.h
cvs rdiff -u -r1.10 -r1.11 src/external/bsd/file/dist/src/cdf.c \
src/external/bsd/file/dist/src/fsmagic.c \
src/external/bsd/file/dist/src/readelf.c
cvs rdiff -u -r1.6 -r1.7 src/external/bsd/file/dist/src/cdf_time.c \
src/external/bsd/file/dist/src/file.c
cvs rdiff -u -r1.9 -r1.10 src/external/bsd/file/dist/src/compress.c \
src/external/bsd/file/dist/src/funcs.c \
src/external/bsd/file/dist/src/magic.c
cvs rdiff -u -r1.3 -r1.4 src/external/bsd/file/dist/src/encoding.c
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/file/dist/src/print.c
cvs rdiff -u -r1.12 -r1.13 src/external/bsd/file/dist/src/softmagic.c
cvs rdiff -u -r1.7 -r1.8 src/external/bsd/file/include/config.h
cvs rdiff -u -r1.4 -r1.5 src/external/bsd/file/lib/shlib_version
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/bsd/file/dist/ChangeLog
diff -u src/external/bsd/file/dist/ChangeLog:1.2 src/external/bsd/file/dist/ChangeLog:1.3
--- src/external/bsd/file/dist/ChangeLog:1.2 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/ChangeLog Fri Jan 2 16:15:32 2015
@@ -1,3 +1,72 @@
+2015-01-02 15:15 Christos Zoulas <[email protected]>
+
+ * release 5.22
+
+2015-01-01 12:01 Christos Zoulas <[email protected]>
+
+ * add indirect relative for TIFF/Exif
+
+2014-12-16 18:10 Christos Zoulas <[email protected]>
+
+ * restructure elf note printing to avoid repeated messages
+ * add note limit, suggested by Alexander Cherepanov
+
+2014-12-16 16:53 Christos Zoulas <[email protected]>
+
+ * Bail out on partial pread()'s (Alexander Cherepanov)
+ * Fix incorrect bounds check in file_printable (Alexander Cherepanov)
+
+2014-12-11 20:01 Christos Zoulas <[email protected]>
+
+ * PR/405: ignore SIGPIPE from uncompress programs
+ * change printable -> file_printable and use it in
+ more places for safety
+ * in ELF, instead of "(uses dynamic libraries)" when PT_INTERP
+ is present print the interpreter name.
+
+2014-12-10 20:01 Christos Zoulas <[email protected]>
+
+ * release 5.21
+
+2014-11-27 18:40 Christos Zoulas <[email protected]>
+
+ * Allow setting more parameters from the command line.
+ * Split name/use and indirect magic recursion limits.
+
+2014-11-27 11:12 Christos Zoulas <[email protected]>
+
+ * Adjust ELF parameters and the default recursion
+ level.
+ * Allow setting the recursion level dynamically.
+
+2014-11-24 8:55 Christos Zoulas <[email protected]>
+
+ * The following fixes resulted from Thomas Jarosch's fuzzing
+ tests that revealed severe performance issues on pathological
+ input:
+ - limit number of elf program and sections processing
+ - abort elf note processing quickly
+ - reduce the number of recursion levels from 20 to 10
+ - preserve error messages in indirect magic handling
+
+ This is tracked as CVE-2014-8116 and CVE-2014-8117
+
+2014-11-12 10:30 Christos Zoulas <[email protected]>
+
+ * fix bogus free in the user buffer case.
+
+2014-11-11 12:35 Christos Zoulas <[email protected]>
+
+ * fix out of bounds read for pascal strings
+ * fix memory leak (not freeing the head of each mlist)
+
+2014-11-07 10:25 Christos Zoulas <[email protected]>
+
+ * When printing strings from a file, convert them to printable
+ on a byte by byte basis, so that we don't get issues with
+ locale's trying to interpret random byte streams as UTF-8 and
+ having printf error out with EILSEQ.
+
2014-10-17 11:48 Christos Zoulas <[email protected]>
* fix bounds in note reading (Francisco Alonso / Red Hat)
Index: src/external/bsd/file/dist/Makefile.in
diff -u src/external/bsd/file/dist/Makefile.in:1.11 src/external/bsd/file/dist/Makefile.in:1.12
--- src/external/bsd/file/dist/Makefile.in:1.11 Mon Oct 20 18:04:30 2014
+++ src/external/bsd/file/dist/Makefile.in Fri Jan 2 16:15:32 2015
@@ -317,7 +317,8 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = MAINT
-SUBDIRS = src magic doc
+#SUBDIRS = src magic doc
+SUBDIRS = src
all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
Index: src/external/bsd/file/dist/configure
diff -u src/external/bsd/file/dist/configure:1.13 src/external/bsd/file/dist/configure:1.14
--- src/external/bsd/file/dist/configure:1.13 Mon Oct 20 18:04:30 2014
+++ src/external/bsd/file/dist/configure Fri Jan 2 16:15:32 2015
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for file 5.20.
+# Generated by GNU Autoconf 2.69 for file 5.22.
#
# Report bugs to <[email protected]>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='file'
PACKAGE_TARNAME='file'
-PACKAGE_VERSION='5.20'
-PACKAGE_STRING='file 5.20'
+PACKAGE_VERSION='5.22'
+PACKAGE_STRING='file 5.22'
PACKAGE_BUGREPORT='[email protected]'
PACKAGE_URL=''
@@ -1331,7 +1331,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures file 5.20 to adapt to many kinds of systems.
+\`configure' configures file 5.22 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1401,7 +1401,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of file 5.20:";;
+ short | recursive ) echo "Configuration of file 5.22:";;
esac
cat <<\_ACEOF
@@ -1514,7 +1514,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-file configure 5.20
+file configure 5.22
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2170,7 +2170,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by file $as_me 5.20, which was
+It was created by file $as_me 5.22, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3036,7 +3036,7 @@ fi
# Define the identity of the package.
PACKAGE='file'
- VERSION='5.20'
+ VERSION='5.22'
cat >>confdefs.h <<_ACEOF
@@ -15032,7 +15032,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_wri
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by file $as_me 5.20, which was
+This file was extended by file $as_me 5.22, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -15098,7 +15098,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-file config.status 5.20
+file config.status 5.22
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
Index: src/external/bsd/file/dist/configure.ac
diff -u src/external/bsd/file/dist/configure.ac:1.10 src/external/bsd/file/dist/configure.ac:1.11
--- src/external/bsd/file/dist/configure.ac:1.10 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/configure.ac Fri Jan 2 16:15:32 2015
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT([file],[5.20],[[email protected]])
+AC_INIT([file],[5.22],[[email protected]])
AM_INIT_AUTOMAKE([subdir-objects foreign])
AM_MAINTAINER_MODE(disable)
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
Index: src/external/bsd/file/dist/doc/file.1
diff -u src/external/bsd/file/dist/doc/file.1:1.15 src/external/bsd/file/dist/doc/file.1:1.16
--- src/external/bsd/file/dist/doc/file.1:1.15 Fri Oct 10 16:15:01 2014
+++ src/external/bsd/file/dist/doc/file.1 Fri Jan 2 16:15:32 2015
@@ -1,7 +1,7 @@
-.\" $NetBSD: file.1,v 1.15 2014/10/10 20:15:01 christos Exp $
+.\" $NetBSD: file.1,v 1.16 2015/01/02 21:15:32 christos Exp $
.\"
-.\" $File: file.man,v 1.106 2014/03/07 23:11:51 christos Exp $
-.Dd January 30, 2014
+.\" $File: file.man,v 1.111 2014/12/16 23:18:40 christos Exp $
+.Dd December 16, 2014
.Dt FILE 1
.Os
.Sh NAME
@@ -18,6 +18,7 @@
.Op Fl F Ar separator
.Op Fl f Ar namefile
.Op Fl m Ar magicfiles
+.Op Fl P Ar name=value
.Ar
.Ek
.Nm
@@ -26,7 +27,7 @@
.Nm
.Op Fl Fl help
.Sh DESCRIPTION
-This manual page documents version 5.20 of the
+This manual page documents version 5.22 of the
.Nm
command.
.Pp
@@ -305,6 +306,16 @@ or
attempt to preserve the access time of files analyzed, to pretend that
.Nm
never read them.
+.It Fl P , Fl Fl parameter Ar name=value
+Set various parameter limits.
+.Bl -column "elf_phnum" "Default" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -offset indent
+.It Sy "Name" Ta Sy "Default" Ta Sy "Explanation"
+.It Li indir Ta 15 Ta recursion limit for indirect magic
+.It Li name Ta 30 Ta use count limit for name/use magic
+.It Li elf_notes Ta 256 Ta max ELF notes processed
+.It Li elf_phnum Ta 128 Ta max ELF program sections processed
+.It Li elf_shnum Ta 32768 Ta max ELF sections processed
+.El
.It Fl r , Fl Fl raw
Don't translate unprintable characters to \eooo.
Normally
Index: src/external/bsd/file/dist/doc/libmagic.3
diff -u src/external/bsd/file/dist/doc/libmagic.3:1.13 src/external/bsd/file/dist/doc/libmagic.3:1.14
--- src/external/bsd/file/dist/doc/libmagic.3:1.13 Fri Oct 10 16:15:01 2014
+++ src/external/bsd/file/dist/doc/libmagic.3 Fri Jan 2 16:15:32 2015
@@ -1,6 +1,6 @@
-.\" $NetBSD: libmagic.3,v 1.13 2014/10/10 20:15:01 christos Exp $
+.\" $NetBSD: libmagic.3,v 1.14 2015/01/02 21:15:32 christos Exp $
.\"
-.\" $File: libmagic.man,v 1.29 2014/08/04 06:19:44 christos Exp $
+.\" $File: libmagic.man,v 1.34 2014/12/16 23:18:40 christos Exp $
.\"
.\" Copyright (c) Christos Zoulas 2003.
.\" All Rights Reserved.
@@ -27,7 +27,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 4, 2014
+.Dd December 16, 2014
.Dt LIBMAGIC 3
.Os
.Sh NAME
@@ -42,6 +42,9 @@
.Nm magic_compile ,
.Nm magic_list ,
.Nm magic_load ,
+.Nm magic_load_buffers ,
+.Nm magic_setparam ,
+.Nm magic_getparam ,
.Nm magic_version
.Nd Magic number recognition library
.Sh LIBRARY
@@ -75,6 +78,10 @@
.Ft int
.Fn magic_load_buffers "magic_t cookie" "void **buffers" "size_t *sizes" "size_t nbuffers"
.Ft int
+.Fn magic_getparam "magic_t cookie" "int param" "void *value"
+.Ft int
+.Fn magic_setparam "magic_t cookie" "int param" "const void *value"
+.Ft int
.Fn magic_version "void"
.Sh DESCRIPTION
These functions
@@ -271,6 +278,47 @@ not have direct access to the filesystem
database via shared memory or other IPC means.
.Pp
The
+.Fn magic_getparam
+and
+.Fn magic_setparam
+allow getting and setting various limits related to the the magic
+library.
+.Bl -column "MAGIC_PARAM_ELF_PHNUM_MAX" "size_t" "Default" -offset indent
+.It Sy "Parameter" Ta Sy "Type" Ta Sy "Default"
+.It Li MAGIC_PARAM_INDIR_MAX Ta size_t Ta 15
+.It Li MAGIC_PARAM_NAME_MAX Ta size_t Ta 30
+.It Li MAGIC_PARAM_ELF_NOTES_MAX Ta size_t Ta 256
+.It Li MAGIC_PARAM_ELF_PHNUM_MAX Ta size_t Ta 128
+.It Li MAGIC_PARAM_ELF_SHNUM_MAX Ta size_t Ta 32768
+.El
+.Pp
+The
+.Dv MAGIC_PARAM_INDIR_RECURSION
+parameter controls how many levels of recursion will be followed for
+indirect magic entries.
+.Pp
+The
+.Dv MAGIC_PARAM_NAME_RECURSION
+parameter controls how many levels of recursion will be followed for
+for name/use calls.
+.Pp
+The
+.Dv MAGIC_PARAM_NAME_MAX
+parameter controls the maximum number of calls for name/use.
+.Pp
+The
+.Dv MAGIC_PARAM_NOTES_MAX
+parameter controls how many ELF notes will be processed.
+.Pp
+The
+.Dv MAGIC_PARAM_PHNUM_MAX
+parameter controls how many ELF program sections will be processed.
+.Pp
+The
+.Dv MAGIC_PARAM_SHNUM_MAX
+parameter controls how many ELF sections will be processed.
+.Pp
+The
.Fn magic_version
command returns the version number of this library which is compiled into
the shared library using the constant
Index: src/external/bsd/file/dist/doc/magic.5
diff -u src/external/bsd/file/dist/doc/magic.5:1.13 src/external/bsd/file/dist/doc/magic.5:1.14
--- src/external/bsd/file/dist/doc/magic.5:1.13 Fri Oct 10 16:15:01 2014
+++ src/external/bsd/file/dist/doc/magic.5 Fri Jan 2 16:15:32 2015
@@ -1,7 +1,7 @@
-.\" $NetBSD: magic.5,v 1.13 2014/10/10 20:15:01 christos Exp $
+.\" $NetBSD: magic.5,v 1.14 2015/01/02 21:15:32 christos Exp $
.\"
-.\" $File: magic.man,v 1.84 2014/06/03 19:01:34 christos Exp $
-.Dd June 3, 2014
+.\" $File: magic.man,v 1.85 2015/01/01 17:07:34 christos Exp $
+.Dd January 1, 2015
.Dt MAGIC 5
.Os
.\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
@@ -12,7 +12,7 @@
This manual page documents the format of the magic file as
used by the
.Xr file 1
-command, version 5.20.
+command, version 5.22.
The
.Xr file 1
command identifies the type of a file using,
@@ -202,6 +202,11 @@ interpreted as a UNIX-style date, but in
than UTC.
.It Dv indirect
Starting at the given offset, consult the magic database again.
+The offset of th
+.Dv indirect
+magic is by default absolute in the file, but one can specify
+.Dv /r
+to indicate that the offset is relative from the beginning of the entry.
.It Dv name
Define a
.Dq named
Index: src/external/bsd/file/dist/magic/Makefile.am
diff -u src/external/bsd/file/dist/magic/Makefile.am:1.10 src/external/bsd/file/dist/magic/Makefile.am:1.11
--- src/external/bsd/file/dist/magic/Makefile.am:1.10 Fri Oct 10 16:15:01 2014
+++ src/external/bsd/file/dist/magic/Makefile.am Fri Jan 2 16:15:32 2015
@@ -1,5 +1,5 @@
#
-# $File: Makefile.am,v 1.99 2014/08/04 06:26:16 christos Exp $
+# $File: Makefile.am,v 1.101 2014/12/12 16:48:39 christos Exp $
#
MAGIC_FRAGMENT_BASE = magdir
MAGIC_DIR = $(top_srcdir)/magic
@@ -117,6 +117,7 @@ $(MAGIC_FRAGMENT_DIR)/jpeg \
$(MAGIC_FRAGMENT_DIR)/karma \
$(MAGIC_FRAGMENT_DIR)/kde \
$(MAGIC_FRAGMENT_DIR)/keepass \
+$(MAGIC_FRAGMENT_DIR)/kerberos \
$(MAGIC_FRAGMENT_DIR)/kml \
$(MAGIC_FRAGMENT_DIR)/lecter \
$(MAGIC_FRAGMENT_DIR)/lex \
@@ -197,6 +198,7 @@ $(MAGIC_FRAGMENT_DIR)/pulsar \
$(MAGIC_FRAGMENT_DIR)/pwsafe \
$(MAGIC_FRAGMENT_DIR)/pyramid \
$(MAGIC_FRAGMENT_DIR)/python \
+$(MAGIC_FRAGMENT_DIR)/qt \
$(MAGIC_FRAGMENT_DIR)/revision \
$(MAGIC_FRAGMENT_DIR)/riff \
$(MAGIC_FRAGMENT_DIR)/rpm \
Index: src/external/bsd/file/dist/magic/Makefile.in
diff -u src/external/bsd/file/dist/magic/Makefile.in:1.13 src/external/bsd/file/dist/magic/Makefile.in:1.14
--- src/external/bsd/file/dist/magic/Makefile.in:1.13 Mon Oct 20 18:04:31 2014
+++ src/external/bsd/file/dist/magic/Makefile.in Fri Jan 2 16:15:32 2015
@@ -263,7 +263,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
#
-# $File: Makefile.am,v 1.99 2014/08/04 06:26:16 christos Exp $
+# $File: Makefile.am,v 1.101 2014/12/12 16:48:39 christos Exp $
#
MAGIC_FRAGMENT_BASE = magdir
MAGIC_DIR = $(top_srcdir)/magic
@@ -379,6 +379,7 @@ $(MAGIC_FRAGMENT_DIR)/jpeg \
$(MAGIC_FRAGMENT_DIR)/karma \
$(MAGIC_FRAGMENT_DIR)/kde \
$(MAGIC_FRAGMENT_DIR)/keepass \
+$(MAGIC_FRAGMENT_DIR)/kerberos \
$(MAGIC_FRAGMENT_DIR)/kml \
$(MAGIC_FRAGMENT_DIR)/lecter \
$(MAGIC_FRAGMENT_DIR)/lex \
@@ -459,6 +460,7 @@ $(MAGIC_FRAGMENT_DIR)/pulsar \
$(MAGIC_FRAGMENT_DIR)/pwsafe \
$(MAGIC_FRAGMENT_DIR)/pyramid \
$(MAGIC_FRAGMENT_DIR)/python \
+$(MAGIC_FRAGMENT_DIR)/qt \
$(MAGIC_FRAGMENT_DIR)/revision \
$(MAGIC_FRAGMENT_DIR)/riff \
$(MAGIC_FRAGMENT_DIR)/rpm \
Index: src/external/bsd/file/dist/magic/magdir/filesystems
diff -u src/external/bsd/file/dist/magic/magdir/filesystems:1.9 src/external/bsd/file/dist/magic/magdir/filesystems:1.10
--- src/external/bsd/file/dist/magic/magdir/filesystems:1.9 Fri Oct 10 16:15:01 2014
+++ src/external/bsd/file/dist/magic/magdir/filesystems Fri Jan 2 16:15:32 2015
@@ -1,5 +1,5 @@
#------------------------------------------------------------------------------
-# $File: filesystems,v 1.103 2014/09/11 15:09:34 christos Exp $
+# $File: filesystems,v 1.108 2015/01/01 17:43:47 christos Exp $
# filesystems: file(1) magic for different filesystems
#
0 name partid
@@ -260,13 +260,14 @@
>>(11.s-2) uleshort 0xAA55 DOS/MBR boot sector
# for sector sizes with 512 or more Bytes
>0x1FE leshort 0xAA55 DOS/MBR boot sector
+
# keep old DOS/MBR boot sector as dummy for mbr and bootloader displaying
# only for sector sizes with 512 or more Bytes
-0x1FE leshort 0xAA55
+0x1FE leshort 0xAA55 DOS/MBR boot sector
#
# to display information (50) before DOS BPB (strength=70) and after DOS floppy (120) like in old file version
-!:strength +70
->2 string OSBS OS/BS MBR
+!:strength +65
+>2 string OSBS OS/BS MBR
# added by Joerg Jenderek at Feb 2013 according to http://thestarman.pcministry.com/asm/mbr/
# and http://en.wikipedia.org/wiki/Master_Boot_Record
# test for nearly all MS-DOS Master Boot Record initial program loader (IPL) is now done by
@@ -538,6 +539,8 @@
>>>514 string !HdrS
# not BeOS
>>>>422 string !Be\ Boot\ Loader
+>>>>>32769 string CD001
+>>>>>>0 use cdrom
# jump over BPB instruction implies DOS bootsector or AdvanceMAME mbr
>>>>>0 ubelong&0xFD000000 =0xE9000000
# AdvanceMAME mbr
@@ -1043,7 +1046,7 @@
>>>>>>466 ubyte <0x10
>>>>>>>466 ubyte 0x05 \b, extended partition table
>>>>>>>466 ubyte 0x0F \b, extended partition table (LBA)
->>>>>>>466 ubyte 0x0 \b, extended partition table (last)
+>>>>>>>466 ubyte 0x0 \b, extended partition table (last)
# DOS x86 sector separated and moved from "DOS/MBR boot sector" by Joerg Jenderek at May 2011
@@ -1236,6 +1239,7 @@
>>>>>181 search/166 Error\ \0
# "a: disk" , "Fn: diskn" or "NetBSD MBR boot"
>>>>>>&3 string x \b,"%s"
+>>>446 use partition-table
# Andrea Mazzoleni AdvanceCD mbr loader of http://advancemame.sourceforge.net/boot-readme.html
# added by Joerg Jenderek at Nov 2012 for versions 1.3 - 1.4
# assembler instructions: jmp short 0x58;nop;ASCII
@@ -1354,6 +1358,7 @@
# maximal short forward jump is 0x7f
# OEM-ID is empty or contain readable bytes
0 ulelong&0x804000E9 0x000000E9
+!:strength +60
# mtools-3.9.8/msdos.h
# usual values are marked with comments to get only informations of strange FAT systems
# valid sectorsize must be a power of 2 from 32 to 32768
@@ -1361,7 +1366,7 @@
>>11 uleshort <32769
>>>11 uleshort >31
>>>>21 ubyte&0xf0 0xF0
->>>>>0 ubyte 0xEB
+>>>>>0 ubyte 0xEB DOS/MBR boot sector
>>>>>>1 ubyte x \b, code offset 0x%x+2
>>>>>0 ubyte 0xE9
>>>>>>1 uleshort x \b, code offset 0x%x+3
@@ -1913,16 +1918,7 @@
# defect IO.SYS+MSDOS.SYS ?
#>>>>>0x162 use 2xDOS-filename
-# CDROM Filesystems
-# https://en.wikipedia.org/wiki/ISO_9660
-# Modified for UDF by [email protected]
-32769 string CD001
-# mime line at that position does not work
-# 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)
-# does not work
-#!:strength +33
+0 name cdrom
>38913 string !NSR0 ISO 9660 CD-ROM filesystem data
!:mime application/x-iso9660-image
>38913 string NSR0 UDF filesystem data
@@ -1939,6 +1935,18 @@
!:mime application/x-iso9660-image
32777 string CDROM High Sierra CD-ROM filesystem data
+# CDROM Filesystems
+# https://en.wikipedia.org/wiki/ISO_9660
+# Modified for UDF by [email protected]
+32769 string CD001
+# mime line at that position does not work
+# 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)
+# does not work
+#!:strength +33
+>0 use cdrom
+
# .cso files
0 string CISO Compressed ISO CD image
@@ -2121,6 +2129,7 @@
#----------------------------------------------------------
#delta ISO Daniel Novotny ([email protected])
0 string DISO Delta ISO data
+!:strength +50
>4 belong x version %d
# VMS backup savesets - [email protected]
Index: src/external/bsd/file/dist/magic/magdir/pgp
diff -u src/external/bsd/file/dist/magic/magdir/pgp:1.2 src/external/bsd/file/dist/magic/magdir/pgp:1.3
--- src/external/bsd/file/dist/magic/magdir/pgp:1.2 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/magic/magdir/pgp Fri Jan 2 16:15:32 2015
@@ -1,6 +1,6 @@
#------------------------------------------------------------------------------
-# $File: pgp,v 1.10 2014/10/14 16:50:37 christos Exp $
+# $File: pgp,v 1.11 2014/11/11 21:32:38 christos Exp $
# pgp: file(1) magic for Pretty Good Privacy
# see http://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
#
@@ -21,10 +21,64 @@
2 string ---BEGIN\ PGP\ PUBLIC\ KEY\ BLOCK- PGP public key block
!:mime application/pgp-keys
+>10 search/100 \n\n
+>>&0 use pgp
0 string -----BEGIN\040PGP\40MESSAGE- PGP message
!:mime application/pgp
+>10 search/100 \n\n
+>>&0 use pgp
0 string -----BEGIN\040PGP\40SIGNATURE- PGP signature
!:mime application/pgp-signature
+>10 search/100 \n\n
+>>&0 use pgp
+
+# Decode the type of the packet based on it's base64 encoding.
+# Idea from Mark Martinec
+# The specification is in RFC 4880, section 4.2 and 4.3:
+# http://tools.ietf.org/html/rfc4880#section-4.2
+
+0 name pgp
+>0 byte 0x67 Reserved (old)
+>0 byte 0x68 Public-Key Encrypted Session Key (old)
+>0 byte 0x69 Signature (old)
+>0 byte 0x6a Symmetric-Key Encrypted Session Key (old)
+>0 byte 0x6b One-Pass Signature (old)
+>0 byte 0x6c Secret-Key (old)
+>0 byte 0x6d Public-Key (old)
+>0 byte 0x6e Secret-Subkey (old)
+>0 byte 0x6f Compressed Data (old)
+>0 byte 0x70 Symmetrically Encrypted Data (old)
+>0 byte 0x71 Marker (old)
+>0 byte 0x72 Literal Data (old)
+>0 byte 0x73 Trust (old)
+>0 byte 0x74 User ID (old)
+>0 byte 0x75 Public-Subkey (old)
+>0 byte 0x76 Unused (old)
+>0 byte 0x77
+>>1 byte&0xc0 0x00 Reserved
+>>1 byte&0xc0 0x40 Public-Key Encrypted Session Key
+>>1 byte&0xc0 0x80 Signature
+>>1 byte&0xc0 0xc0 Symmetric-Key Encrypted Session Key
+>0 byte 0x78
+>>1 byte&0xc0 0x00 One-Pass Signature
+>>1 byte&0xc0 0x40 Secret-Key
+>>1 byte&0xc0 0x80 Public-Key
+>>1 byte&0xc0 0xc0 Secret-Subkey
+>0 byte 0x79
+>>1 byte&0xc0 0x00 Compressed Data
+>>1 byte&0xc0 0x40 Symmetrically Encrypted Data
+>>1 byte&0xc0 0x80 Marker
+>>1 byte&0xc0 0xc0 Literal Data
+>0 byte 0x7a
+>>1 byte&0xc0 0x00 Trust
+>>1 byte&0xc0 0x40 User ID
+>>1 byte&0xc0 0x80 Public-Subkey
+>>1 byte&0xc0 0xc0 Unused [z%x]
+>0 byte 0x30
+>>1 byte&0xc0 0x00 Unused [0%x]
+>>1 byte&0xc0 0x40 User Attribute
+>>1 byte&0xc0 0x80 Sym. Encrypted and Integrity Protected Data
+>>1 byte&0xc0 0xc0 Modification Detection Code
# magic signatures to detect PGP crypto material (from stef)
# detects and extracts metadata from:
Index: src/external/bsd/file/dist/src/Makefile.in
diff -u src/external/bsd/file/dist/src/Makefile.in:1.11 src/external/bsd/file/dist/src/Makefile.in:1.12
--- src/external/bsd/file/dist/src/Makefile.in:1.11 Mon Oct 20 18:04:31 2014
+++ src/external/bsd/file/dist/src/Makefile.in Fri Jan 2 16:15:32 2015
@@ -81,9 +81,9 @@ build_triplet = @build@
host_triplet = @host@
bin_PROGRAMS = file$(EXEEXT)
subdir = src
-DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am asprintf.c \
- pread.c strcasestr.c getline.c fmtcheck.c strlcat.c \
- asctime_r.c ctime_r.c vasprintf.c strlcpy.c getopt_long.c \
+DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am ctime_r.c \
+ vasprintf.c asctime_r.c asprintf.c strcasestr.c pread.c \
+ getline.c strlcpy.c strlcat.c fmtcheck.c getopt_long.c \
$(top_srcdir)/depcomp $(include_HEADERS)
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
Index: src/external/bsd/file/dist/src/readcdf.c
diff -u src/external/bsd/file/dist/src/readcdf.c:1.11 src/external/bsd/file/dist/src/readcdf.c:1.12
--- src/external/bsd/file/dist/src/readcdf.c:1.11 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/readcdf.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: readcdf.c,v 1.11 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: readcdf.c,v 1.12 2015/01/02 21:15:32 christos Exp $ */
+
/*-
* Copyright (c) 2008 Christos Zoulas
* All rights reserved.
@@ -28,9 +29,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: readcdf.c,v 1.48 2014/09/10 18:41:51 christos Exp $")
+FILE_RCSID("@(#)$File: readcdf.c,v 1.49 2014/12/04 15:56:46 christos Exp $")
#else
-__RCSID("$NetBSD: readcdf.c,v 1.11 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: readcdf.c,v 1.12 2015/01/02 21:15:32 christos Exp $");
#endif
#endif
@@ -81,7 +82,7 @@ static const struct cv {
const char *mime;
} clsid2mime[] = {
{
- { 0x00000000000c1084LLU, 0x46000000000000c0LLU },
+ { 0x00000000000c1084ULL, 0x46000000000000c0ULL },
"x-msi",
},
{ { 0, 0 },
@@ -89,7 +90,7 @@ static const struct cv {
},
}, clsid2desc[] = {
{
- { 0x00000000000c1084LLU, 0x46000000000000c0LLU },
+ { 0x00000000000c1084ULL, 0x46000000000000c0ULL },
"MSI Installer",
},
{ { 0, 0 },
@@ -343,11 +344,11 @@ private char *
format_clsid(char *buf, size_t len, const uint64_t uuid[2]) {
snprintf(buf, len, "%.8" PRIx64 "-%.4" PRIx64 "-%.4" PRIx64 "-%.4"
PRIx64 "-%.12" PRIx64,
- (uuid[0] >> 32) & (uint64_t)0x000000000ffffffffLLU,
- (uuid[0] >> 16) & (uint64_t)0x0000000000000ffffLLU,
- (uuid[0] >> 0) & (uint64_t)0x0000000000000ffffLLU,
- (uuid[1] >> 48) & (uint64_t)0x0000000000000ffffLLU,
- (uuid[1] >> 0) & (uint64_t)0x0000fffffffffffffLLU);
+ (uuid[0] >> 32) & (uint64_t)0x000000000ffffffffULL,
+ (uuid[0] >> 16) & (uint64_t)0x0000000000000ffffULL,
+ (uuid[0] >> 0) & (uint64_t)0x0000000000000ffffULL,
+ (uuid[1] >> 48) & (uint64_t)0x0000000000000ffffULL,
+ (uuid[1] >> 0) & (uint64_t)0x0000fffffffffffffULL);
return buf;
}
#endif
@@ -364,6 +365,7 @@ file_trycdf(struct magic_set *ms, int fd
int i;
const char *expn = "";
const char *corrupt = "corrupt: ";
+ const cdf_directory_t *root_storage;
info.i_fd = fd;
info.i_buf = buf;
@@ -397,7 +399,6 @@ file_trycdf(struct magic_set *ms, int fd
goto out2;
}
- const cdf_directory_t *root_storage;
if ((i = cdf_read_short_stream(&info, &h, &sat, &dir, &sst,
&root_storage)) == -1) {
expn = "Cannot read short stream";
Index: src/external/bsd/file/dist/src/apprentice.c
diff -u src/external/bsd/file/dist/src/apprentice.c:1.13 src/external/bsd/file/dist/src/apprentice.c:1.14
--- src/external/bsd/file/dist/src/apprentice.c:1.13 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/src/apprentice.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: apprentice.c,v 1.13 2014/10/20 21:48:57 christos Exp $ */
+/* $NetBSD: apprentice.c,v 1.14 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -34,9 +35,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: apprentice.c,v 1.217 2014/10/15 12:39:21 christos Exp $")
+FILE_RCSID("@(#)$File: apprentice.c,v 1.229 2015/01/01 17:07:34 christos Exp $")
#else
-__RCSID("$NetBSD: apprentice.c,v 1.13 2014/10/20 21:48:57 christos Exp $");
+__RCSID("$NetBSD: apprentice.c,v 1.14 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -409,10 +410,11 @@ add_mlist(struct mlist *mlp, struct magi
{
struct mlist *ml;
+ mlp->map = idx == 0 ? map : NULL;
if ((ml = CAST(struct mlist *, malloc(sizeof(*ml)))) == NULL)
return -1;
- ml->map = idx == 0 ? map : NULL;
+ ml->map = NULL;
ml->magic = map->magic[idx];
ml->nmagic = map->nmagic[idx];
@@ -462,8 +464,7 @@ apprentice_1(struct magic_set *ms, const
for (i = 0; i < MAGIC_SETS; i++) {
if (add_mlist(ms->mlist[i], map, i) == -1) {
file_oomem(ms, sizeof(*ml));
- apprentice_unmap(map);
- return -1;
+ goto fail;
}
}
@@ -476,8 +477,16 @@ apprentice_1(struct magic_set *ms, const
apprentice_list(ms->mlist[i], TEXTTEST);
}
}
-#endif /* COMPILE_ONLY */
return 0;
+fail:
+ for (i = 0; i < MAGIC_SETS; i++) {
+ mlist_free(ms->mlist[i]);
+ ms->mlist[i] = NULL;
+ }
+ return -1;
+#else
+ return 0;
+#endif /* COMPILE_ONLY */
}
protected void
@@ -521,6 +530,11 @@ file_ms_alloc(int flags)
ms->mlist[i] = NULL;
ms->file = "unknown";
ms->line = 0;
+ ms->indir_max = FILE_INDIR_MAX;
+ ms->name_max = FILE_NAME_MAX;
+ ms->elf_shnum_max = FILE_ELF_SHNUM_MAX;
+ ms->elf_phnum_max = FILE_ELF_PHNUM_MAX;
+ ms->elf_notes_max = FILE_ELF_NOTES_MAX;
return ms;
free:
free(ms);
@@ -532,17 +546,21 @@ apprentice_unmap(struct magic_map *map)
{
if (map == NULL)
return;
- if (map->p != NULL && map->type != MAP_TYPE_USER) {
+
+ switch (map->type) {
#ifdef QUICK
- if (map->type == MAP_TYPE_MMAP)
+ case MAP_TYPE_MMAP:
+ if (map->p)
(void)munmap(map->p, map->len);
- else
+ break;
#endif
+ case MAP_TYPE_MALLOC:
free(map->p);
- } else {
- uint32_t j;
- for (j = 0; j < MAGIC_SETS; j++)
- free(map->magic[j]);
+ break;
+ case MAP_TYPE_USER:
+ break;
+ default:
+ abort();
}
free(map);
}
@@ -561,19 +579,19 @@ mlist_alloc(void)
private void
mlist_free(struct mlist *mlist)
{
- struct mlist *ml;
+ struct mlist *ml, *next;
if (mlist == NULL)
return;
- for (ml = mlist->next; ml != mlist;) {
- struct mlist *next = ml->next;
+ ml = mlist->next;
+ for (ml = mlist->next; (next = ml->next) != NULL; ml = next) {
if (ml->map)
apprentice_unmap(ml->map);
free(ml);
- ml = next;
+ if (ml == mlist)
+ break;
}
- free(ml);
}
#ifndef COMPILE_ONLY
@@ -582,7 +600,7 @@ protected int
buffer_apprentice(struct magic_set *ms, struct magic **bufs,
size_t *sizes, size_t nbufs)
{
- size_t i;
+ size_t i, j;
struct mlist *ml;
struct magic_map *map;
@@ -598,31 +616,30 @@ buffer_apprentice(struct magic_set *ms,
mlist_free(ms->mlist[i]);
if ((ms->mlist[i] = mlist_alloc()) == NULL) {
file_oomem(ms, sizeof(*ms->mlist[i]));
- if (i != 0) {
- --i;
- do
- mlist_free(ms->mlist[i]);
- while (i != 0);
- }
- return -1;
+ goto fail;
}
}
for (i = 0; i < nbufs; i++) {
map = apprentice_buf(ms, bufs[i], sizes[i]);
if (map == NULL)
- return -1;
+ goto fail;
- for (i = 0; i < MAGIC_SETS; i++) {
- if (add_mlist(ms->mlist[i], map, i) == -1) {
+ for (j = 0; j < MAGIC_SETS; j++) {
+ if (add_mlist(ms->mlist[j], map, j) == -1) {
file_oomem(ms, sizeof(*ml));
- apprentice_unmap(map);
- return -1;
+ goto fail;
}
}
}
return 0;
+fail:
+ for (i = 0; i < MAGIC_SETS; i++) {
+ mlist_free(ms->mlist[i]);
+ ms->mlist[i] = NULL;
+ }
+ return -1;
}
#endif
@@ -651,11 +668,9 @@ file_apprentice(struct magic_set *ms, co
mlist_free(ms->mlist[i]);
if ((ms->mlist[i] = mlist_alloc()) == NULL) {
file_oomem(ms, sizeof(*ms->mlist[i]));
- if (i != 0) {
- --i;
- do
- mlist_free(ms->mlist[i]);
- while (i != 0);
+ while (i-- > 0) {
+ mlist_free(ms->mlist[i]);
+ ms->mlist[i] = NULL;
}
free(mfn);
return -1;
@@ -1596,6 +1611,145 @@ check_cond(struct magic_set *ms, int con
}
#endif /* ENABLE_CONDITIONALS */
+private int
+parse_indirect_modifier(struct magic_set *ms, struct magic *m, const char **lp)
+{
+ const char *l = *lp;
+
+ while (!isspace((unsigned char)*++l))
+ switch (*l) {
+ case CHAR_INDIRECT_RELATIVE:
+ m->str_flags |= INDIRECT_RELATIVE;
+ break;
+ default:
+ if (ms->flags & MAGIC_CHECK)
+ file_magwarn(ms, "indirect modifier `%c' "
+ "invalid", *l);
+ *lp = l;
+ return -1;
+ }
+ *lp = l;
+ return 0;
+}
+
+private void
+parse_op_modifier(struct magic_set *ms, struct magic *m, const char **lp,
+ int op)
+{
+ const char *l = *lp;
+ char *t;
+ uint64_t val;
+
+ ++l;
+ m->mask_op |= op;
+ val = (uint64_t)strtoull(l, &t, 0);
+ l = t;
+ m->num_mask = file_signextend(ms, m, val);
+ eatsize(&l);
+ *lp = l;
+}
+
+private int
+parse_string_modifier(struct magic_set *ms, struct magic *m, const char **lp)
+{
+ const char *l = *lp;
+ char *t;
+ int have_range = 0;
+
+ while (!isspace((unsigned char)*++l)) {
+ switch (*l) {
+ case '0': case '1': case '2':
+ case '3': case '4': case '5':
+ case '6': case '7': case '8':
+ case '9':
+ if (have_range && (ms->flags & MAGIC_CHECK))
+ file_magwarn(ms, "multiple ranges");
+ have_range = 1;
+ m->str_range = CAST(uint32_t, strtoul(l, &t, 0));
+ if (m->str_range == 0)
+ file_magwarn(ms, "zero range");
+ l = t - 1;
+ break;
+ case CHAR_COMPACT_WHITESPACE:
+ m->str_flags |= STRING_COMPACT_WHITESPACE;
+ break;
+ case CHAR_COMPACT_OPTIONAL_WHITESPACE:
+ m->str_flags |= STRING_COMPACT_OPTIONAL_WHITESPACE;
+ break;
+ case CHAR_IGNORE_LOWERCASE:
+ m->str_flags |= STRING_IGNORE_LOWERCASE;
+ break;
+ case CHAR_IGNORE_UPPERCASE:
+ m->str_flags |= STRING_IGNORE_UPPERCASE;
+ break;
+ case CHAR_REGEX_OFFSET_START:
+ m->str_flags |= REGEX_OFFSET_START;
+ break;
+ case CHAR_BINTEST:
+ m->str_flags |= STRING_BINTEST;
+ break;
+ case CHAR_TEXTTEST:
+ m->str_flags |= STRING_TEXTTEST;
+ break;
+ case CHAR_TRIM:
+ m->str_flags |= STRING_TRIM;
+ break;
+ case CHAR_PSTRING_1_LE:
+#define SET_LENGTH(a) m->str_flags = (m->str_flags & ~PSTRING_LEN) | (a)
+ if (m->type != FILE_PSTRING)
+ goto bad;
+ SET_LENGTH(PSTRING_1_LE);
+ break;
+ case CHAR_PSTRING_2_BE:
+ if (m->type != FILE_PSTRING)
+ goto bad;
+ SET_LENGTH(PSTRING_2_BE);
+ break;
+ case CHAR_PSTRING_2_LE:
+ if (m->type != FILE_PSTRING)
+ goto bad;
+ SET_LENGTH(PSTRING_2_LE);
+ break;
+ case CHAR_PSTRING_4_BE:
+ if (m->type != FILE_PSTRING)
+ goto bad;
+ SET_LENGTH(PSTRING_4_BE);
+ break;
+ case CHAR_PSTRING_4_LE:
+ switch (m->type) {
+ case FILE_PSTRING:
+ case FILE_REGEX:
+ break;
+ default:
+ goto bad;
+ }
+ SET_LENGTH(PSTRING_4_LE);
+ break;
+ case CHAR_PSTRING_LENGTH_INCLUDES_ITSELF:
+ if (m->type != FILE_PSTRING)
+ goto bad;
+ m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF;
+ break;
+ default:
+ bad:
+ if (ms->flags & MAGIC_CHECK)
+ file_magwarn(ms, "string modifier `%c' "
+ "invalid", *l);
+ goto out;
+ }
+ /* allow multiple '/' for readability */
+ if (l[1] == '/' && !isspace((unsigned char)l[2]))
+ l++;
+ }
+ if (string_modifier_check(ms, m) == -1)
+ goto out;
+ *lp = l;
+ return 0;
+out:
+ *lp = l;
+ return -1;
+}
+
/*
* parse one line from magic file, put into magic[index++] if valid
*/
@@ -1865,118 +2019,27 @@ parse(struct magic_set *ms, struct magic
m->str_range = 0;
m->str_flags = m->type == FILE_PSTRING ? PSTRING_1_LE : 0;
if ((op = get_op(*l)) != -1) {
- if (!IS_STRING(m->type)) {
- uint64_t val;
- ++l;
- m->mask_op |= op;
- val = (uint64_t)strtoull(l, &t, 0);
- l = t;
- m->num_mask = file_signextend(ms, m, val);
- eatsize(&l);
- }
- else if (op == FILE_OPDIVIDE) {
- int have_range = 0;
- while (!isspace((unsigned char)*++l)) {
- switch (*l) {
- case '0': case '1': case '2':
- case '3': case '4': case '5':
- case '6': case '7': case '8':
- case '9':
- if (have_range &&
- (ms->flags & MAGIC_CHECK))
- file_magwarn(ms,
- "multiple ranges");
- have_range = 1;
- m->str_range = CAST(uint32_t,
- strtoul(l, &t, 0));
- if (m->str_range == 0)
- file_magwarn(ms,
- "zero range");
- l = t - 1;
- break;
- case CHAR_COMPACT_WHITESPACE:
- m->str_flags |=
- STRING_COMPACT_WHITESPACE;
- break;
- case CHAR_COMPACT_OPTIONAL_WHITESPACE:
- m->str_flags |=
- STRING_COMPACT_OPTIONAL_WHITESPACE;
- break;
- case CHAR_IGNORE_LOWERCASE:
- m->str_flags |= STRING_IGNORE_LOWERCASE;
- break;
- case CHAR_IGNORE_UPPERCASE:
- m->str_flags |= STRING_IGNORE_UPPERCASE;
- break;
- case CHAR_REGEX_OFFSET_START:
- m->str_flags |= REGEX_OFFSET_START;
- break;
- case CHAR_BINTEST:
- m->str_flags |= STRING_BINTEST;
- break;
- case CHAR_TEXTTEST:
- m->str_flags |= STRING_TEXTTEST;
- break;
- case CHAR_TRIM:
- m->str_flags |= STRING_TRIM;
- break;
- case CHAR_PSTRING_1_LE:
- if (m->type != FILE_PSTRING)
- goto bad;
- m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_1_LE;
- break;
- case CHAR_PSTRING_2_BE:
- if (m->type != FILE_PSTRING)
- goto bad;
- m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_2_BE;
- break;
- case CHAR_PSTRING_2_LE:
- if (m->type != FILE_PSTRING)
- goto bad;
- m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_2_LE;
- break;
- case CHAR_PSTRING_4_BE:
- if (m->type != FILE_PSTRING)
- goto bad;
- m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_4_BE;
- break;
- case CHAR_PSTRING_4_LE:
- switch (m->type) {
- case FILE_PSTRING:
- case FILE_REGEX:
- break;
- default:
- goto bad;
- }
- m->str_flags = (m->str_flags & ~PSTRING_LEN) | PSTRING_4_LE;
- break;
- case CHAR_PSTRING_LENGTH_INCLUDES_ITSELF:
- if (m->type != FILE_PSTRING)
- goto bad;
- m->str_flags |= PSTRING_LENGTH_INCLUDES_ITSELF;
- break;
- default:
- bad:
- if (ms->flags & MAGIC_CHECK)
- file_magwarn(ms,
- "string extension `%c' "
- "invalid", *l);
- return -1;
- }
- /* allow multiple '/' for readability */
- if (l[1] == '/' &&
- !isspace((unsigned char)l[2]))
- l++;
+ if (IS_STRING(m->type)) {
+ int r;
+
+ if (op != FILE_OPDIVIDE) {
+ if (ms->flags & MAGIC_CHECK)
+ file_magwarn(ms,
+ "invalid string/indirect op: "
+ "`%c'", *t);
+ return -1;
}
- if (string_modifier_check(ms, m) == -1)
+
+ if (m->type == FILE_INDIRECT)
+ r = parse_indirect_modifier(ms, m, &l);
+ else
+ r = parse_string_modifier(ms, m, &l);
+ if (r == -1)
return -1;
- }
- else {
- if (ms->flags & MAGIC_CHECK)
- file_magwarn(ms, "invalid string op: %c", *t);
- return -1;
- }
+ } else
+ parse_op_modifier(ms, m, &l, op);
}
+
/*
* We used to set mask to all 1's here, instead let's just not do
* anything if mask = 0 (unless you have a better idea)
@@ -2142,7 +2205,7 @@ parse_extra(struct magic_set *ms, struct
size_t i;
const char *l = line;
struct magic *m = &me->mp[me->cont_count == 0 ? 0 : me->cont_count - 1];
- char *buf = (char *)m + off;
+ char *buf = CAST(char *, CAST(void *, m)) + off;
if (buf[0] != '\0') {
len = nt ? strlen(buf) : len;
@@ -2191,7 +2254,8 @@ parse_apple(struct magic_set *ms, struct
{
struct magic *m = &me->mp[0];
- return parse_extra(ms, me, line, offsetof(struct magic, apple),
+ return parse_extra(ms, me, line,
+ CAST(off_t, offsetof(struct magic, apple)),
sizeof(m->apple), "APPLE", "!+-./", 0);
}
@@ -2204,7 +2268,8 @@ parse_mime(struct magic_set *ms, struct
{
struct magic *m = &me->mp[0];
- return parse_extra(ms, me, line, offsetof(struct magic, mimetype),
+ return parse_extra(ms, me, line,
+ CAST(off_t, offsetof(struct magic, mimetype)),
sizeof(m->mimetype), "MIME", "+-/.", 1);
}
@@ -2766,7 +2831,7 @@ eatsize(const char **p)
}
/*
- * handle a buffer containging a compiled file.
+ * handle a buffer containing a compiled file.
*/
private struct magic_map *
apprentice_buf(struct magic_set *ms, struct magic *buf, size_t len)
Index: src/external/bsd/file/dist/src/file.h
diff -u src/external/bsd/file/dist/src/file.h:1.13 src/external/bsd/file/dist/src/file.h:1.14
--- src/external/bsd/file/dist/src/file.h:1.13 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/src/file.h Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: file.h,v 1.13 2014/10/20 21:48:57 christos Exp $ */
+/* $NetBSD: file.h,v 1.14 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -28,7 +29,7 @@
*/
/*
* file.h - definitions for file(1) program
- * @(#)$File: file.h,v 1.155 2014/10/11 15:03:16 christos Exp $
+ * @(#)$File: file.h,v 1.164 2015/01/01 17:07:34 christos Exp $
*/
#ifndef __file_h__
@@ -65,7 +66,9 @@
#include <regex.h>
#include <time.h>
#include <sys/types.h>
+#ifndef WIN32
#include <sys/param.h>
+#endif
/* Do this here and now, because struct stat gets re-defined on solaris */
#include <sys/stat.h>
#include <stdarg.h>
@@ -233,6 +236,7 @@ struct magic {
(t) == FILE_LESTRING16 || \
(t) == FILE_REGEX || \
(t) == FILE_SEARCH || \
+ (t) == FILE_INDIRECT || \
(t) == FILE_NAME || \
(t) == FILE_USE)
@@ -345,6 +349,8 @@ struct magic {
#define STRING_IGNORE_CASE (STRING_IGNORE_LOWERCASE|STRING_IGNORE_UPPERCASE)
#define STRING_DEFAULT_RANGE 100
+#define INDIRECT_RELATIVE BIT(0)
+#define CHAR_INDIRECT_RELATIVE 'r'
/* list of magic entries */
struct mlist {
@@ -402,6 +408,16 @@ struct magic_set {
/* FIXME: Make the string dynamically allocated so that e.g.
strings matched in files can be longer than MAXstring */
union VALUETYPE ms_value; /* either number or string */
+ uint16_t indir_max;
+ uint16_t name_max;
+ uint16_t elf_shnum_max;
+ uint16_t elf_phnum_max;
+ uint16_t elf_notes_max;
+#define FILE_INDIR_MAX 15
+#define FILE_NAME_MAX 30
+#define FILE_ELF_SHNUM_MAX 32768
+#define FILE_ELF_PHNUM_MAX 128
+#define FILE_ELF_NOTES_MAX 256
};
/* Type for Unicode characters */
@@ -441,7 +457,7 @@ protected int file_encoding(struct magic
unichar **, size_t *, const char **, const char **, const char **);
protected int file_is_tar(struct magic_set *, const unsigned char *, size_t);
protected int file_softmagic(struct magic_set *, const unsigned char *, size_t,
- size_t, int, int);
+ uint16_t, uint16_t *, int, int);
protected int file_apprentice(struct magic_set *, const char *, int);
protected int buffer_apprentice(struct magic_set *, struct magic **,
size_t *, size_t);
@@ -467,6 +483,7 @@ protected int file_looks_utf8(const unsi
size_t *);
protected size_t file_pstring_length_size(const struct magic *);
protected size_t file_pstring_get_length(const struct magic *, const char *);
+protected char * file_printable(char *, size_t, const char *);
#ifdef __EMX__
protected int file_os2_apptype(struct magic_set *, const char *, const void *,
size_t);
@@ -496,6 +513,14 @@ protected int file_regexec(file_regex_t
protected void file_regfree(file_regex_t *);
protected void file_regerror(file_regex_t *, int, struct magic_set *);
+typedef struct {
+ char *buf;
+ uint32_t offset;
+} file_pushbuf_t;
+
+protected file_pushbuf_t *file_push_buffer(struct magic_set *);
+protected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
+
#ifndef COMPILE_ONLY
extern const char *file_names[];
extern const size_t file_nnames;
Index: src/external/bsd/file/dist/src/cdf.c
diff -u src/external/bsd/file/dist/src/cdf.c:1.10 src/external/bsd/file/dist/src/cdf.c:1.11
--- src/external/bsd/file/dist/src/cdf.c:1.10 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/cdf.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: cdf.c,v 1.10 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: cdf.c,v 1.11 2015/01/02 21:15:32 christos Exp $ */
+
/*-
* Copyright (c) 2008 Christos Zoulas
* All rights reserved.
@@ -37,9 +38,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: cdf.c,v 1.67 2014/09/24 19:49:07 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.69 2014/12/04 15:56:46 christos Exp $")
#else
-__RCSID("$NetBSD: cdf.c,v 1.10 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: cdf.c,v 1.11 2015/01/02 21:15:32 christos Exp $");
#endif
#endif
@@ -78,8 +79,11 @@ static union {
#define CDF_TOLE8(x) ((uint64_t)(NEED_SWAP ? _cdf_tole8(x) : (uint64_t)(x)))
#define CDF_TOLE4(x) ((uint32_t)(NEED_SWAP ? _cdf_tole4(x) : (uint32_t)(x)))
#define CDF_TOLE2(x) ((uint16_t)(NEED_SWAP ? _cdf_tole2(x) : (uint16_t)(x)))
-#define CDF_TOLE(x) (sizeof(x) == 2 ? CDF_TOLE2(x) : (sizeof(x) == 4 ? \
- CDF_TOLE4(x) : CDF_TOLE8(x)))
+#define CDF_TOLE(x) (/*CONSTCOND*/sizeof(x) == 2 ? \
+ CDF_TOLE2(CAST(uint16_t, x)) : \
+ (/*CONSTCOND*/sizeof(x) == 4 ? \
+ CDF_TOLE4(CAST(uint32_t, x)) : \
+ CDF_TOLE8(CAST(uint64_t, x))))
#define CDF_GETUINT32(x, y) cdf_getuint32(x, y)
@@ -276,7 +280,7 @@ cdf_check_stream_offset(const cdf_stream
const char *e = ((const char *)p) + tail;
size_t ss = sst->sst_dirlen < h->h_min_size_standard_stream ?
CDF_SHORT_SEC_SIZE(h) : CDF_SEC_SIZE(h);
- (void)&line;
+ /*LINTED*/(void)&line;
if (e >= b && (size_t)(e - b) <= ss * sst->sst_len)
return 0;
DPRINTF(("%d: offset begin %p < end %p || %" SIZE_T_FORMAT "u"
@@ -468,6 +472,12 @@ cdf_count_chain(const cdf_sat_t *sat, cd
/ sizeof(maxsector));
DPRINTF(("Chain:"));
+ if (sid == CDF_SECID_END_OF_CHAIN) {
+ /* 0-length chain. */
+ DPRINTF((" empty\n"));
+ return 0;
+ }
+
for (j = i = 0; sid >= 0; i++, j++) {
DPRINTF((" %d", sid));
if (j >= CDF_LOOP_LIMIT) {
@@ -824,10 +834,11 @@ cdf_read_property_info(const cdf_stream_
goto out;
for (i = 0; i < sh.sh_properties; i++) {
size_t tail = (i << 1) + 1;
+ size_t ofs;
if (cdf_check_stream_offset(sst, h, p, tail * sizeof(uint32_t),
__LINE__) == -1)
goto out;
- size_t ofs = CDF_GETUINT32(p, tail);
+ ofs = CDF_GETUINT32(p, tail);
q = (const uint8_t *)(const void *)
((const char *)(const void *)p + ofs
- 2 * sizeof(uint32_t));
@@ -996,9 +1007,9 @@ cdf_unpack_summary_info(const cdf_stream
}
-#define extract_catalog_field(f, l) \
+#define extract_catalog_field(t, f, l) \
memcpy(&ce[i].f, b + (l), sizeof(ce[i].f)); \
- ce[i].f = CDF_TOLE(ce[i].f)
+ ce[i].f = CAST(t, CDF_TOLE(ce[i].f))
int
cdf_unpack_catalog(const cdf_header_t *h, const cdf_stream_t *sst,
@@ -1026,18 +1037,17 @@ cdf_unpack_catalog(const cdf_header_t *h
ce = (*cat)->cat_e;
b = CAST(const char *, sst->sst_tab);
for (i = 0; i < nr; i++) {
- extract_catalog_field(ce_namlen, 0);
- extract_catalog_field(ce_num, 2);
- extract_catalog_field(ce_timestamp, 6);
+ extract_catalog_field(uint16_t, ce_namlen, 0);
+ extract_catalog_field(uint16_t, ce_num, 2);
+ extract_catalog_field(uint64_t, ce_timestamp, 6);
reclen = ce[i].ce_namlen;
ce[i].ce_namlen =
sizeof(ce[i].ce_name) / sizeof(ce[i].ce_name[0]) - 1;
if (ce[i].ce_namlen > reclen - 14)
ce[i].ce_namlen = reclen - 14;
- np = CAST(const uint16_t *, (b + 16));
+ np = CAST(const uint16_t *, CAST(const void *, (b + 16)));
for (k = 0; k < ce[i].ce_namlen; k++) {
- ce[i].ce_name[k] = np[k];
- CDF_TOLE2(ce[i].ce_name[k]);
+ ce[i].ce_name[k] = np[k]; /* XXX: CDF_TOLE2? */
}
ce[i].ce_name[ce[i].ce_namlen] = 0;
b += reclen;
Index: src/external/bsd/file/dist/src/fsmagic.c
diff -u src/external/bsd/file/dist/src/fsmagic.c:1.10 src/external/bsd/file/dist/src/fsmagic.c:1.11
--- src/external/bsd/file/dist/src/fsmagic.c:1.10 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/src/fsmagic.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: fsmagic.c,v 1.10 2014/10/20 21:48:57 christos Exp $ */
+/* $NetBSD: fsmagic.c,v 1.11 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -34,9 +35,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: fsmagic.c,v 1.74 2014/10/13 20:21:49 christos Exp $")
+FILE_RCSID("@(#)$File: fsmagic.c,v 1.75 2014/12/04 15:56:46 christos Exp $")
#else
-__RCSID("$NetBSD: fsmagic.c,v 1.10 2014/10/20 21:48:57 christos Exp $");
+__RCSID("$NetBSD: fsmagic.c,v 1.11 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -134,7 +135,7 @@ file_fsmagic(struct magic_set *ms, const
#ifdef WIN32
{
- HANDLE hFile = CreateFile(fn, 0, FILE_SHARE_DELETE |
+ HANDLE hFile = CreateFile((LPCSTR)fn, 0, FILE_SHARE_DELETE |
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0,
NULL);
if (hFile != INVALID_HANDLE_VALUE) {
Index: src/external/bsd/file/dist/src/readelf.c
diff -u src/external/bsd/file/dist/src/readelf.c:1.10 src/external/bsd/file/dist/src/readelf.c:1.11
--- src/external/bsd/file/dist/src/readelf.c:1.10 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/src/readelf.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: readelf.c,v 1.10 2014/10/20 21:48:57 christos Exp $ */
+/* $NetBSD: readelf.c,v 1.11 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Christos Zoulas 2003.
* All Rights Reserved.
@@ -29,9 +30,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: readelf.c,v 1.104 2014/10/17 15:49:00 christos Exp $")
+FILE_RCSID("@(#)$File: readelf.c,v 1.117 2014/12/16 23:29:42 christos Exp $")
#else
-__RCSID("$NetBSD: readelf.c,v 1.10 2014/10/20 21:48:57 christos Exp $");
+__RCSID("$NetBSD: readelf.c,v 1.11 2015/01/02 21:15:32 christos Exp $");
#endif
#endif
@@ -48,14 +49,14 @@ __RCSID("$NetBSD: readelf.c,v 1.10 2014/
#ifdef ELFCORE
private int dophn_core(struct magic_set *, int, int, int, off_t, int, size_t,
- off_t, int *);
+ off_t, int *, uint16_t *);
#endif
private int dophn_exec(struct magic_set *, int, int, int, off_t, int, size_t,
- off_t, int *, int);
+ off_t, int, int *, uint16_t *);
private int doshn(struct magic_set *, int, int, int, off_t, int, size_t,
- off_t, int *, int, int);
+ off_t, int, int, int *, uint16_t *);
private size_t donote(struct magic_set *, void *, size_t, size_t, int,
- int, size_t, int *);
+ int, size_t, int *, uint16_t *);
#define ELF_ALIGN(a) ((((a) + align - 1) / align) * align)
@@ -65,6 +66,19 @@ private uint16_t getu16(int, uint16_t);
private uint32_t getu32(int, uint32_t);
private uint64_t getu64(int, uint64_t);
+#define MAX_PHNUM 128
+#define MAX_SHNUM 32768
+#define SIZE_UNKNOWN ((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)
+ return -1;
+ return 0;
+}
+
private uint16_t
getu16(int swap, uint16_t value)
{
@@ -285,15 +299,19 @@ private const char os_style_names[][8] =
"NetBSD",
};
-#define FLAGS_DID_CORE 0x01
-#define FLAGS_DID_NOTE 0x02
-#define FLAGS_DID_BUILD_ID 0x04
-#define FLAGS_DID_CORE_STYLE 0x08
-#define FLAGS_IS_CORE 0x10
+#define FLAGS_DID_CORE 0x001
+#define FLAGS_DID_OS_NOTE 0x002
+#define FLAGS_DID_BUILD_ID 0x004
+#define FLAGS_DID_CORE_STYLE 0x008
+#define FLAGS_DID_NETBSD_PAX 0x010
+#define FLAGS_DID_NETBSD_MARCH 0x020
+#define FLAGS_DID_NETBSD_CMODEL 0x040
+#define FLAGS_DID_NETBSD_UNKNOWN 0x080
+#define FLAGS_IS_CORE 0x100
private int
dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- int num, size_t size, off_t fsize, int *flags)
+ int num, size_t size, off_t fsize, int *flags, uint16_t *notecount)
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
@@ -311,13 +329,13 @@ dophn_core(struct magic_set *ms, int cla
* Loop through all the program headers.
*/
for ( ; num; num--) {
- if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
+ if (pread(fd, xph_addr, xph_sizeof, off) < (ssize_t)xph_sizeof) {
file_badread(ms);
return -1;
}
off += size;
- if (xph_offset > fsize) {
+ if (fsize != SIZE_UNKNOWN && xph_offset > fsize) {
/* Perhaps warn here */
continue;
}
@@ -339,7 +357,7 @@ dophn_core(struct magic_set *ms, int cla
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset, (size_t)bufsize,
- clazz, swap, 4, flags);
+ clazz, swap, 4, flags, notecount);
if (offset == 0)
break;
@@ -469,132 +487,128 @@ do_note_freebsd_version(struct magic_set
}
}
-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)
+private int
+/*ARGSUSED*/
+do_bid_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
+ int swap __attribute__((__unused__)), uint32_t namesz, uint32_t descsz,
+ size_t noff, size_t doff, int *flags)
{
- Elf32_Nhdr nh32 = { 0, 0, 0 };
- Elf64_Nhdr nh64 = { 0, 0, 0 };
- size_t noff, doff;
-#ifdef ELFCORE
- int os_style = -1;
-#endif
- uint32_t namesz, descsz;
- unsigned char *nbuf = CAST(unsigned char *, vbuf);
-
- if (xnh_sizeof + offset > size) {
- /*
- * We're out of note headers.
- */
- return xnh_sizeof + offset;
- }
-
- (void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
- offset += xnh_sizeof;
-
- namesz = xnh_namesz;
- descsz = xnh_descsz;
- if ((namesz == 0) && (descsz == 0)) {
- /*
- * We're out of note headers.
- */
- return (offset >= size) ? offset : size;
- }
-
- if (namesz & 0x80000000) {
- (void)file_printf(ms, ", bad note name size 0x%lx",
- (unsigned long)namesz);
- return offset;
- }
-
- if (descsz & 0x80000000) {
- (void)file_printf(ms, ", bad note description size 0x%lx",
- (unsigned long)descsz);
- return offset;
- }
-
-
- noff = offset;
- doff = ELF_ALIGN(offset + namesz);
-
- if (offset + namesz > size) {
- /*
- * We're past the end of the buffer.
- */
- return doff;
- }
-
- offset = ELF_ALIGN(doff + descsz);
- if (doff + descsz > size) {
- /*
- * We're past the end of the buffer.
- */
- return (offset >= size) ? offset : size;
+ if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
+ type == NT_GNU_BUILD_ID && (descsz == 16 || descsz == 20)) {
+ uint8_t desc[20];
+ uint32_t i;
+ *flags |= FLAGS_DID_BUILD_ID;
+ if (file_printf(ms, ", BuildID[%s]=", descsz == 16 ? "md5/uuid" :
+ "sha1") == -1)
+ return 1;
+ (void)memcpy(desc, &nbuf[doff], descsz);
+ for (i = 0; i < descsz; i++)
+ if (file_printf(ms, "%02x", desc[i]) == -1)
+ return 1;
+ return 1;
}
+ return 0;
+}
- if ((*flags & (FLAGS_DID_NOTE|FLAGS_DID_BUILD_ID)) ==
- (FLAGS_DID_NOTE|FLAGS_DID_BUILD_ID))
- goto core;
-
+private int
+do_os_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
+ int swap, uint32_t namesz, uint32_t descsz,
+ size_t noff, size_t doff, int *flags)
+{
if (namesz == 5 && strcmp((char *)&nbuf[noff], "SuSE") == 0 &&
- xnh_type == NT_GNU_VERSION && descsz == 2) {
+ type == NT_GNU_VERSION && descsz == 2) {
+ *flags |= FLAGS_DID_OS_NOTE;
file_printf(ms, ", for SuSE %d.%d", nbuf[doff], nbuf[doff + 1]);
+ return 1;
}
+
if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
- xnh_type == NT_GNU_VERSION && descsz == 16) {
+ type == NT_GNU_VERSION && descsz == 16) {
uint32_t desc[4];
(void)memcpy(desc, &nbuf[doff], sizeof(desc));
+ *flags |= FLAGS_DID_OS_NOTE;
if (file_printf(ms, ", for GNU/") == -1)
- return size;
+ return 1;
switch (elf_getu32(swap, desc[0])) {
case GNU_OS_LINUX:
if (file_printf(ms, "Linux") == -1)
- return size;
+ return 1;
break;
case GNU_OS_HURD:
if (file_printf(ms, "Hurd") == -1)
- return size;
+ return 1;
break;
case GNU_OS_SOLARIS:
if (file_printf(ms, "Solaris") == -1)
- return size;
+ return 1;
break;
case GNU_OS_KFREEBSD:
if (file_printf(ms, "kFreeBSD") == -1)
- return size;
+ return 1;
break;
case GNU_OS_KNETBSD:
if (file_printf(ms, "kNetBSD") == -1)
- return size;
+ return 1;
break;
default:
if (file_printf(ms, "<unknown>") == -1)
- return size;
+ return 1;
}
if (file_printf(ms, " %d.%d.%d", elf_getu32(swap, desc[1]),
elf_getu32(swap, desc[2]), elf_getu32(swap, desc[3])) == -1)
- return size;
- *flags |= FLAGS_DID_NOTE;
- return size;
+ return 1;
+ return 1;
}
- if (namesz == 4 && strcmp((char *)&nbuf[noff], "GNU") == 0 &&
- xnh_type == NT_GNU_BUILD_ID && (descsz == 16 || descsz == 20)) {
- uint8_t desc[20];
- uint32_t i;
- if (file_printf(ms, ", BuildID[%s]=", descsz == 16 ? "md5/uuid" :
- "sha1") == -1)
- return size;
- (void)memcpy(desc, &nbuf[doff], descsz);
- for (i = 0; i < descsz; i++)
- if (file_printf(ms, "%02x", desc[i]) == -1)
- return size;
- *flags |= FLAGS_DID_BUILD_ID;
+ if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0) {
+ if (type == NT_NETBSD_VERSION && descsz == 4) {
+ *flags |= FLAGS_DID_OS_NOTE;
+ do_note_netbsd_version(ms, swap, &nbuf[doff]);
+ return 1;
+ }
}
+ if (namesz == 8 && strcmp((char *)&nbuf[noff], "FreeBSD") == 0) {
+ if (type == NT_FREEBSD_VERSION && descsz == 4) {
+ *flags |= FLAGS_DID_OS_NOTE;
+ do_note_freebsd_version(ms, swap, &nbuf[doff]);
+ return 1;
+ }
+ }
+
+ if (namesz == 8 && strcmp((char *)&nbuf[noff], "OpenBSD") == 0 &&
+ type == NT_OPENBSD_VERSION && descsz == 4) {
+ *flags |= FLAGS_DID_OS_NOTE;
+ if (file_printf(ms, ", for OpenBSD") == -1)
+ return 1;
+ /* Content of note is always 0 */
+ return 1;
+ }
+
+ if (namesz == 10 && strcmp((char *)&nbuf[noff], "DragonFly") == 0 &&
+ type == NT_DRAGONFLY_VERSION && descsz == 4) {
+ uint32_t desc;
+ *flags |= FLAGS_DID_OS_NOTE;
+ if (file_printf(ms, ", for DragonFly") == -1)
+ return 1;
+ (void)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)
+ return 1;
+ return 1;
+ }
+ return 0;
+}
+
+private int
+do_pax_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
+ int swap, uint32_t namesz, uint32_t descsz,
+ size_t noff, size_t doff, int *flags)
+{
if (namesz == 4 && strcmp((char *)&nbuf[noff], "PaX") == 0 &&
- xnh_type == NT_NETBSD_PAX && descsz == 4) {
+ type == NT_NETBSD_PAX && descsz == 4) {
static const char *pax[] = {
"+mprotect",
"-mprotect",
@@ -607,80 +621,32 @@ donote(struct magic_set *ms, void *vbuf,
size_t i;
int did = 0;
+ *flags |= FLAGS_DID_NETBSD_PAX;
(void)memcpy(&desc, &nbuf[doff], sizeof(desc));
desc = elf_getu32(swap, desc);
if (desc && file_printf(ms, ", PaX: ") == -1)
- return size;
+ return 1;
for (i = 0; i < __arraycount(pax); i++) {
- if (((1 << i) & desc) == 0)
+ if (((1 << (int)i) & desc) == 0)
continue;
if (file_printf(ms, "%s%s", did++ ? "," : "",
pax[i]) == -1)
- return size;
- }
- }
-
- if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0) {
- switch (xnh_type) {
- case NT_NETBSD_VERSION:
- if (descsz == 4) {
- do_note_netbsd_version(ms, swap, &nbuf[doff]);
- *flags |= FLAGS_DID_NOTE;
- return size;
- }
- break;
- case NT_NETBSD_MARCH:
- if (file_printf(ms, ", compiled for: %.*s", (int)descsz,
- (const char *)&nbuf[doff]) == -1)
- return size;
- break;
- case NT_NETBSD_CMODEL:
- if (file_printf(ms, ", compiler model: %.*s",
- (int)descsz, (const char *)&nbuf[doff]) == -1)
- return size;
- break;
- default:
- if (file_printf(ms, ", note=%u", xnh_type) == -1)
- return size;
- break;
+ return 1;
}
- return size;
- }
-
- if (namesz == 8 && strcmp((char *)&nbuf[noff], "FreeBSD") == 0) {
- if (xnh_type == NT_FREEBSD_VERSION && descsz == 4) {
- do_note_freebsd_version(ms, swap, &nbuf[doff]);
- *flags |= FLAGS_DID_NOTE;
- return size;
- }
- }
-
- if (namesz == 8 && strcmp((char *)&nbuf[noff], "OpenBSD") == 0 &&
- xnh_type == NT_OPENBSD_VERSION && descsz == 4) {
- if (file_printf(ms, ", for OpenBSD") == -1)
- return size;
- /* Content of note is always 0 */
- *flags |= FLAGS_DID_NOTE;
- return size;
- }
-
- if (namesz == 10 && strcmp((char *)&nbuf[noff], "DragonFly") == 0 &&
- xnh_type == NT_DRAGONFLY_VERSION && descsz == 4) {
- uint32_t desc;
- if (file_printf(ms, ", for DragonFly") == -1)
- return size;
- (void)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)
- return size;
- *flags |= FLAGS_DID_NOTE;
- return size;
+ return 1;
}
+ return 0;
+}
-core:
+private int
+do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
+ int swap, uint32_t namesz, uint32_t descsz,
+ size_t noff, size_t doff, int *flags, size_t size, int clazz)
+{
+#ifdef ELFCORE
+ int os_style = -1;
/*
* Sigh. The 2.0.36 kernel in Debian 2.1, at
* least, doesn't correctly implement name
@@ -709,20 +675,17 @@ core:
os_style = OS_STYLE_NETBSD;
}
-#ifdef ELFCORE
- if ((*flags & FLAGS_DID_CORE) != 0)
- return size;
-
if (os_style != -1 && (*flags & FLAGS_DID_CORE_STYLE) == 0) {
if (file_printf(ms, ", %s-style", os_style_names[os_style])
== -1)
- return size;
+ return 1;
*flags |= FLAGS_DID_CORE_STYLE;
}
switch (os_style) {
case OS_STYLE_NETBSD:
- if (xnh_type == NT_NETBSD_CORE_PROCINFO) {
+ if (type == NT_NETBSD_CORE_PROCINFO) {
+ char sbuf[512];
uint32_t signo;
/*
* Extract the program name. It is at
@@ -730,8 +693,9 @@ core:
* including the terminating NUL.
*/
if (file_printf(ms, ", from '%.31s'",
- &nbuf[doff + 0x7c]) == -1)
- return size;
+ file_printable(sbuf, sizeof(sbuf),
+ (const char *)&nbuf[doff + 0x7c])) == -1)
+ return 1;
/*
* Extract the signal number. It is at
@@ -741,14 +705,14 @@ core:
sizeof(signo));
if (file_printf(ms, " (signal %u)",
elf_getu32(swap, signo)) == -1)
- return size;
+ return 1;
*flags |= FLAGS_DID_CORE;
- return size;
+ return 1;
}
break;
default:
- if (xnh_type == NT_PRPSINFO && *flags & FLAGS_IS_CORE) {
+ if (type == NT_PRPSINFO && *flags & FLAGS_IS_CORE) {
size_t i, j;
unsigned char c;
/*
@@ -816,7 +780,7 @@ core:
* Try next offsets, in case this match is
* in the middle of a string.
*/
- for (k = i + 1 ; k < NOFFSETS ; k++) {
+ for (k = i + 1 ; k < NOFFSETS; k++) {
size_t no;
int adjust = 1;
if (prpsoffsets(k) >= prpsoffsets(i))
@@ -841,9 +805,9 @@ core:
cp--;
if (file_printf(ms, ", from '%.*s'",
(int)(cp - cname), cname) == -1)
- return size;
+ return 1;
*flags |= FLAGS_DID_CORE;
- return size;
+ return 1;
tryanother:
;
@@ -852,6 +816,129 @@ core:
break;
}
#endif
+ return 0;
+}
+
+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)
+{
+ Elf32_Nhdr nh32;
+ Elf64_Nhdr nh64;
+ size_t noff, doff;
+ uint32_t namesz, descsz;
+ unsigned char *nbuf = CAST(unsigned char *, vbuf);
+
+ if (*notecount == 0)
+ return 0;
+ --*notecount;
+
+ if (xnh_sizeof + offset > size) {
+ /*
+ * We're out of note headers.
+ */
+ return xnh_sizeof + offset;
+ }
+
+ (void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
+ offset += xnh_sizeof;
+
+ namesz = xnh_namesz;
+ descsz = xnh_descsz;
+ if ((namesz == 0) && (descsz == 0)) {
+ /*
+ * We're out of note headers.
+ */
+ return (offset >= size) ? offset : size;
+ }
+
+ if (namesz & 0x80000000) {
+ (void)file_printf(ms, ", bad note name size 0x%lx",
+ (unsigned long)namesz);
+ return 0;
+ }
+
+ if (descsz & 0x80000000) {
+ (void)file_printf(ms, ", bad note description size 0x%lx",
+ (unsigned long)descsz);
+ return 0;
+ }
+
+ noff = offset;
+ doff = ELF_ALIGN(offset + namesz);
+
+ if (offset + namesz > size) {
+ /*
+ * We're past the end of the buffer.
+ */
+ return doff;
+ }
+
+ offset = ELF_ALIGN(doff + descsz);
+ if (doff + descsz > size) {
+ /*
+ * We're past the end of the buffer.
+ */
+ return (offset >= size) ? offset : size;
+ }
+
+ if ((*flags & FLAGS_DID_OS_NOTE) == 0) {
+ if (do_os_note(ms, nbuf, xnh_type, swap,
+ namesz, descsz, noff, doff, flags))
+ return size;
+ }
+
+ if ((*flags & FLAGS_DID_BUILD_ID) == 0) {
+ if (do_bid_note(ms, nbuf, xnh_type, swap,
+ namesz, descsz, noff, doff, flags))
+ return size;
+ }
+
+ if ((*flags & FLAGS_DID_NETBSD_PAX) == 0) {
+ if (do_pax_note(ms, nbuf, xnh_type, swap,
+ namesz, descsz, noff, doff, flags))
+ return size;
+ }
+
+ if ((*flags & FLAGS_DID_CORE) == 0) {
+ if (do_core_note(ms, nbuf, xnh_type, swap,
+ namesz, descsz, noff, doff, flags, size, clazz))
+ return size;
+ }
+
+ if (namesz == 7 && strcmp((char *)&nbuf[noff], "NetBSD") == 0) {
+ if (descsz > 100)
+ descsz = 100;
+ switch (xnh_type) {
+ case NT_NETBSD_VERSION:
+ return size;
+ case NT_NETBSD_MARCH:
+ if (*flags & FLAGS_DID_NETBSD_MARCH)
+ return size;
+ *flags |= FLAGS_DID_NETBSD_MARCH;
+ if (file_printf(ms, ", compiled for: %.*s",
+ (int)descsz, (const char *)&nbuf[doff]) == -1)
+ return size;
+ break;
+ case NT_NETBSD_CMODEL:
+ if (*flags & FLAGS_DID_NETBSD_CMODEL)
+ return size;
+ *flags |= FLAGS_DID_NETBSD_CMODEL;
+ if (file_printf(ms, ", compiler model: %.*s",
+ (int)descsz, (const char *)&nbuf[doff]) == -1)
+ return size;
+ break;
+ default:
+ if (*flags & FLAGS_DID_NETBSD_UNKNOWN)
+ return size;
+ *flags |= FLAGS_DID_NETBSD_UNKNOWN;
+ if (file_printf(ms, ", note=%u", xnh_type) == -1)
+ return size;
+ break;
+ }
+ return size;
+ }
+
return offset;
}
@@ -907,16 +994,19 @@ static const cap_desc_t cap_desc_386[] =
private int
doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
- size_t size, off_t fsize, int *flags, int mach, int strtab)
+ size_t size, off_t fsize, int mach, int strtab, int *flags,
+ uint16_t *notecount)
{
Elf32_Shdr sh32;
Elf64_Shdr sh64;
int stripped = 1;
+ size_t nbadcap = 0;
void *nbuf;
off_t noff, coff, name_off;
uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
uint64_t cap_sf1 = 0; /* SunOS 5.x software capabilites */
char name[50];
+ ssize_t namesize;
if (size != xsh_sizeof) {
if (file_printf(ms, ", corrupted section header size") == -1)
@@ -925,7 +1015,8 @@ doshn(struct magic_set *ms, int clazz, i
}
/* Read offset of name section to be able to read section names later */
- if (pread(fd, xsh_addr, xsh_sizeof, off + size * strtab) == -1) {
+ if (pread(fd, xsh_addr, xsh_sizeof, CAST(off_t, (off + size * strtab)))
+ < (ssize_t)xsh_sizeof) {
file_badread(ms);
return -1;
}
@@ -933,15 +1024,15 @@ doshn(struct magic_set *ms, int clazz, i
for ( ; num; num--) {
/* Read the name of this section. */
- if (pread(fd, name, sizeof(name), name_off + xsh_name) == -1) {
+ if ((namesize = pread(fd, name, sizeof(name) - 1, name_off + xsh_name)) == -1) {
file_badread(ms);
return -1;
}
- name[sizeof(name) - 1] = '\0';
+ name[namesize] = '\0';
if (strcmp(name, ".debug_info") == 0)
stripped = 0;
- if (pread(fd, xsh_addr, xsh_sizeof, off) == -1) {
+ if (pread(fd, xsh_addr, xsh_sizeof, off) < (ssize_t)xsh_sizeof) {
file_badread(ms);
return -1;
}
@@ -956,7 +1047,7 @@ doshn(struct magic_set *ms, int clazz, i
stripped = 0;
break;
default:
- if (xsh_offset > fsize) {
+ if (fsize != SIZE_UNKNOWN && xsh_offset > fsize) {
/* Perhaps warn here */
continue;
}
@@ -971,7 +1062,7 @@ doshn(struct magic_set *ms, int clazz, i
" for note");
return -1;
}
- if (pread(fd, nbuf, xsh_size, xsh_offset) == -1) {
+ if (pread(fd, nbuf, xsh_size, xsh_offset) < (ssize_t)xsh_size) {
file_badread(ms);
free(nbuf);
return -1;
@@ -982,7 +1073,7 @@ doshn(struct magic_set *ms, int clazz, i
if (noff >= (off_t)xsh_size)
break;
noff = donote(ms, nbuf, (size_t)noff,
- xsh_size, clazz, swap, 4, flags);
+ xsh_size, clazz, swap, 4, flags, notecount);
if (noff == 0)
break;
}
@@ -1000,6 +1091,8 @@ doshn(struct magic_set *ms, int clazz, i
goto skip;
}
+ if (nbadcap > 5)
+ break;
if (lseek(fd, xsh_offset, SEEK_SET) == (off_t)-1) {
file_badseek(ms);
return -1;
@@ -1065,6 +1158,8 @@ doshn(struct magic_set *ms, int clazz, i
(unsigned long long)xcap_tag,
(unsigned long long)xcap_val) == -1)
return -1;
+ if (nbadcap++ > 2)
+ coff = xsh_size;
break;
}
}
@@ -1145,13 +1240,15 @@ doshn(struct magic_set *ms, int clazz, i
*/
private int
dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
- int num, size_t size, off_t fsize, int *flags, int sh_num)
+ int num, size_t size, off_t fsize, int sh_num, int *flags,
+ uint16_t *notecount)
{
Elf32_Phdr ph32;
Elf64_Phdr ph64;
const char *linking_style = "statically";
- const char *shared_libraries = "";
+ const char *interp = "";
unsigned char nbuf[BUFSIZ];
+ char ibuf[BUFSIZ];
ssize_t bufsize;
size_t offset, align, len;
@@ -1162,23 +1259,43 @@ dophn_exec(struct magic_set *ms, int cla
}
for ( ; num; num--) {
- if (pread(fd, xph_addr, xph_sizeof, off) == -1) {
+ if (pread(fd, xph_addr, xph_sizeof, off) < (ssize_t)xph_sizeof) {
file_badread(ms);
return -1;
}
off += size;
+ bufsize = 0;
+ align = 4;
/* Things we can determine before we seek */
switch (xph_type) {
case PT_DYNAMIC:
linking_style = "dynamically";
break;
+ case PT_NOTE:
+ if (sh_num) /* Did this through section headers */
+ continue;
+ if (((align = xph_align) & 0x80000000UL) != 0 ||
+ align < 4) {
+ if (file_printf(ms,
+ ", invalid note alignment 0x%lx",
+ (unsigned long)align) == -1)
+ return -1;
+ align = 4;
+ }
+ /*FALLTHROUGH*/
case PT_INTERP:
- shared_libraries = " (uses shared libs)";
+ len = xph_filesz < sizeof(nbuf) ? xph_filesz
+ : sizeof(nbuf);
+ bufsize = pread(fd, nbuf, len, xph_offset);
+ if (bufsize == -1) {
+ file_badread(ms);
+ return -1;
+ }
break;
default:
- if (xph_offset > fsize) {
+ if (fsize != SIZE_UNKNOWN && xph_offset > fsize) {
/* Maybe warn here? */
continue;
}
@@ -1187,34 +1304,25 @@ dophn_exec(struct magic_set *ms, int cla
/* Things we can determine when we seek */
switch (xph_type) {
+ case PT_INTERP:
+ if (bufsize && nbuf[0]) {
+ nbuf[bufsize - 1] = '\0';
+ interp = (const char *)nbuf;
+ } else
+ interp = "*empty*";
+ break;
case PT_NOTE:
- if ((align = xph_align) & 0x80000000UL) {
- if (file_printf(ms,
- ", invalid note alignment 0x%lx",
- (unsigned long)align) == -1)
- return -1;
- align = 4;
- }
- if (sh_num)
- break;
/*
* This is a PT_NOTE section; loop through all the notes
* in the section.
*/
- len = xph_filesz < sizeof(nbuf) ? xph_filesz
- : sizeof(nbuf);
- bufsize = pread(fd, nbuf, len, xph_offset);
- if (bufsize == -1) {
- file_badread(ms);
- return -1;
- }
offset = 0;
for (;;) {
if (offset >= (size_t)bufsize)
break;
offset = donote(ms, nbuf, offset,
(size_t)bufsize, clazz, swap, align,
- flags);
+ flags, notecount);
if (offset == 0)
break;
}
@@ -1223,9 +1331,13 @@ dophn_exec(struct magic_set *ms, int cla
break;
}
}
- if (file_printf(ms, ", %s linked%s", linking_style, shared_libraries)
+ if (file_printf(ms, ", %s linked", linking_style)
== -1)
- return -1;
+ return -1;
+ if (interp[0])
+ if (file_printf(ms, ", interpreter %s",
+ file_printable(ibuf, sizeof(ibuf), interp)) == -1)
+ return -1;
return 0;
}
@@ -1245,7 +1357,7 @@ file_tryelf(struct magic_set *ms, int fd
int flags = 0;
Elf32_Ehdr elf32hdr;
Elf64_Ehdr elf64hdr;
- uint16_t type;
+ uint16_t type, phnum, shnum, notecount;
if (ms->flags & (MAGIC_MIME|MAGIC_APPLE))
return 0;
@@ -1271,7 +1383,10 @@ file_tryelf(struct magic_set *ms, int fd
file_badread(ms);
return -1;
}
- fsize = st.st_size;
+ if (S_ISREG(st.st_mode) || st.st_size != 0)
+ fsize = st.st_size;
+ else
+ fsize = SIZE_UNKNOWN;
clazz = buf[EI_CLASS];
Index: src/external/bsd/file/dist/src/cdf_time.c
diff -u src/external/bsd/file/dist/src/cdf_time.c:1.6 src/external/bsd/file/dist/src/cdf_time.c:1.7
--- src/external/bsd/file/dist/src/cdf_time.c:1.6 Thu Jun 12 22:08:06 2014
+++ src/external/bsd/file/dist/src/cdf_time.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: cdf_time.c,v 1.6 2014/06/13 02:08:06 christos Exp $ */
+/* $NetBSD: cdf_time.c,v 1.7 2015/01/02 21:15:32 christos Exp $ */
+
/*-
* Copyright (c) 2008 Christos Zoulas
* All rights reserved.
@@ -31,7 +32,7 @@
#if 0
FILE_RCSID("@(#)$File: cdf_time.c,v 1.15 2014/05/14 23:15:42 christos Exp $")
#else
-__RCSID("$NetBSD: cdf_time.c,v 1.6 2014/06/13 02:08:06 christos Exp $");
+__RCSID("$NetBSD: cdf_time.c,v 1.7 2015/01/02 21:15:32 christos Exp $");
#endif
#endif
Index: src/external/bsd/file/dist/src/file.c
diff -u src/external/bsd/file/dist/src/file.c:1.6 src/external/bsd/file/dist/src/file.c:1.7
--- src/external/bsd/file/dist/src/file.c:1.6 Mon Oct 20 17:48:57 2014
+++ src/external/bsd/file/dist/src/file.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: file.c,v 1.6 2014/10/20 21:48:57 christos Exp $ */
+/* $NetBSD: file.c,v 1.7 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -34,9 +35,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: file.c,v 1.155 2014/10/11 15:03:16 christos Exp $")
+FILE_RCSID("@(#)$File: file.c,v 1.160 2014/12/16 23:18:40 christos Exp $")
#else
-__RCSID("$NetBSD: file.c,v 1.6 2014/10/20 21:48:57 christos Exp $");
+__RCSID("$NetBSD: file.c,v 1.7 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -103,7 +104,7 @@ private const struct option long_options
#undef OPT_LONGONLY
{0, 0, NULL, 0}
};
-#define OPTSTRING "bcCde:Ef:F:hiklLm:nNprsvz0"
+#define OPTSTRING "bcCde:Ef:F:hiklLm:nNpP:rsvz0"
private const struct {
const char *name;
@@ -121,6 +122,18 @@ private const struct {
{ "tokens", MAGIC_NO_CHECK_TOKENS }, /* OBSOLETE: ignored for backwards compatibility */
};
+private struct {
+ const char *name;
+ int tag;
+ size_t value;
+} pm[] = {
+ { "indir", MAGIC_PARAM_INDIR_MAX, 0 },
+ { "name", MAGIC_PARAM_NAME_MAX, 0 },
+ { "elf_phnum", MAGIC_PARAM_ELF_PHNUM_MAX, 0 },
+ { "elf_shnum", MAGIC_PARAM_ELF_SHNUM_MAX, 0 },
+ { "elf_notes", MAGIC_PARAM_ELF_NOTES_MAX, 0 },
+};
+
private char *progname; /* used throughout */
#ifdef __dead
@@ -136,6 +149,8 @@ private void help(void);
private int unwrap(struct magic_set *, const char *);
private int process(struct magic_set *ms, const char *, int);
private struct magic_set *load(const char *, int);
+private void setparam(const char *);
+private void applyparam(magic_t);
/*
@@ -253,9 +268,13 @@ main(int argc, char *argv[])
flags |= MAGIC_PRESERVE_ATIME;
break;
#endif
+ case 'P':
+ setparam(optarg);
+ break;
case 'r':
flags |= MAGIC_RAW;
break;
+ break;
case 's':
flags |= MAGIC_DEVICES;
break;
@@ -308,6 +327,8 @@ main(int argc, char *argv[])
strerror(errno));
return 1;
}
+
+
switch(action) {
case FILE_CHECK:
c = magic_check(magic, magicfile);
@@ -331,7 +352,7 @@ main(int argc, char *argv[])
if (magic == NULL)
if ((magic = load(magicfile, flags)) == NULL)
return 1;
- break;
+ applyparam(magic);
}
if (optind == argc) {
@@ -361,6 +382,41 @@ main(int argc, char *argv[])
return e;
}
+private void
+applyparam(magic_t magic)
+{
+ size_t i;
+
+ for (i = 0; i < __arraycount(pm); i++) {
+ if (pm[i].value == 0)
+ continue;
+ if (magic_setparam(magic, pm[i].tag, &pm[i].value) == -1) {
+ (void)fprintf(stderr, "%s: Can't set %s %s\n", progname,
+ pm[i].name, strerror(errno));
+ exit(1);
+ }
+ }
+}
+
+private void
+setparam(const char *p)
+{
+ size_t i;
+ char *s;
+
+ if ((s = strchr(p, '=')) == NULL)
+ goto badparm;
+
+ for (i = 0; i < __arraycount(pm); i++) {
+ if (strncmp(p, pm[i].name, s - p) != 0)
+ continue;
+ pm[i].value = atoi(s + 1);
+ return;
+ }
+badparm:
+ (void)fprintf(stderr, "%s: Unknown param %s\n", progname, p);
+ exit(1);
+}
private struct magic_set *
/*ARGSUSED*/
Index: src/external/bsd/file/dist/src/compress.c
diff -u src/external/bsd/file/dist/src/compress.c:1.9 src/external/bsd/file/dist/src/compress.c:1.10
--- src/external/bsd/file/dist/src/compress.c:1.9 Thu Jun 12 22:08:06 2014
+++ src/external/bsd/file/dist/src/compress.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: compress.c,v 1.9 2014/06/13 02:08:06 christos Exp $ */
+/* $NetBSD: compress.c,v 1.10 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -37,9 +38,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: compress.c,v 1.73 2014/01/05 15:55:21 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.77 2014/12/12 16:33:01 christos Exp $")
#else
-__RCSID("$NetBSD: compress.c,v 1.9 2014/06/13 02:08:06 christos Exp $");
+__RCSID("$NetBSD: compress.c,v 1.10 2015/01/02 21:15:32 christos Exp $");
#endif
#endif
@@ -50,7 +51,8 @@ __RCSID("$NetBSD: compress.c,v 1.9 2014/
#endif
#include <string.h>
#include <errno.h>
-#ifndef __MINGW32__
+#include <signal.h>
+#if !defined(__MINGW32__) && !defined(WIN32)
#include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_WAIT_H
@@ -108,10 +110,12 @@ file_zmagic(struct magic_set *ms, int fd
size_t i, nsz;
int rv = 0;
int mime = ms->flags & MAGIC_MIME;
+ sig_t osigpipe;
if ((ms->flags & MAGIC_COMPRESS) == 0)
return 0;
+ osigpipe = signal(SIGPIPE, SIG_IGN);
for (i = 0; i < ncompr; i++) {
if (nbytes < compr[i].maglen)
continue;
@@ -138,6 +142,7 @@ file_zmagic(struct magic_set *ms, int fd
}
}
error:
+ (void)signal(SIGPIPE, osigpipe);
free(newbuf);
ms->flags |= MAGIC_COMPRESS;
return rv;
@@ -382,8 +387,8 @@ uncompressbuf(struct magic_set *ms, int
const unsigned char *old, unsigned char **newch, size_t n)
{
int fdin[2], fdout[2];
+ int status;
ssize_t r;
- pid_t pid;
#ifdef BUILTIN_DECOMPRESS
/* FIXME: This doesn't cope with bzip2 */
@@ -397,7 +402,7 @@ uncompressbuf(struct magic_set *ms, int
file_error(ms, errno, "cannot create pipe");
return NODATA;
}
- switch (pid = fork()) {
+ switch (fork()) {
case 0: /* child */
(void) close(0);
if (fd != -1) {
@@ -464,7 +469,17 @@ uncompressbuf(struct magic_set *ms, int
/*NOTREACHED*/
default: /* parent */
- break;
+ if (wait(&status) == -1) {
+#ifdef DEBUG
+ (void)fprintf(stderr,
+ "Wait failed (%s)\n",
+ strerror(errno));
+#endif
+ exit(1);
+ }
+ exit(WIFEXITED(status) ?
+ WEXITSTATUS(status) : 1);
+ /*NOTREACHED*/
}
(void) close(fdin[1]);
fdin[1] = -1;
@@ -475,7 +490,7 @@ uncompressbuf(struct magic_set *ms, int
(void)fprintf(stderr, "Malloc failed (%s)\n",
strerror(errno));
#endif
- n = 0;
+ n = NODATA;
goto err;
}
if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) {
@@ -484,7 +499,7 @@ uncompressbuf(struct magic_set *ms, int
strerror(errno));
#endif
free(*newch);
- n = 0;
+ n = NODATA;
*newch = NULL;
goto err;
} else {
@@ -496,12 +511,24 @@ err:
if (fdin[1] != -1)
(void) close(fdin[1]);
(void) close(fdout[0]);
-#ifdef WNOHANG
- while (waitpid(pid, NULL, WNOHANG) != -1)
- continue;
-#else
- (void)wait(NULL);
+ if (wait(&status) == -1) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Wait failed (%s)\n",
+ strerror(errno));
+#endif
+ n = NODATA;
+ } else if (!WIFEXITED(status)) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Child not exited (0x%x)\n",
+ status);
#endif
+ } else if (WEXITSTATUS(status) != 0) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Child exited (0x%d)\n",
+ WEXITSTATUS(status));
+#endif
+ }
+
(void) close(fdin[0]);
return n;
Index: src/external/bsd/file/dist/src/funcs.c
diff -u src/external/bsd/file/dist/src/funcs.c:1.9 src/external/bsd/file/dist/src/funcs.c:1.10
--- src/external/bsd/file/dist/src/funcs.c:1.9 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/funcs.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: funcs.c,v 1.9 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: funcs.c,v 1.10 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Christos Zoulas 2003.
* All Rights Reserved.
@@ -29,9 +30,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: funcs.c,v 1.73 2014/09/10 18:41:51 christos Exp $")
+FILE_RCSID("@(#)$File: funcs.c,v 1.79 2014/12/16 20:52:49 christos Exp $")
#else
-__RCSID("$NetBSD: funcs.c,v 1.9 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: funcs.c,v 1.10 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -233,7 +234,7 @@ file_buffer(struct magic_set *ms, int fd
/* try soft magic tests */
if ((ms->flags & MAGIC_NO_CHECK_SOFT) == 0)
- if ((m = file_softmagic(ms, ubuf, nb, 0, BINTEST,
+ if ((m = file_softmagic(ms, ubuf, nb, 0, NULL, BINTEST,
looks_text)) != 0) {
if ((ms->flags & MAGIC_DEBUG) != 0)
(void)fprintf(stderr, "softmagic %d\n", m);
@@ -497,3 +498,68 @@ file_regerror(file_regex_t *rx, int rc,
file_magerror(ms, "regex error %d for `%s', (%s)", rc, rx->pat,
errmsg);
}
+
+protected file_pushbuf_t *
+file_push_buffer(struct magic_set *ms)
+{
+ file_pushbuf_t *pb;
+
+ if (ms->event_flags & EVENT_HAD_ERR)
+ return NULL;
+
+ if ((pb = (CAST(file_pushbuf_t *, malloc(sizeof(*pb))))) == NULL)
+ return NULL;
+
+ pb->buf = ms->o.buf;
+ pb->offset = ms->offset;
+
+ ms->o.buf = NULL;
+ ms->offset = 0;
+
+ return pb;
+}
+
+protected char *
+file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
+{
+ char *rbuf;
+
+ if (ms->event_flags & EVENT_HAD_ERR) {
+ free(pb->buf);
+ free(pb);
+ return NULL;
+ }
+
+ rbuf = ms->o.buf;
+
+ ms->o.buf = pb->buf;
+ ms->offset = pb->offset;
+
+ free(pb);
+ return rbuf;
+}
+
+/*
+ * convert string to ascii printable format.
+ */
+protected char *
+file_printable(char *buf, size_t bufsiz, const char *str)
+{
+ char *ptr, *eptr;
+ const unsigned char *s = (const unsigned char *)str;
+
+ for (ptr = buf, eptr = ptr + bufsiz - 1; ptr < eptr && *s; s++) {
+ if (isprint(*s)) {
+ *ptr++ = *s;
+ continue;
+ }
+ if (ptr >= eptr - 3)
+ break;
+ *ptr++ = '\\';
+ *ptr++ = ((CAST(unsigned int, *s) >> 6) & 7) + '0';
+ *ptr++ = ((CAST(unsigned int, *s) >> 3) & 7) + '0';
+ *ptr++ = ((CAST(unsigned int, *s) >> 0) & 7) + '0';
+ }
+ *ptr = '\0';
+ return buf;
+}
Index: src/external/bsd/file/dist/src/magic.c
diff -u src/external/bsd/file/dist/src/magic.c:1.9 src/external/bsd/file/dist/src/magic.c:1.10
--- src/external/bsd/file/dist/src/magic.c:1.9 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/magic.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: magic.c,v 1.9 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: magic.c,v 1.10 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Christos Zoulas 2003.
* All Rights Reserved.
@@ -35,9 +36,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: magic.c,v 1.85 2014/08/04 06:19:44 christos Exp $")
+FILE_RCSID("@(#)$File: magic.c,v 1.91 2014/12/16 23:18:40 christos Exp $")
#else
-__RCSID("$NetBSD: magic.c,v 1.9 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: magic.c,v 1.10 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -133,6 +134,7 @@ out:
#else
char *hmagicp;
char *tmppath = NULL;
+ LPTSTR dllpath;
hmagicpath = NULL;
#define APPENDPATH() \
@@ -178,7 +180,7 @@ out:
}
/* Third, try to get magic file relative to dll location */
- LPTSTR dllpath = malloc(sizeof(*dllpath) * (MAX_PATH + 1));
+ dllpath = malloc(sizeof(*dllpath) * (MAX_PATH + 1));
dllpath[MAX_PATH] = 0; /* just in case long path gets truncated and not null terminated */
if (GetModuleFileNameA(NULL, dllpath, MAX_PATH)){
PathRemoveFileSpecA(dllpath);
@@ -541,3 +543,53 @@ magic_version(void)
{
return MAGIC_VERSION;
}
+
+public int
+magic_setparam(struct magic_set *ms, int param, const void *val)
+{
+ switch (param) {
+ case MAGIC_PARAM_INDIR_MAX:
+ ms->indir_max = (uint16_t)*(const size_t *)val;
+ return 0;
+ case MAGIC_PARAM_NAME_MAX:
+ ms->name_max = (uint16_t)*(const size_t *)val;
+ return 0;
+ case MAGIC_PARAM_ELF_PHNUM_MAX:
+ ms->elf_phnum_max = (uint16_t)*(const size_t *)val;
+ return 0;
+ case MAGIC_PARAM_ELF_SHNUM_MAX:
+ ms->elf_shnum_max = (uint16_t)*(const size_t *)val;
+ return 0;
+ case MAGIC_PARAM_ELF_NOTES_MAX:
+ ms->elf_notes_max = (uint16_t)*(const size_t *)val;
+ return 0;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
+
+public int
+magic_getparam(struct magic_set *ms, int param, void *val)
+{
+ switch (param) {
+ case MAGIC_PARAM_INDIR_MAX:
+ *(size_t *)val = ms->indir_max;
+ return 0;
+ case MAGIC_PARAM_NAME_MAX:
+ *(size_t *)val = ms->name_max;
+ return 0;
+ case MAGIC_PARAM_ELF_PHNUM_MAX:
+ *(size_t *)val = ms->elf_phnum_max;
+ return 0;
+ case MAGIC_PARAM_ELF_SHNUM_MAX:
+ *(size_t *)val = ms->elf_shnum_max;
+ return 0;
+ case MAGIC_PARAM_ELF_NOTES_MAX:
+ *(size_t *)val = ms->elf_notes_max;
+ return 0;
+ default:
+ errno = EINVAL;
+ return -1;
+ }
+}
Index: src/external/bsd/file/dist/src/encoding.c
diff -u src/external/bsd/file/dist/src/encoding.c:1.3 src/external/bsd/file/dist/src/encoding.c:1.4
--- src/external/bsd/file/dist/src/encoding.c:1.3 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/encoding.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: encoding.c,v 1.3 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: encoding.c,v 1.4 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -39,7 +40,7 @@
#if 0
FILE_RCSID("@(#)$File: encoding.c,v 1.10 2014/09/11 12:08:52 christos Exp $")
#else
-__RCSID("$NetBSD: encoding.c,v 1.3 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: encoding.c,v 1.4 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
Index: src/external/bsd/file/dist/src/print.c
diff -u src/external/bsd/file/dist/src/print.c:1.7 src/external/bsd/file/dist/src/print.c:1.8
--- src/external/bsd/file/dist/src/print.c:1.7 Thu Jun 12 22:08:06 2014
+++ src/external/bsd/file/dist/src/print.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: print.c,v 1.7 2014/06/13 02:08:06 christos Exp $ */
+/* $NetBSD: print.c,v 1.8 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -36,7 +37,7 @@
#if 0
FILE_RCSID("@(#)$File: print.c,v 1.76 2013/02/26 18:25:00 christos Exp $")
#else
-__RCSID("$NetBSD: print.c,v 1.7 2014/06/13 02:08:06 christos Exp $");
+__RCSID("$NetBSD: print.c,v 1.8 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -169,6 +170,7 @@ file_mdump(struct magic *m)
case FILE_MELDATE:
(void)fprintf(stderr, "%s,",
file_fmttime(m->value.l, 0, tbuf));
+ break;
case FILE_QDATE:
case FILE_LEQDATE:
case FILE_BEQDATE:
Index: src/external/bsd/file/dist/src/softmagic.c
diff -u src/external/bsd/file/dist/src/softmagic.c:1.12 src/external/bsd/file/dist/src/softmagic.c:1.13
--- src/external/bsd/file/dist/src/softmagic.c:1.12 Fri Oct 10 16:15:02 2014
+++ src/external/bsd/file/dist/src/softmagic.c Fri Jan 2 16:15:32 2015
@@ -1,4 +1,5 @@
-/* $NetBSD: softmagic.c,v 1.12 2014/10/10 20:15:02 christos Exp $ */
+/* $NetBSD: softmagic.c,v 1.13 2015/01/02 21:15:32 christos Exp $ */
+
/*
* Copyright (c) Ian F. Darwin 1986-1995.
* Software written by Ian F. Darwin and others;
@@ -34,9 +35,9 @@
#ifndef lint
#if 0
-FILE_RCSID("@(#)$File: softmagic.c,v 1.195 2014/09/24 19:49:07 christos Exp $")
+FILE_RCSID("@(#)$File: softmagic.c,v 1.206 2015/01/01 17:07:34 christos Exp $")
#else
-__RCSID("$NetBSD: softmagic.c,v 1.12 2014/10/10 20:15:02 christos Exp $");
+__RCSID("$NetBSD: softmagic.c,v 1.13 2015/01/02 21:15:32 christos Exp $");
#endif
#endif /* lint */
@@ -48,11 +49,11 @@ __RCSID("$NetBSD: softmagic.c,v 1.12 201
#include <time.h>
private int match(struct magic_set *, struct magic *, uint32_t,
- const unsigned char *, size_t, size_t, int, int, int, int, int *, int *,
- int *);
+ const unsigned char *, size_t, size_t, int, int, int, uint16_t,
+ uint16_t *, int *, int *, int *);
private int mget(struct magic_set *, const unsigned char *,
- struct magic *, size_t, size_t, unsigned int, int, int, int, int, int *,
- int *, int *);
+ struct magic *, size_t, size_t, unsigned int, int, int, int, uint16_t,
+ uint16_t *, int *, int *, int *);
private int magiccheck(struct magic_set *, struct magic *);
private int32_t mprint(struct magic_set *, struct magic *);
private int32_t moffset(struct magic_set *, struct magic *);
@@ -68,6 +69,7 @@ private void cvt_32(union VALUETYPE *, c
private void cvt_64(union VALUETYPE *, const struct magic *);
#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o)))
+
/*
* softmagic - lookup one file in parsed, in-memory copy of database
* Passed the name and FILE * of one file to be typed.
@@ -75,15 +77,21 @@ private void cvt_64(union VALUETYPE *, c
/*ARGSUSED1*/ /* nbytes passed for regularity, maybe need later */
protected int
file_softmagic(struct magic_set *ms, const unsigned char *buf, size_t nbytes,
- size_t level, int mode, int text)
+ uint16_t indir_level, uint16_t *name_count, int mode, int text)
{
struct mlist *ml;
int rv, printed_something = 0, need_separator = 0;
+ uint16_t nc;
+
+ if (name_count == NULL) {
+ nc = 0;
+ name_count = &nc;
+ }
for (ml = ms->mlist[0]->next; ml != ms->mlist[0]; ml = ml->next)
if ((rv = match(ms, ml->magic, ml->nmagic, buf, nbytes, 0, mode,
- text, 0, level, &printed_something, &need_separator,
- NULL)) != 0)
+ text, 0, indir_level, name_count,
+ &printed_something, &need_separator, NULL)) != 0)
return rv;
return 0;
@@ -138,8 +146,8 @@ file_fmtcheck(struct magic_set *ms, cons
private int
match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
const unsigned char *s, size_t nbytes, size_t offset, int mode, int text,
- int flip, int recursion_level, int *printed_something, int *need_separator,
- int *returnval)
+ int flip, uint16_t indir_level, uint16_t *name_count,
+ int *printed_something, int *need_separator, int *returnval)
{
uint32_t magindex = 0;
unsigned int cont_level = 0;
@@ -176,8 +184,8 @@ match(struct magic_set *ms, struct magic
/* if main entry matches, print it... */
switch (mget(ms, s, m, nbytes, offset, cont_level, mode, text,
- flip, recursion_level + 1, printed_something,
- need_separator, returnval)) {
+ flip, indir_level, name_count,
+ printed_something, need_separator, returnval)) {
case -1:
return -1;
case 0:
@@ -265,8 +273,8 @@ match(struct magic_set *ms, struct magic
}
#endif
switch (mget(ms, s, m, nbytes, offset, cont_level, mode,
- text, flip, recursion_level + 1, printed_something,
- need_separator, returnval)) {
+ text, flip, indir_level, name_count,
+ printed_something, need_separator, returnval)) {
case -1:
return -1;
case 0:
@@ -409,7 +417,7 @@ mprint(struct magic_set *ms, struct magi
float vf;
double vd;
int64_t t = 0;
- char buf[128], tbuf[26];
+ char buf[128], tbuf[26], sbuf[512];
union VALUETYPE *p = &ms->ms_value;
switch (m->type) {
@@ -503,7 +511,9 @@ mprint(struct magic_set *ms, struct magi
case FILE_BESTRING16:
case FILE_LESTRING16:
if (m->reln == '=' || m->reln == '!') {
- if (file_printf(ms, F(ms, m, "%s"), m->value.s) == -1)
+ if (file_printf(ms, F(ms, m, "%s"),
+ file_printable(sbuf, sizeof(sbuf), m->value.s))
+ == -1)
return -1;
t = ms->offset + m->vallen;
}
@@ -529,7 +539,8 @@ mprint(struct magic_set *ms, struct magi
*++last = '\0';
}
- if (file_printf(ms, F(ms, m, "%s"), str) == -1)
+ if (file_printf(ms, F(ms, m, "%s"),
+ file_printable(sbuf, sizeof(sbuf), str)) == -1)
return -1;
if (m->type == FILE_PSTRING)
@@ -633,7 +644,8 @@ mprint(struct magic_set *ms, struct magi
file_oomem(ms, ms->search.rm_len);
return -1;
}
- rval = file_printf(ms, F(ms, m, "%s"), cp);
+ rval = file_printf(ms, F(ms, m, "%s"),
+ file_printable(sbuf, sizeof(sbuf), cp));
free(cp);
if (rval == -1)
@@ -647,7 +659,8 @@ mprint(struct magic_set *ms, struct magi
}
case FILE_SEARCH:
- if (file_printf(ms, F(ms, m, "%s"), m->value.s) == -1)
+ if (file_printf(ms, F(ms, m, "%s"),
+ file_printable(sbuf, sizeof(sbuf), m->value.s)) == -1)
return -1;
if ((m->str_flags & REGEX_OFFSET_START))
t = ms->search.offset;
@@ -945,14 +958,17 @@ mconvert(struct magic_set *ms, struct ma
size_t sz = file_pstring_length_size(m);
char *ptr1 = p->s, *ptr2 = ptr1 + sz;
size_t len = file_pstring_get_length(m, ptr1);
- if (len >= sizeof(p->s)) {
+ sz = sizeof(p->s) - sz; /* maximum length of string */
+ if (len >= sz) {
/*
* The size of the pascal string length (sz)
* is 1, 2, or 4. We need at least 1 byte for NUL
* termination, but we've already truncated the
* string by p->s, so we need to deduct sz.
+ * Because we can use one of the bytes of the length
+ * after we shifted as NUL termination.
*/
- len = sizeof(p->s) - sz;
+ len = sz;
}
while (len--)
*ptr1++ = *ptr2++;
@@ -1192,18 +1208,26 @@ mcopy(struct magic_set *ms, union VALUET
private int
mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
size_t nbytes, size_t o, unsigned int cont_level, int mode, int text,
- int flip, int recursion_level, int *printed_something,
- int *need_separator, int *returnval)
+ int flip, uint16_t indir_level, uint16_t *name_count,
+ int *printed_something, int *need_separator, int *returnval)
{
- uint32_t soffset, offset = ms->offset;
+ uint32_t offset = ms->offset;
uint32_t lhs;
+ file_pushbuf_t *pb;
int rv, oneed_separator, in_type;
- char *sbuf, *rbuf;
+ char *rbuf;
union VALUETYPE *p = &ms->ms_value;
struct mlist ml;
- if (recursion_level >= 20) {
- file_error(ms, 0, "recursion nesting exceeded");
+ if (indir_level >= ms->indir_max) {
+ file_error(ms, 0, "indirect recursion nesting (%hu) exceeded",
+ indir_level);
+ return -1;
+ }
+
+ if (*name_count >= ms->name_max) {
+ file_error(ms, 0, "name use count (%hu) exceeded",
+ *name_count);
return -1;
}
@@ -1213,8 +1237,10 @@ mget(struct magic_set *ms, const unsigne
if ((ms->flags & MAGIC_DEBUG) != 0) {
fprintf(stderr, "mget(type=%d, flag=%x, offset=%u, o=%"
- SIZE_T_FORMAT "u, " "nbytes=%" SIZE_T_FORMAT "u)\n",
- m->type, m->flag, offset, o, nbytes);
+ SIZE_T_FORMAT "u, " "nbytes=%" SIZE_T_FORMAT
+ "u, il=%hu, nc=%hu)\n",
+ m->type, m->flag, offset, o, nbytes,
+ indir_level, *name_count);
mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE));
#ifndef COMPILE_ONLY
file_mdump(m);
@@ -1645,21 +1671,27 @@ mget(struct magic_set *ms, const unsigne
break;
case FILE_INDIRECT:
+ if (m->str_flags & INDIRECT_RELATIVE)
+ offset += CAST(uint32_t, o);
if (offset == 0)
return 0;
+
if (nbytes < offset)
return 0;
- sbuf = ms->o.buf;
- soffset = ms->offset;
- ms->o.buf = NULL;
- ms->offset = 0;
+
+ if ((pb = file_push_buffer(ms)) == NULL)
+ return -1;
+
rv = file_softmagic(ms, s + offset, nbytes - offset,
- recursion_level, BINTEST, text);
+ indir_level + 1, name_count, BINTEST, text);
+
if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv);
- rbuf = ms->o.buf;
- ms->o.buf = sbuf;
- ms->offset = soffset;
+
+ rbuf = file_pop_buffer(ms, pb);
+ if (rbuf == NULL && ms->event_flags & EVENT_HAD_ERR)
+ return -1;
+
if (rv == 1) {
if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 &&
file_printf(ms, F(ms, m, "%u"), offset) == -1) {
@@ -1677,22 +1709,22 @@ mget(struct magic_set *ms, const unsigne
case FILE_USE:
if (nbytes < offset)
return 0;
- sbuf = m->value.s;
- if (*sbuf == '^') {
- sbuf++;
+ rbuf = m->value.s;
+ if (*rbuf == '^') {
+ rbuf++;
flip = !flip;
}
- if (file_magicfind(ms, sbuf, &ml) == -1) {
- file_error(ms, 0, "cannot find entry `%s'", sbuf);
+ if (file_magicfind(ms, rbuf, &ml) == -1) {
+ file_error(ms, 0, "cannot find entry `%s'", rbuf);
return -1;
}
-
+ (*name_count)++;
oneed_separator = *need_separator;
if (m->flag & NOSPACE)
*need_separator = 0;
rv = match(ms, ml.magic, ml.nmagic, s, nbytes, offset + o,
- mode, text, flip, recursion_level, printed_something,
- need_separator, returnval);
+ mode, text, flip, indir_level, name_count,
+ printed_something, need_separator, returnval);
if (rv != 1)
*need_separator = oneed_separator;
return rv;
Index: src/external/bsd/file/include/config.h
diff -u src/external/bsd/file/include/config.h:1.7 src/external/bsd/file/include/config.h:1.8
--- src/external/bsd/file/include/config.h:1.7 Fri Oct 10 16:57:48 2014
+++ src/external/bsd/file/include/config.h Fri Jan 2 16:15:32 2015
@@ -91,7 +91,7 @@
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `mkostemp' function. */
-#define HAVE_MKOSTEMP 1
+/* #undef HAVE_MKOSTEMP */
/* Define to 1 if you have the `mkstemp' function. */
#define HAVE_MKSTEMP 1
@@ -105,6 +105,9 @@
/* Define to 1 if you have the `pread' function. */
#define HAVE_PREAD 1
+/* Define to 1 if you have the `setlocale' function. */
+#define HAVE_SETLOCALE 1
+
/* Define to 1 if you have the <stddef.h> header file. */
#define HAVE_STDDEF_H 1
@@ -229,6 +232,9 @@
/* Define to 1 if `vfork' works. */
#define HAVE_WORKING_VFORK 1
+/* Define to 1 if you have the <xlocale.h> header file. */
+/* #undef HAVE_XLOCALE_H */
+
/* Define to 1 if you have the <zlib.h> header file. */
#define HAVE_ZLIB_H 1
@@ -254,7 +260,7 @@
#define PACKAGE_NAME "file"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "file 5.20"
+#define PACKAGE_STRING "file 5.22"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "file"
@@ -263,7 +269,7 @@
#define PACKAGE_URL ""
/* Define to the version of this package. */
-#define PACKAGE_VERSION "5.20"
+#define PACKAGE_VERSION "5.22"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
@@ -292,8 +298,9 @@
# define __EXTENSIONS__ 1
#endif
+
/* Version number of package */
-#define VERSION "5.20"
+#define VERSION "5.22"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */
Index: src/external/bsd/file/lib/shlib_version
diff -u src/external/bsd/file/lib/shlib_version:1.4 src/external/bsd/file/lib/shlib_version:1.5
--- src/external/bsd/file/lib/shlib_version:1.4 Sat Mar 23 12:15:59 2013
+++ src/external/bsd/file/lib/shlib_version Fri Jan 2 16:15:32 2015
@@ -1,4 +1,4 @@
-# $NetBSD: shlib_version,v 1.4 2013/03/23 16:15:59 christos Exp $
+# $NetBSD: shlib_version,v 1.5 2015/01/02 21:15:32 christos Exp $
#
major=5
-minor=0
+minor=1