6603 lines
		
	
	
	
		
			206 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			6603 lines
		
	
	
	
		
			206 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: contrib/file/ChangeLog
 | |
| ===================================================================
 | |
| --- contrib/file/ChangeLog	(revision 284174)
 | |
| +++ contrib/file/ChangeLog	(working copy)
 | |
| @@ -1,3 +1,97 @@
 | |
| +2015-01-02  15:15  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* release 5.22
 | |
| +
 | |
| +2015-01-01  12:01  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* add indirect relative for TIFF/Exif
 | |
| +
 | |
| +2014-12-16  18:10  Christos Zoulas <christos@zoulas.com>
 | |
| +	
 | |
| +	* restructure elf note printing to avoid repeated messages
 | |
| +	* add note limit, suggested by Alexander Cherepanov
 | |
| +
 | |
| +2014-12-16  16:53  Christos Zoulas <christos@zoulas.com>
 | |
| +	
 | |
| +	* Bail out on partial pread()'s (Alexander Cherepanov)
 | |
| +	* Fix incorrect bounds check in file_printable (Alexander Cherepanov)
 | |
| +
 | |
| +2014-12-11  20:01  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* 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 <christos@zoulas.com>
 | |
| +
 | |
| +	* release 5.21
 | |
| +
 | |
| +2014-11-27  18:40  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* Allow setting more parameters from the command line.
 | |
| +	* Split name/use and indirect magic recursion limits.
 | |
| +
 | |
| +2014-11-27  11:12  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* Adjust ELF parameters and the default recursion
 | |
| +	  level.
 | |
| +	* Allow setting the recursion level dynamically.
 | |
| +
 | |
| +2014-11-24   8:55  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* 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 <christos@zoulas.com>
 | |
| +
 | |
| +	* fix bogus free in the user buffer case.
 | |
| +
 | |
| +2014-11-11  12:35  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* 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 <christos@zoulas.com>
 | |
| +
 | |
| +	* 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 <christos@zoulas.com>
 | |
| +
 | |
| +	* fix bounds in note reading (Francisco Alonso / Red Hat)
 | |
| +
 | |
| +2014-10-11  15:02  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* fix autoconf glue for setlocale and locale_t; some OS's
 | |
| +	  have locale_t in xlocale.h
 | |
| +
 | |
| +2014-10-10  15:01  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* release 5.20
 | |
| +
 | |
| +2014-08-17  10:01  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* recognize encrypted CDF documents
 | |
| +
 | |
| +2014-08-04   9:18  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* add magic_load_buffers from Brooks Davis
 | |
| +
 | |
| +2014-07-24  16:40  Christos Zoulas <christos@zoulas.com>
 | |
| +
 | |
| +	* add thumbs.db support
 | |
| +
 | |
|  2014-06-12  12:28  Christos Zoulas <christos@zoulas.com>
 | |
|  
 | |
|  	* release 5.19
 | |
| Index: contrib/file/README
 | |
| ===================================================================
 | |
| --- contrib/file/README	(revision 284174)
 | |
| +++ contrib/file/README	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  ## README for file(1) Command ##
 | |
|  
 | |
| -    @(#) $File: README,v 1.48 2014/03/07 13:55:30 christos Exp $
 | |
| +    @(#) $File: README,v 1.49 2015/01/02 20:23:04 christos Exp $
 | |
|  
 | |
|  Mailing List: file@mx.gw.com  
 | |
|  Mailing List archives: http://mx.gw.com/pipermail/file/  
 | |
| @@ -25,8 +25,8 @@ A public read-only git repository of the same sour
 | |
|  
 | |
|  	https://github.com/file/file
 | |
|  
 | |
| -The major changes for 5.x are CDF file parsing, indirect magic, and
 | |
| -overhaul in mime and ascii encoding handling.
 | |
| +The major changes for 5.x are CDF file parsing, indirect magic, name/use
 | |
| +(recursion) and overhaul in mime and ascii encoding handling.
 | |
|  
 | |
|  The major feature of 4.x is the refactoring of the code into a library,
 | |
|  and the re-write of the file command in terms of that library. The library
 | |
| @@ -67,33 +67,41 @@ in magic(5) format please, to the maintainer, Chri
 | |
|  COPYING - read this first.  
 | |
|  README - read this second (you are currently reading this file).  
 | |
|  INSTALL - read on how to install
 | |
| -
 | |
|  src/apprentice.c - parses /etc/magic to learn magic  
 | |
| +src/asctime_r.c - replacement for OS's that don't have it.  
 | |
|  src/apptype.c - used for OS/2 specific application type magic  
 | |
|  src/asprintf.c - replacement for OS's that don't have it.  
 | |
|  src/ascmagic.c - third & last set of tests, based on hardwired assumptions.  
 | |
| -src/asctime_r.c - for systems that don't have it.  
 | |
| -src/asprintf.c - for systems that don't have it.  
 | |
| -src/cdf.c - parser for Microsoft Compound Document Files  
 | |
| +src/asctime_r.c - replacement for OS's that don't have it.  
 | |
| +src/asprintf.c - replacement for OS's that don't have it.  
 | |
| +src/cdf.[ch] - parser for Microsoft Compound Document Files  
 | |
|  src/cdf_time.c - time converter for CDF.  
 | |
|  src/compress.c - handles decompressing files to look inside.  
 | |
| -src/ctime_r.c - for systems that don't have it.  
 | |
| +src/ctime_r.c - replacement for OS's that don't have it.  
 | |
| +src/elfclass.h - common code for elf 32/64.
 | |
|  src/encoding.c - handles unicode encodings  
 | |
|  src/file.c - the main program  
 | |
|  src/file.h - header file  
 | |
| +src/file_opts.h - list of options
 | |
| +src/fmtcheck.c - replacement for OS's that don't have it.  
 | |
|  src/fsmagic.c - first set of tests the program runs, based on filesystem info  
 | |
|  src/funcs.c - utilility functions  
 | |
| -src/getopt_long.c - for systems that don't have it.  
 | |
| -src/getline.c - for systems that don't have it.  
 | |
| +src/getline.c - replacement for OS's that don't have it.  
 | |
| +src/getopt_long.c - replacement for OS's that don't have it.  
 | |
|  src/is_tar.c, tar.h - knows about tarchives (courtesy John Gilmore).  
 | |
|  src/names.h - header file for ascmagic.c  
 | |
| +src/magic.h.in - source file for magic.h
 | |
|  src/magic.c - the libmagic api  
 | |
| +src/pread.c - replacement for OS's that don't have it.  
 | |
|  src/print.c - print results, errors, warnings.  
 | |
|  src/readcdf.c - CDF wrapper.  
 | |
|  src/readelf.[ch] - Stand-alone elf parsing code.  
 | |
|  src/softmagic.c - 2nd set of tests, based on /etc/magic  
 | |
| -src/strlcat.c - for systems that don't have it.  
 | |
| -src/strlcpy.c - for systems that don't have it.  
 | |
| +src/mygetopt.h - replacement for OS's that don't have it.  
 | |
| +src/strcasestr.c - replacement for OS's that don't have it.  
 | |
| +src/strlcat.c - replacement for OS's that don't have it.  
 | |
| +src/strlcpy.c - replacement for OS's that don't have it.  
 | |
| +src/tar.h - tar file definitions
 | |
|  src/vasprintf.c - for systems that don't have it.  
 | |
|  doc/file.man - man page for the command  
 | |
|  doc/magic.man - man page for the magic file, courtesy Guy Harris.
 | |
| Index: contrib/file/TODO
 | |
| ===================================================================
 | |
| --- contrib/file/TODO	(revision 284174)
 | |
| +++ contrib/file/TODO	(working copy)
 | |
| @@ -15,3 +15,5 @@ small amount of C is needed (because fast executio
 | |
|  required for soft magic, not the more detailed information given by
 | |
|  hard-wired routines). In this regard, note that hplip, which is
 | |
|  BSD-licensed, has a magic reimplementation in Python.
 | |
| +
 | |
| +Read the kerberos magic entry for more ideas.
 | |
| Index: contrib/file/config.h.in
 | |
| ===================================================================
 | |
| --- contrib/file/config.h.in	(revision 284174)
 | |
| +++ contrib/file/config.h.in	(working copy)
 | |
| @@ -44,6 +44,9 @@
 | |
|  /* Define to 1 if you have the `fork' function. */
 | |
|  #undef HAVE_FORK
 | |
|  
 | |
| +/* Define to 1 if you have the `freelocale' function. */
 | |
| +#undef HAVE_FREELOCALE
 | |
| +
 | |
|  /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
 | |
|  #undef HAVE_FSEEKO
 | |
|  
 | |
| @@ -95,9 +98,15 @@
 | |
|  /* Define to 1 if you have a working `mmap' system call. */
 | |
|  #undef HAVE_MMAP
 | |
|  
 | |
| +/* Define to 1 if you have the `newlocale' function. */
 | |
| +#undef HAVE_NEWLOCALE
 | |
| +
 | |
|  /* Define to 1 if you have the `pread' function. */
 | |
|  #undef HAVE_PREAD
 | |
|  
 | |
| +/* Define to 1 if you have the `setlocale' function. */
 | |
| +#undef HAVE_SETLOCALE
 | |
| +
 | |
|  /* Define to 1 if you have the <stddef.h> header file. */
 | |
|  #undef HAVE_STDDEF_H
 | |
|  
 | |
| @@ -182,6 +191,9 @@
 | |
|  /* Define to 1 if you have the <unistd.h> header file. */
 | |
|  #undef HAVE_UNISTD_H
 | |
|  
 | |
| +/* Define to 1 if you have the `uselocale' function. */
 | |
| +#undef HAVE_USELOCALE
 | |
| +
 | |
|  /* Define to 1 if you have the `utime' function. */
 | |
|  #undef HAVE_UTIME
 | |
|  
 | |
| @@ -219,6 +231,9 @@
 | |
|  /* Define to 1 if `vfork' works. */
 | |
|  #undef HAVE_WORKING_VFORK
 | |
|  
 | |
| +/* 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. */
 | |
|  #undef HAVE_ZLIB_H
 | |
|  
 | |
| Index: contrib/file/configure
 | |
| ===================================================================
 | |
| --- contrib/file/configure	(revision 284174)
 | |
| +++ contrib/file/configure	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  #! /bin/sh
 | |
|  # Guess values for system-dependent variables and create Makefiles.
 | |
| -# Generated by GNU Autoconf 2.69 for file 5.19.
 | |
| +# Generated by GNU Autoconf 2.69 for file 5.22.
 | |
|  #
 | |
|  # Report bugs to <christos@astron.com>.
 | |
|  #
 | |
| @@ -590,8 +590,8 @@ MAKEFLAGS=
 | |
|  # Identity of this package.
 | |
|  PACKAGE_NAME='file'
 | |
|  PACKAGE_TARNAME='file'
 | |
| -PACKAGE_VERSION='5.19'
 | |
| -PACKAGE_STRING='file 5.19'
 | |
| +PACKAGE_VERSION='5.22'
 | |
| +PACKAGE_STRING='file 5.22'
 | |
|  PACKAGE_BUGREPORT='christos@astron.com'
 | |
|  PACKAGE_URL=''
 | |
|  
 | |
| @@ -1327,7 +1327,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.19 to adapt to many kinds of systems.
 | |
| +\`configure' configures file 5.22 to adapt to many kinds of systems.
 | |
|  
 | |
|  Usage: $0 [OPTION]... [VAR=VALUE]...
 | |
|  
 | |
| @@ -1397,7 +1397,7 @@ fi
 | |
|  
 | |
|  if test -n "$ac_init_help"; then
 | |
|    case $ac_init_help in
 | |
| -     short | recursive ) echo "Configuration of file 5.19:";;
 | |
| +     short | recursive ) echo "Configuration of file 5.22:";;
 | |
|     esac
 | |
|    cat <<\_ACEOF
 | |
|  
 | |
| @@ -1507,7 +1507,7 @@ fi
 | |
|  test -n "$ac_init_help" && exit $ac_status
 | |
|  if $ac_init_version; then
 | |
|    cat <<\_ACEOF
 | |
| -file configure 5.19
 | |
| +file configure 5.22
 | |
|  generated by GNU Autoconf 2.69
 | |
|  
 | |
|  Copyright (C) 2012 Free Software Foundation, Inc.
 | |
| @@ -2163,7 +2163,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.19, which was
 | |
| +It was created by file $as_me 5.22, which was
 | |
|  generated by GNU Autoconf 2.69.  Invocation command line was
 | |
|  
 | |
|    $ $0 $@
 | |
| @@ -3029,7 +3029,7 @@ fi
 | |
|  
 | |
|  # Define the identity of the package.
 | |
|   PACKAGE='file'
 | |
| - VERSION='5.19'
 | |
| + VERSION='5.22'
 | |
|  
 | |
|  
 | |
|  cat >>confdefs.h <<_ACEOF
 | |
| @@ -12785,7 +12785,7 @@ fi
 | |
|  
 | |
|  done
 | |
|  
 | |
| -for ac_header in getopt.h err.h
 | |
| +for ac_header in getopt.h err.h xlocale.h
 | |
|  do :
 | |
|    as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 | |
|  ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
 | |
| @@ -14191,7 +14191,7 @@ fi
 | |
|  fi
 | |
|  
 | |
|  
 | |
| -for ac_func in strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof
 | |
| +for ac_func in strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale setlocale
 | |
|  do :
 | |
|    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 | |
|  ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
 | |
| @@ -14998,7 +14998,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 | |
|  # 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.19, 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
 | |
| @@ -15064,7 +15064,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.19
 | |
| +file config.status 5.22
 | |
|  configured by $0, generated by GNU Autoconf 2.69,
 | |
|    with options \\"\$ac_cs_config\\"
 | |
|  
 | |
| Index: contrib/file/configure.ac
 | |
| ===================================================================
 | |
| --- contrib/file/configure.ac	(revision 284174)
 | |
| +++ contrib/file/configure.ac	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
|  dnl Process this file with autoconf to produce a configure script.
 | |
| -AC_INIT([file],[5.19],[christos@astron.com])
 | |
| +AC_INIT([file],[5.22],[christos@astron.com])
 | |
|  AM_INIT_AUTOMAKE([subdir-objects foreign])
 | |
|  m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 | |
|  
 | |
| @@ -82,7 +82,7 @@ AC_HEADER_MAJOR
 | |
|  AC_HEADER_SYS_WAIT
 | |
|  AC_CHECK_HEADERS(stdint.h fcntl.h locale.h stdint.h inttypes.h unistd.h)
 | |
|  AC_CHECK_HEADERS(stddef.h utime.h wchar.h wctype.h limits.h)
 | |
| -AC_CHECK_HEADERS(getopt.h err.h)
 | |
| +AC_CHECK_HEADERS(getopt.h err.h xlocale.h)
 | |
|  AC_CHECK_HEADERS(sys/mman.h sys/stat.h sys/types.h sys/utime.h sys/time.h)
 | |
|  AC_CHECK_HEADERS(zlib.h)
 | |
|  
 | |
| @@ -138,7 +138,7 @@ else
 | |
|  fi])
 | |
|  
 | |
|  dnl Checks for functions
 | |
| -AC_CHECK_FUNCS(strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof)
 | |
| +AC_CHECK_FUNCS(strerror strndup strtoul mkstemp mkostemp utimes utime wcwidth strtof newlocale uselocale freelocale setlocale)
 | |
|  
 | |
|  dnl Provide implementation of some required functions if necessary
 | |
|  AC_REPLACE_FUNCS(getopt_long asprintf vasprintf strlcpy strlcat getline ctime_r asctime_r pread strcasestr fmtcheck)
 | |
| Index: contrib/file/doc/file.man
 | |
| ===================================================================
 | |
| --- contrib/file/doc/file.man	(revision 284174)
 | |
| +++ contrib/file/doc/file.man	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
| -.\" $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 __CSECTION__
 | |
|  .Os
 | |
|  .Sh NAME
 | |
| @@ -16,6 +16,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
 | |
| @@ -303,6 +304,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
 | |
| @@ -385,6 +396,7 @@ options.
 | |
|  .Xr hexdump 1 ,
 | |
|  .Xr od 1 ,
 | |
|  .Xr strings 1 ,
 | |
| +.Xr fstyp 8
 | |
|  .Sh STANDARDS CONFORMANCE
 | |
|  This program is believed to exceed the System V Interface Definition
 | |
|  of FILE(CMD), as near as one can determine from the vague language
 | |
| Index: contrib/file/doc/libmagic.man
 | |
| ===================================================================
 | |
| --- contrib/file/doc/libmagic.man	(revision 284174)
 | |
| +++ contrib/file/doc/libmagic.man	(working copy)
 | |
| @@ -1,4 +1,4 @@
 | |
| -.\" $File: libmagic.man,v 1.28 2014/03/02 14:47:16 christos Exp $
 | |
| +.\" $File: libmagic.man,v 1.34 2014/12/16 23:18:40 christos Exp $
 | |
|  .\"
 | |
|  .\" Copyright (c) Christos Zoulas 2003.
 | |
|  .\" All Rights Reserved.
 | |
| @@ -25,7 +25,7 @@
 | |
|  .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 | |
|  .\" SUCH DAMAGE.
 | |
|  .\"
 | |
| -.Dd January 6, 2012
 | |
| +.Dd December 16, 2014
 | |
|  .Dt LIBMAGIC 3
 | |
|  .Os
 | |
|  .Sh NAME
 | |
| @@ -40,6 +40,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
 | |
| @@ -71,6 +74,12 @@
 | |
|  .Ft int
 | |
|  .Fn magic_load "magic_t cookie" "const char *filename"
 | |
|  .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
 | |
| @@ -253,6 +262,60 @@ adds
 | |
|  to the database filename as appropriate.
 | |
|  .Pp
 | |
|  The
 | |
| +.Fn magic_load_buffers
 | |
| +function takes an array of size
 | |
| +.Fa nbuffers
 | |
| +of
 | |
| +.Fa buffers
 | |
| +with a respective size for each in the array of
 | |
| +.Fa sizes
 | |
| +loaded with the contents of the magic databases from the filesystem.
 | |
| +This function can be used in environment where the magic library does
 | |
| +not have direct access to the filesystem, but can access the magic
 | |
| +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: contrib/file/doc/magic.man
 | |
| ===================================================================
 | |
| --- contrib/file/doc/magic.man	(revision 284174)
 | |
| +++ contrib/file/doc/magic.man	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
| -.\" $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 __FSECTION__
 | |
|  .Os
 | |
|  .\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
 | |
| @@ -200,6 +200,11 @@ interpreted as a UNIX-style date, but interpreted
 | |
|  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: contrib/file/magic/Magdir/android
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/android	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/android	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------
 | |
| -# $File: android,v 1.4 2014/06/03 19:01:34 christos Exp $
 | |
| +# $File: android,v 1.7 2014/11/10 05:08:23 christos Exp $
 | |
|  # Various android related magic entries
 | |
|  #------------------------------------------------------------
 | |
|  
 | |
| @@ -15,20 +15,11 @@
 | |
|  >0	regex	dey\n[0-9]{2}\0	Dalvik dex file (optimized for host)
 | |
|  >4	string	>000			version %s
 | |
|  
 | |
| -# http://android.stackexchange.com/questions/23357/\
 | |
| -# is-there-a-way-to-look-inside-and-modify-an-adb-backup-created-file/\
 | |
| -# 23608#23608
 | |
| -0	string	ANDROID\040BACKUP\n	Android Backup
 | |
| ->15	string	1\n			\b, version 1
 | |
| ->17	string	0\n			\b, uncompressed
 | |
| ->17	string	1\n			\b, compressed
 | |
| ->19	string	none\n			\b, unencrypted
 | |
| ->19	string	AES-256\n		\b, encrypted AES-256
 | |
| -
 | |
|  # Android bootimg format
 | |
|  # From https://android.googlesource.com/\
 | |
|  # platform/system/core/+/master/mkbootimg/bootimg.h
 | |
|  0		string	ANDROID!	Android bootimg
 | |
| +>1024	string	LOKI\01		\b, LOKI'd
 | |
|  >8		lelong	>0			\b, kernel
 | |
|  >>12	lelong	>0			\b (0x%x)
 | |
|  >16		lelong	>0			\b, ramdisk
 | |
| @@ -38,41 +29,7 @@
 | |
|  >36		lelong	>0			\b, page size: %d
 | |
|  >38		string	>0			\b, name: %s
 | |
|  >64		string	>0		 	\b, cmdline (%s)
 | |
| -# Dalvik .dex format. http://retrodev.com/android/dexformat.html
 | |
| -# From <mkf@google.com> "Mike Fleming"
 | |
| -# Fixed to avoid regexec 17 errors on some dex files
 | |
| -# From <diff@lookout.com> "Tim Strazzere"
 | |
| -0	string	dex\n
 | |
| ->0	regex	dex\n[0-9]{2}\0	Dalvik dex file
 | |
| ->4	string	>000			version %s
 | |
| -0	string	dey\n
 | |
| ->0	regex	dey\n[0-9]{2}\0	Dalvik dex file (optimized for host)
 | |
| ->4	string	>000			version %s
 | |
|  
 | |
| -# http://android.stackexchange.com/questions/23357/\
 | |
| -# is-there-a-way-to-look-inside-and-modify-an-adb-backup-created-file/\
 | |
| -# 23608#23608
 | |
| -0	string	ANDROID\040BACKUP\n	Android Backup
 | |
| ->15	string	1\n			\b, version 1
 | |
| ->17	string	0\n			\b, uncompressed
 | |
| ->17	string	1\n			\b, compressed
 | |
| ->19	string	none\n			\b, unencrypted
 | |
| ->19	string	AES-256\n		\b, encrypted AES-256
 | |
| -
 | |
| -# Android bootimg format
 | |
| -# From https://android.googlesource.com/\
 | |
| -# platform/system/core/+/master/mkbootimg/bootimg.h
 | |
| -0		string	ANDROID!	Android bootimg
 | |
| ->8		lelong	>0			\b, kernel
 | |
| ->>12	lelong	>0			\b (0x%x)
 | |
| ->16		lelong	>0			\b, ramdisk
 | |
| ->>20	lelong	>0			\b (0x%x)
 | |
| ->24		lelong	>0			\b, second stage
 | |
| ->>28	lelong	>0			\b (0x%x)
 | |
| ->36		lelong	>0			\b, page size: %d
 | |
| ->38		string	>0			\b, name: %s
 | |
| ->64		string	>0		 	\b, cmdline (%s)
 | |
| -
 | |
|  # Android Backup archive
 | |
|  # From: Ariel Shkedi
 | |
|  # File extension: .ab
 | |
| @@ -98,3 +55,85 @@
 | |
|  #>>>>>&1	regex/1l .*	\b, PBKDF2 rounds: %s
 | |
|  #>>>>>>&1	regex/1l .*	\b, IV: %s
 | |
|  #>>>>>>>&1	regex/1l .*	\b, Key: %s
 | |
| +
 | |
| +# *.pit files by Joerg Jenderek
 | |
| +# http://forum.xda-developers.com/showthread.php?p=9122369
 | |
| +# http://forum.xda-developers.com/showthread.php?t=816449
 | |
| +# Partition Information Table for Samsung's smartphone with Android
 | |
| +# used by flash software Odin
 | |
| +0		ulelong			0x12349876	
 | |
| +# 1st pit entry marker
 | |
| +>0x01C	ulequad&0xFFFFFFFCFFFFFFFC	=0x0000000000000000	
 | |
| +# minimal 13 and maximal 18 PIT entries found
 | |
| +>>4		ulelong			<128	Partition Information Table for Samsung smartphone
 | |
| +>>>4		ulelong			x	\b, %d entries
 | |
| +# 1. pit entry
 | |
| +>>>4		ulelong			>0	\b; #1
 | |
| +>>>0x01C	use				PIT-entry
 | |
| +>>>4		ulelong			>1	\b; #2
 | |
| +>>>0x0A0	use				PIT-entry
 | |
| +>>>4		ulelong			>2	\b; #3
 | |
| +>>>0x124	use				PIT-entry
 | |
| +>>>4		ulelong			>3	\b; #4
 | |
| +>>>0x1A8	use				PIT-entry
 | |
| +>>>4		ulelong			>4	\b; #5
 | |
| +>>>0x22C	use				PIT-entry
 | |
| +>>>4		ulelong			>5	\b; #6
 | |
| +>>>0x2B0	use				PIT-entry
 | |
| +>>>4		ulelong			>6	\b; #7
 | |
| +>>>0x334	use				PIT-entry
 | |
| +>>>4		ulelong			>7 	\b; #8
 | |
| +>>>0x3B8	use				PIT-entry
 | |
| +>>>4		ulelong			>8 	\b; #9
 | |
| +>>>0x43C	use				PIT-entry
 | |
| +>>>4		ulelong			>9	\b; #10
 | |
| +>>>0x4C0	use				PIT-entry
 | |
| +>>>4		ulelong			>10	\b; #11
 | |
| +>>>0x544	use				PIT-entry
 | |
| +>>>4		ulelong			>11	\b; #12
 | |
| +>>>0x5C8	use				PIT-entry
 | |
| +>>>4		ulelong			>12	\b; #13
 | |
| +>>>>0x64C	use				PIT-entry
 | |
| +# 14. pit entry
 | |
| +>>>4		ulelong			>13	\b; #14
 | |
| +>>>>0x6D0	use				PIT-entry
 | |
| +>>>4		ulelong			>14	\b; #15
 | |
| +>>>0x754	use				PIT-entry
 | |
| +>>>4		ulelong			>15	\b; #16
 | |
| +>>>0x7D8	use				PIT-entry
 | |
| +>>>4		ulelong			>16	\b; #17
 | |
| +>>>0x85C	use				PIT-entry
 | |
| +# 18. pit entry
 | |
| +>>>4		ulelong			>17	\b; #18
 | |
| +>>>0x8E0	use				PIT-entry
 | |
| +
 | |
| +0	name			PIT-entry
 | |
| +# garbage value implies end of pit entries
 | |
| +>0x00		ulequad&0xFFFFFFFCFFFFFFFC	=0x0000000000000000	
 | |
| +# skip empty partition name
 | |
| +>>0x24		ubyte				!0			
 | |
| +# partition name
 | |
| +>>>0x24		string				>\0			%-.32s
 | |
| +# flags
 | |
| +>>>0x0C		ulelong&0x00000002		2			\b+RW
 | |
| +# partition ID:
 | |
| +# 0~IPL,MOVINAND,GANG;1~PIT,GPT;2~HIDDEN;3~SBL,HIDDEN;4~SBL2,HIDDEN;5~BOOT;6~KENREl,RECOVER,misc;7~RECOVER
 | |
| +# ;11~MODEM;20~efs;21~PARAM;22~FACTORY,SYSTEM;23~DBDATAFS,USERDATA;24~CACHE;80~BOOTLOADER;81~TZSW
 | |
| +>>>0x08	ulelong		x			(0x%x)
 | |
| +# filename
 | |
| +>>>0x44		string				>\0			"%-.64s"
 | |
| +#>>>0x18	ulelong				>0			
 | |
| +# blocksize in 512 byte units ?
 | |
| +#>>>>0x18	ulelong				x			\b, %db
 | |
| +# partition size in blocks ?
 | |
| +#>>>>0x22	ulelong				x			\b*%d
 | |
| +
 | |
| +# Android bootimg format
 | |
| +# From https://android.googlesource.com/\
 | |
| +# platform/system/core/+/master/libsparse/sparse_format.h
 | |
| +0		lelong	0xed26ff3a		Android sparse image
 | |
| +>4		leshort	x			\b, version: %d
 | |
| +>6		leshort	x			\b.%d
 | |
| +>16		lelong	x			\b, Total of %d
 | |
| +>12		lelong	x			\b %d-byte output blocks in
 | |
| +>20		lelong	x			\b %d input chunks.
 | |
| Index: contrib/file/magic/Magdir/animation
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/animation	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/animation	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: animation,v 1.53 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: animation,v 1.56 2014/10/23 23:12:51 christos Exp $
 | |
|  # animation:  file(1) magic for animation/movie formats
 | |
|  #
 | |
|  # animation formats
 | |
| @@ -32,43 +32,155 @@
 | |
|  !:mime	application/x-quicktime-player
 | |
|  4	string/W	jP		JPEG 2000 image
 | |
|  !:mime	image/jp2
 | |
| +# http://www.ftyps.com/ with local additions
 | |
|  4	string		ftyp		ISO Media
 | |
| ->8	string		isom		\b, MPEG v4 system, version 1
 | |
| -!:mime	video/mp4
 | |
| ->8	string		iso2		\b, MPEG v4 system, part 12 revision
 | |
| ->8	string		mp41		\b, MPEG v4 system, version 1
 | |
| -!:mime	video/mp4
 | |
| ->8	string		mp42		\b, MPEG v4 system, version 2
 | |
| -!:mime	video/mp4
 | |
| ->8	string		mp7t		\b, MPEG v4 system, MPEG v7 XML
 | |
| ->8	string		mp7b		\b, MPEG v4 system, MPEG v7 binary XML
 | |
| ->8	string/W	jp2		\b, JPEG 2000
 | |
| -!:mime	image/jp2
 | |
| +>8	string		3g2		\b, MPEG v4 system, 3GPP2
 | |
| +!:mime	video/3gpp2
 | |
| +>>11	byte		4		\b v4 (H.263/AMR GSM 6.10)
 | |
| +>>11	byte		5		\b v5 (H.263/AMR GSM 6.10)
 | |
| +>>11	byte		6		\b v6 (ITU H.264/AMR GSM 6.10)
 | |
| +>>11	byte		a		\b C.S0050-0 V1.0
 | |
| +>>11	byte		b		\b C.S0050-0-A V1.0.0
 | |
| +>>11	byte		c		\b C.S0050-0-B V1.0
 | |
|  >8	string		3ge		\b, MPEG v4 system, 3GPP
 | |
|  !:mime	video/3gpp
 | |
| +>>11	byte		6		\b, Release 6 MBMS Extended Presentations
 | |
| +>>11	byte		7		\b, Release 7 MBMS Extended Presentations
 | |
|  >8	string		3gg		\b, MPEG v4 system, 3GPP
 | |
| +>11	byte		6		\b, Release 6 General Profile
 | |
|  !:mime	video/3gpp
 | |
|  >8	string		3gp		\b, MPEG v4 system, 3GPP
 | |
| +>11	byte		1		\b, Release %d (non existent)
 | |
| +>11	byte		2		\b, Release %d (non existent)
 | |
| +>11	byte		3		\b, Release %d (non existent)
 | |
| +>11	byte		4		\b, Release %d
 | |
| +>11	byte		5		\b, Release %d
 | |
| +>11	byte		6		\b, Release %d
 | |
| +>11	byte		7		\b, Release %d Streaming Servers
 | |
|  !:mime	video/3gpp
 | |
|  >8	string		3gs		\b, MPEG v4 system, 3GPP
 | |
| +>11	byte		7		\b, Release %d Streaming Servers
 | |
|  !:mime	video/3gpp
 | |
| ->8	string		3g2		\b, MPEG v4 system, 3GPP2
 | |
| +>8	string		avc1		\b, MPEG v4 system, 3GPP JVT AVC [ISO 14496-12:2005]
 | |
| +!:mime	video/mp4
 | |
| +>8	string/W	qt		\b, Apple QuickTime movie
 | |
| +!:mime	video/quicktime
 | |
| +>8	string		CAEP		\b, Canon Digital Camera
 | |
| +>8	string		caqv		\b, Casio Digital Camera
 | |
| +>8	string		CDes		\b, Convergent Design
 | |
| +>8	string		da0a		\b, DMB MAF w/ MPEG Layer II aud, MOT slides, DLS, JPG/PNG/MNG
 | |
| +>8	string		da0b		\b, DMB MAF, ext DA0A, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		da1a		\b, DMB MAF audio with ER-BSAC audio, JPG/PNG/MNG images
 | |
| +>8	string		da1b		\b, DMB MAF, ext da1a, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		da2a		\b, DMB MAF aud w/ HE-AAC v2 aud, MOT slides, DLS, JPG/PNG/MNG
 | |
| +>8	string		da2b		\b, DMB MAF, ext da2a, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		da3a		\b, DMB MAF aud with HE-AAC aud, JPG/PNG/MNG images
 | |
| +>8	string		da3b		\b, DMB MAF, ext da3a w/ BIFS, 3GPP, DID, TVA, REL, IPMP
 | |
| +>8	string		dmb1		\b, DMB MAF supporting all the components defined in the spec
 | |
| +>8	string		dmpf		\b, Digital Media Project
 | |
| +>8	string		drc1		\b, Dirac (wavelet compression), encap in ISO base media (MP4)
 | |
| +>8	string		dv1a		\b, DMB MAF vid w/ AVC vid, ER-BSAC aud, BIFS, JPG/PNG/MNG, TS
 | |
| +>8	string		dv1b		\b, DMB MAF, ext dv1a, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		dv2a		\b, DMB MAF vid w/ AVC vid, HE-AAC v2 aud, BIFS, JPG/PNG/MNG, TS
 | |
| +>8	string		dv2b		\b, DMB MAF, ext dv2a, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		dv3a		\b, DMB MAF vid w/ AVC vid, HE-AAC aud, BIFS, JPG/PNG/MNG, TS
 | |
| +>8	string		dv3b		\b, DMB MAF, ext dv3a, with 3GPP timed text, DID, TVA, REL, IPMP
 | |
| +>8	string		dvr1		\b, DVB (.DVB) over RTP
 | |
| +!:mime	video/vnd.dvb.file
 | |
| +>8	string		dvt1		\b, DVB (.DVB) over MPEG-2 Transport Stream
 | |
| +!:mime	video/vnd.dvb.file
 | |
| +>8	string		F4V		\b, Video for Adobe Flash Player 9+ (.F4V)
 | |
| +!:mime	video/mp4
 | |
| +>8	string		F4P		\b, Protected Video for Adobe Flash Player 9+ (.F4P)
 | |
| +!:mime	video/mp4
 | |
| +>8	string		F4A		\b, Audio for Adobe Flash Player 9+ (.F4A)
 | |
| +!:mime	audio/mp4
 | |
| +>8	string		F4B		\b, Audio Book for Adobe Flash Player 9+ (.F4B)
 | |
| +!:mime	audio/mp4
 | |
| +>8	string		isc2		\b, ISMACryp 2.0 Encrypted File
 | |
| +#	?/enc-isoff-generic
 | |
| +>8	string		iso2		\b, MP4 Base Media v2 [ISO 14496-12:2005]
 | |
| +!:mime	video/mp4
 | |
| +>8	string		isom		\b, MP4 Base Media v1 [IS0 14496-12:2003]
 | |
| +!:mime	video/mp4
 | |
| +>8	string/W	jp2		\b, JPEG 2000
 | |
| +!:mime	image/jp2
 | |
| +>8	string		JP2		\b, JPEG 2000 Image (.JP2) [ISO 15444-1 ?]
 | |
| +!:mime	image/jp2
 | |
| +>8	string		JP20		\b, Unknown, from GPAC samples (prob non-existent)
 | |
| +>8	string		jpm		\b, JPEG 2000 Compound Image (.JPM) [ISO 15444-6]
 | |
| +!:mime	image/jpm
 | |
| +>8	string		jpx		\b, JPEG 2000 w/ extensions (.JPX) [ISO 15444-2]
 | |
| +!:mime	image/jpx
 | |
| +>8	string		KDDI		\b, 3GPP2 EZmovie for KDDI 3G cellphones
 | |
|  !:mime	video/3gpp2
 | |
| ->>11	byte		4		\b v4 (H.263/AMR GSM 6.10)
 | |
| ->>11	byte		5		\b v5 (H.263/AMR GSM 6.10)
 | |
| ->>11	byte		6		\b v6 (ITU H.264/AMR GSM 6.10)
 | |
| +>8	string		M4A 		\b, Apple iTunes ALAC/AAC-LC (.M4A) Audio
 | |
| +!:mime	audio/x-m4a
 | |
| +>8	string		M4B 		\b, Apple iTunes ALAC/AAC-LC (.M4B) Audio Book
 | |
| +!:mime	audio/mp4
 | |
| +>8	string		M4P 		\b, Apple iTunes ALAC/AAC-LC (.M4P) AES Protected Audio
 | |
| +!:mime	video/mp4
 | |
| +>8	string		M4V 		\b, Apple iTunes Video (.M4V) Video
 | |
| +!:mime	video/x-m4v
 | |
| +>8	string		M4VH		\b, Apple TV (.M4V)
 | |
| +!:mime	video/x-m4v
 | |
| +>8	string		M4VP		\b, Apple iPhone (.M4V)
 | |
| +!:mime	video/x-m4v
 | |
| +>8	string		mj2s		\b, Motion JPEG 2000 [ISO 15444-3] Simple Profile
 | |
| +!:mime	video/mj2
 | |
| +>8	string		mjp2		\b, Motion JPEG 2000 [ISO 15444-3] General Profile
 | |
| +!:mime	video/mj2
 | |
| +>8	string		mmp4		\b, MPEG-4/3GPP Mobile Profile (.MP4 / .3GP) (for NTT)
 | |
| +!:mime	video/mp4
 | |
| +>8	string		mobi		\b, MPEG-4, MOBI format
 | |
| +!:mime	video/mp4
 | |
| +>8	string		mp21		\b, MPEG-21 [ISO/IEC 21000-9]
 | |
| +>8	string		mp41		\b, MP4 v1 [ISO 14496-1:ch13]
 | |
| +!:mime	video/mp4
 | |
| +>8	string		mp42		\b, MP4 v2 [ISO 14496-14]
 | |
| +!:mime	video/mp4
 | |
| +>8	string		mp71		\b, MP4 w/ MPEG-7 Metadata [per ISO 14496-12]
 | |
| +>8	string		mp7t		\b, MPEG v4 system, MPEG v7 XML
 | |
| +>8	string		mp7b		\b, MPEG v4 system, MPEG v7 binary XML
 | |
|  >8	string		mmp4		\b, MPEG v4 system, 3GPP Mobile
 | |
|  !:mime	video/mp4
 | |
| ->8	string		avc1		\b, MPEG v4 system, 3GPP JVT AVC
 | |
| -!:mime	video/3gpp
 | |
| ->8	string/W	M4A		\b, MPEG v4 system, iTunes AAC-LC
 | |
| +>8	string		MPPI		\b, Photo Player, MAF [ISO/IEC 23000-3]
 | |
| +>8	string		mqt		\b, Sony / Mobile QuickTime (.MQV) US Pat 7,477,830
 | |
| +!:mime	video/quicktime
 | |
| +>8	string		MSNV		\b, MPEG-4 (.MP4) for SonyPSP
 | |
|  !:mime	audio/mp4
 | |
| ->8	string/W	M4V		\b, MPEG v4 system, iTunes AVC-LC
 | |
| +>8	string		NDAS		\b, MP4 v2 [ISO 14496-14] Nero Digital AAC Audio
 | |
| +!:mime	audio/mp4
 | |
| +>8	string		NDSC		\b, MPEG-4 (.MP4) Nero Cinema Profile
 | |
|  !:mime	video/mp4
 | |
| ->8	string/W	M4P		\b, MPEG v4 system, iTunes AES encrypted
 | |
| ->8	string/W	M4B		\b, MPEG v4 system, iTunes bookmarked
 | |
| ->8	string/W	qt		\b, Apple QuickTime movie
 | |
| +>8	string		NDSH		\b, MPEG-4 (.MP4) Nero HDTV Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDSM		\b, MPEG-4 (.MP4) Nero Mobile Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDSP		\b, MPEG-4 (.MP4) Nero Portable Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDSS		\b, MPEG-4 (.MP4) Nero Standard Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDXC		\b, H.264/MPEG-4 AVC (.MP4) Nero Cinema Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDXH		\b, H.264/MPEG-4 AVC (.MP4) Nero HDTV Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDXM		\b, H.264/MPEG-4 AVC (.MP4) Nero Mobile Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDXP		\b, H.264/MPEG-4 AVC (.MP4) Nero Portable Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		NDXS		\b, H.264/MPEG-4 AVC (.MP4) Nero Standard Profile
 | |
| +!:mime	video/mp4
 | |
| +>8	string		odcf  		\b, OMA DCF DRM Format 2.0 (OMA-TS-DRM-DCF-V2_0-20060303-A)
 | |
| +>8	string		opf2 		\b, OMA PDCF DRM Format 2.1 (OMA-TS-DRM-DCF-V2_1-20070724-C)
 | |
| +>8	string		opx2  		\b, OMA PDCF DRM + XBS ext (OMA-TS-DRM_XBS-V1_0-20070529-C)
 | |
| +>8	string		pana		\b, Panasonic Digital Camera
 | |
| +>8	string		qt  		\b, Apple QuickTime (.MOV/QT)
 | |
|  !:mime	video/quicktime
 | |
| +>8	string		ROSS		\b, Ross Video
 | |
| +>8	string		sdv		\b, SD Memory Card Video
 | |
| +>8	string		ssc1		\b, Samsung stereo, single stream (patent pending)
 | |
| +>8	string		ssc2		\b, Samsung stereo, dual stream (patent pending)
 | |
|  
 | |
|  # MPEG sequences
 | |
|  # Scans for all common MPEG header start codes
 | |
| Index: contrib/file/magic/Magdir/archive
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/archive	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/archive	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: archive,v 1.87 2014/06/03 19:15:58 christos Exp $
 | |
| +# $File: archive,v 1.88 2014/08/16 10:42:17 christos Exp $
 | |
|  # archive:  file(1) magic for archive formats (see also "msdos" for self-
 | |
|  #           extracting compressed archives)
 | |
|  #
 | |
| @@ -954,34 +954,3 @@
 | |
|  >0xE08	search/7776		\x55\xAA	
 | |
|  >>&-512	indirect		x		\b; contains 
 | |
|  
 | |
| -# Symantec GHOST image by Joerg Jenderek at May 2014
 | |
| -# http://us.norton.com/ghost/
 | |
| -# http://www.garykessler.net/library/file_sigs.html
 | |
| -0		ubelong&0xFFFFf7f0	0xFEEF0100	Norton GHost image
 | |
| -# *.GHO
 | |
| ->2		ubyte&0x08		0x00		\b, first file
 | |
| -# *.GHS or *.[0-9] with cns program option
 | |
| ->2		ubyte&0x08		0x08		\b, split file
 | |
| -# part of split index interesting for *.ghs
 | |
| ->>4		ubyte			x		id=0x%x
 | |
| -# compression tag minus one equals numeric compression command line switch z[1-9]
 | |
| ->3		ubyte			0		\b, no compression
 | |
| ->3		ubyte			2		\b, fast compression (Z1)
 | |
| ->3		ubyte			3		\b, medium compression (Z2)
 | |
| ->3		ubyte			>3		
 | |
| ->>3		ubyte			<11		\b, compression (Z%d-1)
 | |
| ->2		ubyte&0x08		0x00		
 | |
| -# ~ 30 byte password field only for *.gho
 | |
| ->>12		ubequad			!0		\b, password protected
 | |
| ->>44		ubyte			!1		
 | |
| -# 1~Image All, sector-by-sector only for *.gho
 | |
| ->>>10		ubyte			1		\b, sector copy
 | |
| -# 1~Image Boot track only for *.gho
 | |
| ->>>43		ubyte			1		\b, boot track
 | |
| -# 1~Image Disc only for *.gho implies Image Boot track and sector copy
 | |
| ->>44		ubyte			1		\b, disc sector copy
 | |
| -# optional image description only *.gho
 | |
| ->>0xff		string			>\0		"%-.254s"
 | |
| -# look for DOS sector end sequence
 | |
| ->0xE08	search/7776		\x55\xAA	
 | |
| ->>&-512	indirect		x		\b; contains 
 | |
| Index: contrib/file/magic/Magdir/blender
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/blender	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/blender	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: blender,v 1.5 2009/09/19 16:28:08 christos Exp $
 | |
| +# $File: blender,v 1.6 2014/08/30 08:34:17 christos Exp $
 | |
|  # blender: file(1) magic for Blender 3D related files
 | |
|  #
 | |
|  # Native format rule v1.2. For questions use the developers list 
 | |
| @@ -35,5 +35,5 @@
 | |
|  >>>0x44		string	=GLOB		\b.
 | |
|  >>>>0x60	beshort	x		\b%.4d
 | |
|  
 | |
| -# Scripts that run in the embeded Python interpreter
 | |
| +# Scripts that run in the embedded Python interpreter
 | |
|  0		string	#!BPY		Blender3D BPython script
 | |
| Index: contrib/file/magic/Magdir/cafebabe
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/cafebabe	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/cafebabe	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: cafebabe,v 1.16 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: cafebabe,v 1.17 2015/01/01 17:07:00 christos Exp $
 | |
|  # Cafe Babes unite!
 | |
|  #
 | |
|  # Since Java bytecode and Mach-O universal binaries have the same magic number,
 | |
| @@ -45,7 +45,7 @@
 | |
|  
 | |
|  0	name		mach-o		\b [
 | |
|  >0	use		mach-o-cpu	\b
 | |
| ->&(8.L)	indirect			\b: 
 | |
| +>(8.L)	indirect			\b: 
 | |
|  >0	belong		x		\b]
 | |
|  
 | |
|  0	belong		0xcafebabe
 | |
| Index: contrib/file/magic/Magdir/commands
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/commands	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/commands	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: commands,v 1.50 2014/05/30 16:48:44 christos Exp $
 | |
| +# $File: commands,v 1.51 2014/09/27 00:12:55 christos Exp $
 | |
|  # commands:  file(1) magic for various shells and interpreters
 | |
|  #
 | |
|  #0	string/w	:			shell archive or script for antique kernel text
 | |
| @@ -56,7 +56,7 @@
 | |
|  !:mime	text/x-awk
 | |
|  0	string/wt	#!\ /usr/bin/awk	awk script text executable
 | |
|  !:mime	text/x-awk
 | |
| -0	regex/4096	=^\\s{0,100}BEGIN\\s{0,100}[{]	awk script text
 | |
| +0	regex/4096	=^\\s{0,100}BEGIN\\s{0,100}[{]	awk or perl script text
 | |
|  
 | |
|  # AT&T Bell Labs' Plan 9 shell
 | |
|  0	string/wt	#!\ /bin/rc	Plan 9 rc shell script text executable
 | |
| Index: contrib/file/magic/Magdir/compress
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/compress	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/compress	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: compress,v 1.58 2014/05/07 19:36:59 christos Exp $
 | |
| +# $File: compress,v 1.62 2014/09/13 14:27:12 christos Exp $
 | |
|  # compress:  file(1) magic for pure-compression formats (no archives)
 | |
|  #
 | |
|  # compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
 | |
| @@ -251,3 +251,13 @@
 | |
|  # http://code.google.com/p/snappy/source/browse/trunk/framing_format.txt
 | |
|  0	string	\377\006\0\0sNaPpY	snappy framed data
 | |
|  !:mime	application/x-snappy-framed
 | |
| +
 | |
| +# qpress, http://www.quicklz.com/
 | |
| +0	string	qpress10	qpress compressed data
 | |
| +!:mime	application/x-qpress
 | |
| +
 | |
| +# Zlib https://www.ietf.org/rfc/rfc6713.txt
 | |
| +0	beshort%31	=0	
 | |
| +>0	byte&0xf	=8
 | |
| +>>0	byte&0x80 	=0	zlib compressed data
 | |
| +!:mime	application/zlib
 | |
| Index: contrib/file/magic/Magdir/database
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/database	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/database	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: database,v 1.41 2014/06/03 19:17:27 christos Exp $
 | |
| +# $File: database,v 1.43 2014/10/28 15:47:39 christos Exp $
 | |
|  # database:  file(1) magic for various databases
 | |
|  #
 | |
|  # extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
 | |
| @@ -9,10 +9,18 @@
 | |
|  # GDBM magic numbers
 | |
|  #  Will be maintained as part of the GDBM distribution in the future.
 | |
|  #  <downsj@teeny.org>
 | |
| -0	belong	0x13579ace	GNU dbm 1.x or ndbm database, big endian
 | |
| +0	belong	0x13579acd	GNU dbm 1.x or ndbm database, big endian, 32-bit
 | |
|  !:mime	application/x-gdbm
 | |
| -0	lelong	0x13579ace	GNU dbm 1.x or ndbm database, little endian
 | |
| +0	belong	0x13579ace	GNU dbm 1.x or ndbm database, big endian, old
 | |
|  !:mime	application/x-gdbm
 | |
| +0	belong	0x13579acf	GNU dbm 1.x or ndbm database, big endian, 64-bit
 | |
| +!:mime	application/x-gdbm
 | |
| +0	lelong	0x13579acd	GNU dbm 1.x or ndbm database, little endian, 32-bit
 | |
| +!:mime	application/x-gdbm
 | |
| +0	lelong	0x13579ace	GNU dbm 1.x or ndbm database, little endian, old
 | |
| +!:mime	application/x-gdbm
 | |
| +0	lelong	0x13579acf	GNU dbm 1.x or ndbm database, little endian, 64-bit
 | |
| +!:mime	application/x-gdbm
 | |
|  0	string	GDBM		GNU dbm 2.x database
 | |
|  !:mime	application/x-gdbm
 | |
|  #
 | |
| @@ -202,27 +210,27 @@
 | |
|  # for multiple index files (*.MDX) Production flag,tag numbers(<=0x30),tag length(<=0x20), reserverd (NULL) 
 | |
|  >>>>>>>24	ubelong&0x0133f7ff	>0		
 | |
|  # test for reserved NULL byte
 | |
| ->>>>>>>>47	ubyte			x		
 | |
| +>>>>>>>>47	ubyte			0		
 | |
|  # test for valid TAG key format (0x10 or 0)
 | |
|  >>>>>>>>>559	ubyte&0xeF		0		
 | |
|  # test MM <= 12
 | |
| ->>>>>>>>>45	ubeshort		<0x0C20		
 | |
| ->>>>>>>>>>45	ubyte			>0		
 | |
| ->>>>>>>>>>>46	ubyte			<32		
 | |
| ->>>>>>>>>>>>46	ubyte			>0		
 | |
| +>>>>>>>>>>45	ubeshort		<0x0C20		
 | |
| +>>>>>>>>>>>45	ubyte			>0		
 | |
| +>>>>>>>>>>>>46	ubyte			<32		
 | |
| +>>>>>>>>>>>>>46	ubyte			>0		
 | |
|  #!:mime	application/x-mdx
 | |
| ->>>>>>>>>>>>>0	use			xbase-type
 | |
| ->>>>>>>>>>>>>0	ubyte			x		\b MDX
 | |
| ->>>>>>>>>>>>>1	ubyte			x		\b, creation-date
 | |
| ->>>>>>>>>>>>>1	use			xbase-date
 | |
| ->>>>>>>>>>>>>44	ubyte			x		\b, update-date
 | |
| ->>>>>>>>>>>>>44	use			xbase-date
 | |
| +>>>>>>>>>>>>>>0		use		xbase-type
 | |
| +>>>>>>>>>>>>>>0		ubyte		x		\b MDX
 | |
| +>>>>>>>>>>>>>>1		ubyte		x		\b, creation-date
 | |
| +>>>>>>>>>>>>>>1		use		xbase-date
 | |
| +>>>>>>>>>>>>>>44	ubyte		x		\b, update-date
 | |
| +>>>>>>>>>>>>>>44	use		xbase-date
 | |
|  # No.of tags in use (1,2,5,12)
 | |
| ->>>>>>>>>>>>>28	uleshort		x		\b, %d
 | |
| +>>>>>>>>>>>>>>28	uleshort	x		\b, %d
 | |
|  # No. of entries in tag (0x30)
 | |
| ->>>>>>>>>>>>>25	ubyte			x		\b/%d tags
 | |
| +>>>>>>>>>>>>>>25	ubyte		x		\b/%d tags
 | |
|  #  Length of tag
 | |
| ->>>>>>>>>>>>>26	ubyte			x		* %d
 | |
| +>>>>>>>>>>>>>>26	ubyte		x		* %d
 | |
|  # 1st tag name_
 | |
|  >>>>>>>>>>>>>548	string		x		\b, 1st tag "%.11s"
 | |
|  # 2nd tag name
 | |
| @@ -337,60 +345,103 @@
 | |
|  # dBASE III
 | |
|  >>>>>>16	ubyte		3		
 | |
|  # dBASE III DBT
 | |
| ->>>>>>>0	use		xbase-memo-print
 | |
| -# dBASE IV DBT , FoxPro FPT or many PNG , ZIP , DBF garbage
 | |
| +>>>>>>>0	use		dbase3-memo-print
 | |
| +# dBASE III DBT without version, dBASE IV DBT , FoxPro FPT , or many ZIP , DBF garbage
 | |
|  >>>>>>16	ubyte		0		
 | |
| -# dBASE IV DBT with DBF name or DBF garbage
 | |
| ->>>>>>>8	ubelong		>0x40000000	
 | |
| -# skip DBF and catch dBASE IV DBT with DBF name and with non big index of next free block
 | |
| ->>>>>>>>0	ulelong		<0x01010002	
 | |
| ->>>>>>>>>0	use		xbase-memo-print
 | |
| ->>>>>>>8	ubelong		0		
 | |
| +# unusual dBASE III DBT like angest.dbt, dBASE IV DBT with block size 0 , FoxPro FPT ,  or garbage PCX DBF
 | |
| +>>>>>>>20	uleshort	0		
 | |
| +# FoxPro FPT , unusual dBASE III DBT like biblio.dbt or garbage
 | |
| +>>>>>>>>8	ulong		=0		
 | |
| +>>>>>>>>>6	ubeshort	>0		
 | |
| +# skip emacs.PIF
 | |
| +>>>>>>>>>>4	ushort		0		
 | |
| +>>>>>>>>>>>0	use		foxpro-memo-print
 | |
| +# dBASE III DBT , garbage
 | |
| +>>>>>>>>>6	ubeshort	0		
 | |
|  # skip MM*DD*.bin by test for for reserved NULL byte
 | |
| ->>>>>>>>508	ubelong		0		
 | |
| -# real memo files should contain text here
 | |
| ->>>>>>>>>520	ubelong		>0x20202019	
 | |
| ->>>>>>>>>>520	ubelong		<0xFEFEFEFF	
 | |
| ->>>>>>>>>>>0	use		xbase-memo-print
 | |
| -# garbage PCX , ZIP , JAR , XPI 
 | |
| ->>>>>>>8	default		x		
 | |
| +>>>>>>>>>>510	ubeshort	0		
 | |
| +# skip TK-DOS11.img image by looking for memo text
 | |
| +>>>>>>>>>>>512	ubelong		<0xfeffff03	
 | |
| +# skip EFI executables by looking for memo text
 | |
| +>>>>>>>>>>>>512	ubelong		>0x1F202020	
 | |
| +>>>>>>>>>>>>>513 ubyte		>0		
 | |
| +# unusual dBASE III DBT like adressen.dbt
 | |
| +>>>>>>>>>>>>>>0	use		dbase3-memo-print
 | |
| +# dBASE III DBT like angest.dbt, or garbage PCX DBF
 | |
| +>>>>>>>>8	ubelong		!0		
 | |
| +# skip PCX and some DBF by test for for reserved NULL bytes
 | |
| +>>>>>>>>>510	ubeshort	0		
 | |
| +# skip some DBF by test of invalid version
 | |
| +>>>>>>>>>>0	ubyte		>5		
 | |
| +>>>>>>>>>>>0	ubyte		<48		
 | |
| +>>>>>>>>>>>>0	use		dbase3-memo-print
 | |
| +# dBASE IV DBT with positive block size
 | |
| +>>>>>>>20	uleshort	>0		
 | |
| +>>>>>>>>0	use		dbase4-memo-print
 | |
|  
 | |
| -#		Print the information of dBase DBT or FoxPro FPT memo files 
 | |
| -0	name				xbase-memo-print
 | |
| ->0	ubyte			x		
 | |
| -# test version
 | |
| -# memo file
 | |
| ->>16	ubyte			3		dBase III DBT
 | |
| ->>16	ubyte			0		
 | |
| ->>>512	ubelong			<0x00000003	FoxPro FPT
 | |
| -# Size of blocks for FoxPro
 | |
| ->>>>6	ubeshort		x		\b, blocks size %u
 | |
| -# Number of next available block for appending data for FoxPro
 | |
| ->>>>0	ubelong			=0		\b, next free block index %u
 | |
| ->>>>0	ubelong			!0		\b, next free block index %u
 | |
| ->>>512	default			x		dBase IV DBT
 | |
| -# DBF file name without extension
 | |
| ->>>>8	string			>\0		\b of %-.8s.DBF
 | |
| -# size of blocks  ; not reliable 0x2020204C
 | |
| -#>>>>4	ulelong			=0		\b, blocks size %u
 | |
| ->>>>4	ulelong			!0		\b, blocks size %u
 | |
| -# Block length found 0 , 512
 | |
| -#>>>>20	uleshort		=0		\b, block length %u
 | |
| ->>>>20	uleshort		!0		\b, block length %u
 | |
| +#		Print the information of dBase III DBT memo file 
 | |
| +0	name				dbase3-memo-print
 | |
| +>0	ubyte			x		dBase III DBT
 | |
| +# instead 3 as version number 0 for unusual examples like biblio.dbt
 | |
| +>16	ubyte			!3		\b, version number %u
 | |
|  # Number of next available block for appending data
 | |
| ->>>>0	ulelong			=0		\b, next free block index %u
 | |
| ->>>>0	ulelong			!0		\b, next free block index %u
 | |
| ->>512	ubelong			x		
 | |
| ->>>512	ubelong			=0xFFFF0800	
 | |
| ->>>>520	string			>\0		\b, 1st used item "%s"
 | |
| -# FoxPro
 | |
| ->>>512	ubelong			<3		
 | |
| -# FoxPro memo
 | |
| ->>>>512	ubelong			=1		
 | |
| ->>>>520	string			>\0		\b, 1st used item "%s"
 | |
| ->>>512	default			x		
 | |
| -# may be deleted memo field
 | |
| ->>>>512	string			>\0		\b, 1st item "%s"
 | |
| +#>0	lelong			=0		\b, next free block index %u
 | |
| +>0	lelong			!0		\b, next free block index %u
 | |
| +# no positiv block length
 | |
| +#>20	uleshort		=0		\b, block length %u
 | |
| +>20	uleshort		!0		\b, block length %u
 | |
| +# dBase III memo field terminated by \032\032
 | |
| +>512	string			>\0		\b, 1st item "%s"
 | |
| +#		Print the information of dBase IV DBT memo file 
 | |
| +0	name				dbase4-memo-print
 | |
| +>0		lelong		x		dBase IV DBT
 | |
| +# 8 character shorted main name of coresponding dBASE IV DBF file
 | |
| +>8		ubelong		>0x20000000	
 | |
| +# skip unusual like for angest.dbt
 | |
| +>>20		uleshort	>0	
 | |
| +>>>8		string		>\0		\b of %-.8s.DBF
 | |
| +# value 0 implies 512 as size
 | |
| +#>4		ulelong		=0		\b, blocks size %u
 | |
| +# size of blocks not reliable like 0x2020204C in angest.dbt
 | |
| +>4		ulelong		!0		
 | |
| +>>4		ulelong&0x0000003f	0	\b, blocks size %u
 | |
| +# dBase IV DBT with positive block length (found 512 , 1024)
 | |
| +>20		uleshort	>0		\b, block length %u
 | |
| +# next available block
 | |
| +#>0		lelong		=0		\b, next free block index %u
 | |
| +>0		lelong		!0		\b, next free block index %u
 | |
| +>20		uleshort	>0		
 | |
| +>>(20.s)	ubelong		x		
 | |
| +>>>&-4		use		dbase4-memofield-print
 | |
| +# unusual dBase IV DBT without block length (implies 512 as length)
 | |
| +>20		uleshort	=0		
 | |
| +>>512		ubelong		x		
 | |
| +>>>&-4		use				dbase4-memofield-print
 | |
| +#		Print the information of dBase IV memo field 
 | |
| +0	name			dbase4-memofield-print
 | |
| +# free dBase IV memo field
 | |
| +>0		ubelong		!0xFFFF0800	
 | |
| +>>0		lelong		x		\b, next free block %u
 | |
| +>>4		lelong		x		\b, next used block %u
 | |
| +# used dBase IV memo field
 | |
| +>0		ubelong		=0xFFFF0800	
 | |
| +# length of memo field
 | |
| +>>4		lelong		x		\b, field length %d
 | |
| +>>>8		string		>\0		\b, 1st used item "%s"
 | |
| +#		Print the information of FoxPro FPT memo file 
 | |
| +0	name				foxpro-memo-print
 | |
| +>0		belong		x		FoxPro FPT
 | |
| +# Size of blocks for FoxPro ( 64,256 )
 | |
| +>6		ubeshort	x		\b, blocks size %u
 | |
| +# next available block
 | |
| +#>0		belong		=0		\b, next free block index %u
 | |
| +>0		belong		!0		\b, next free block index %u
 | |
| +# field type ( 0~picture, 1~memo, 2~object ) 
 | |
| +>512		ubelong		<3		\b, field type %u
 | |
| +# length of memo field
 | |
| +>512		ubelong		1		
 | |
| +>>516		belong		>0		\b, field length %d
 | |
| +>>>520		string		>\0		\b, 1st item "%s"
 | |
|  
 | |
|  # TODO: 
 | |
|  # DBASE index file *.NDX
 | |
| Index: contrib/file/magic/Magdir/elf
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/elf	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/elf	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: elf,v 1.67 2014/06/12 13:52:48 christos Exp $
 | |
| +# $File: elf,v 1.68 2014/09/19 19:05:57 christos Exp $
 | |
|  # elf:  file(1) magic for ELF executables
 | |
|  #
 | |
|  # We have to check the byte order flag to see what byte order all the
 | |
| @@ -257,6 +257,7 @@
 | |
|  >18	leshort		216		Cognitive Smart Memory,
 | |
|  >18	leshort		217		iCelero CoolEngine,
 | |
|  >18	leshort		218		Nanoradio Optimized RISC,
 | |
| +>18	leshort		243		UCB RISC-V,
 | |
|  >18	leshort		0x1057		AVR (unofficial),
 | |
|  >18	leshort		0x1059		MSP430 (unofficial),
 | |
|  >18	leshort		0x1223		Adapteva Epiphany (unofficial),
 | |
| Index: contrib/file/magic/Magdir/filesystems
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/filesystems	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/filesystems	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: filesystems,v 1.95 2014/06/03 19:17:27 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  
 | |
| @@ -254,19 +254,20 @@
 | |
|  30		search/481	\x55\xAA	
 | |
|  # to display DOS/MBR boot sector (40) before old one (strength=50+21),Syslinux bootloader (71),SYSLINUX MBR (37+36),NetBSD mbr (110),AdvanceMAME mbr (111)
 | |
|  # DOS BPB information (70) and after DOS floppy (120) like in previous file version
 | |
| -!:strength +72
 | |
| +!:strength +65
 | |
|  # for sector sizes < 512 Bytes
 | |
|  >11		uleshort	<512		
 | |
|  >>(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 +21
 | |
| ->2	string	OSBS			\b, 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
 | |
| @@ -1353,18 +1357,19 @@
 | |
|  # minimal short forward jump found 0x29 for bootloaders or 0x0
 | |
|  # maximal short forward jump is 0x7f
 | |
|  # OEM-ID is empty or contain readable bytes
 | |
| -0		ulelong&0x804000E9	0x000000E9	
 | |
| +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
 | |
| ->11		uleshort&0xf001f	0	
 | |
| +>11		uleshort&0x001f	0	
 | |
|  >>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+2
 | |
| +>>>>>>1		uleshort	x		\b, code offset 0x%x+3
 | |
|  >>>>>3		string		>\0		\b, OEM-ID "%-.8s"
 | |
|  #http://mirror.href.com/thestarman/asm/debug/debug2.htm#IHC
 | |
|  >>>>>>8		string		IHC		\b cached by Windows 9M
 | |
| @@ -1373,10 +1378,11 @@
 | |
|  >>>>>11		uleshort	<512		\b, Bytes/sector %u
 | |
|  >>>>>13		ubyte		>1		\b, sectors/cluster %u
 | |
|  #>>>>>13	ubyte		=1		\b, sectors/cluster %u (usual on Floppies)
 | |
| ->>>>>82		string		FAT32		
 | |
| +# for lazy FAT32 implementation like Transcend digital photo frame PF830
 | |
| +>>>>>82		string/c	fat32		
 | |
|  >>>>>>14	uleshort	!32		\b, reserved sectors %u
 | |
|  #>>>>>>14	uleshort	=32		\b, reserved sectors %u (usual Fat32)
 | |
| ->>>>>82		string		!FAT32		
 | |
| +>>>>>82		string/c	!fat32		
 | |
|  >>>>>>14	uleshort	>1		\b, reserved sectors %u
 | |
|  #>>>>>>14	uleshort	=1		\b, reserved sectors %u (usual FAT12,FAT16)
 | |
|  #>>>>>>14	uleshort	0		\b, reserved sectors %u (usual NTFS)
 | |
| @@ -1399,24 +1405,29 @@
 | |
|  >>>>>26		ubyte		=1		\b, heads %u
 | |
|  # valid only for sector sizes with more then 32 Bytes
 | |
|  >>>>>11		uleshort	>32		
 | |
| -# skip for Digital Research DOS (version 3.41) 1440 kB Bootdisk
 | |
| ->>>>>>38	ubyte		!0x70		
 | |
| +# http://en.wikipedia.org/wiki/Design_of_the_FAT_file_system#Extended_BIOS_Parameter_Block
 | |
| +# skip for values 2,2Ah,70h,73h,DFh
 | |
| +# and continue for extended boot signature values 0,28h,29h,80h
 | |
| +>>>>>>38	ubyte&0x56	=0		
 | |
|  >>>>>>>28	ulelong		>0		\b, hidden sectors %u
 | |
|  #>>>>>>>28	ulelong		=0		\b, hidden sectors %u (usual floppy)
 | |
|  >>>>>>>32	ulelong		>0		\b, sectors %u (volumes > 32 MB) 
 | |
|  #>>>>>>>32	ulelong		=0		\b, sectors %u (volumes > 32 MB)
 | |
|  # FAT<32 bit specific 
 | |
| ->>>>>>>82	string		!FAT32
 | |
| +>>>>>>>82	string/c	!fat32		
 | |
|  #>>>>>>>>36	ubyte		0x80		\b, physical drive 0x%x=0x80 (usual harddisk)
 | |
|  #>>>>>>>>36	ubyte		0		\b, physical drive 0x%x=0 (usual floppy)
 | |
|  >>>>>>>>36	ubyte		!0x80		
 | |
|  >>>>>>>>>36	ubyte		!0		\b, physical drive 0x%x
 | |
| +# VGA-copy CRC or
 | |
| +# in Windows NT bit 0 is a dirty flag to request chkdsk at boot time. bit 1 requests surface scan too
 | |
|  >>>>>>>>37	ubyte		>0		\b, reserved 0x%x
 | |
|  #>>>>>>>>37	ubyte		=0		\b, reserved 0x%x
 | |
| -# value is 0x80 for NTFS
 | |
| +# extended boot signatur value is 0x80 for NTFS, 0x28 or 0x29 for others
 | |
|  >>>>>>>>38	ubyte		!0x29		\b, dos < 4.0 BootSector (0x%x)
 | |
| +>>>>>>>>38	ubyte&0xFE	=0x28
 | |
| +>>>>>>>>>39	ulelong		x		\b, serial number 0x%x
 | |
|  >>>>>>>>38	ubyte		=0x29
 | |
| ->>>>>>>>>39	ulelong		x		\b, serial number 0x%x
 | |
|  >>>>>>>>>43	string		<NO\ NAME	\b, label: "%11.11s"
 | |
|  >>>>>>>>>43	string		>NO\ NAME	\b, label: "%11.11s"
 | |
|  >>>>>>>>>43	string		=NO\ NAME	\b, unlabeled
 | |
| @@ -1426,11 +1437,35 @@
 | |
|  # if it is small enough FAT is 12 bit, if it is too big enough FAT is 32 bit,
 | |
|  # otherwise FAT is 16 bit.
 | |
|  # http://homepage.ntlworld.com/jonathan.deboynepollard/FGA/determining-fat-widths.html
 | |
| ->>>>>>54	string		FAT		\b, FAT
 | |
| ->>>>>>>54	string		FAT12		\b (12 bit)
 | |
| ->>>>>>>54	string		FAT16		\b (16 bit)
 | |
| +>>>>>82		string/c	!fat32		
 | |
| +>>>>>>54	string		FAT12		\b, FAT (12 bit)
 | |
| +>>>>>>54	string		FAT16		\b, FAT (16 bit)
 | |
| +>>>>>>54	default		x		
 | |
| +# determinate FAT bit size by media descriptor
 | |
| +# small floppies implies FAT12
 | |
| +>>>>>>>21	ubyte		<0xF0		\b, FAT (12 bit by descriptor)
 | |
| +# with media descriptor F0h floppy or maybe superfloppy with FAT16
 | |
| +>>>>>>>21	ubyte		=0xF0		
 | |
| +# superfloppy (many sectors) implies FAT16
 | |
| +>>>>>>>>32	ulelong		>0xFFFF		\b, FAT (16 bit by descriptor+sectors)
 | |
| +# no superfloppy with media descriptor F0h implies FAT12
 | |
| +>>>>>>>>32	default		x		\b, FAT (12 bit by descriptor+sectors)
 | |
| +# with media descriptor F8h floppy or hard disc with FAT12 or FAT16
 | |
| +>>>>>>>21	ubyte		=0xF8		
 | |
| +# 360 KiB with media descriptor F8h, 9 sectors per track ,single sided floppy implies FAT12
 | |
| +>>>>>>>>19	ubequad	0xd002f80300090001	\b, FAT (12 bit by descriptor+geometry)
 | |
| +# hard disc with FAT12 or FAT16
 | |
| +>>>>>>>>19	default		x		\b, FAT (1Y bit by descriptor)
 | |
| +# with media descriptor FAh floppy, RAM disc with FAT12 or FAT16 or Tandy hard disc
 | |
| +>>>>>>>21	ubyte		=0xFA		
 | |
| +# 320 KiB with media descriptor FAh, 8 sectors per track ,single sided floppy implies FAT12
 | |
| +>>>>>>>>19	ubequad	0x8002fa0200080001	\b, FAT (12 bit by descriptor+geometry)
 | |
| +# RAM disc with FAT12 or FAT16 or Tandy hard disc
 | |
| +>>>>>>>>19	default		x		\b, FAT (1Y bit by descriptor)
 | |
| +# others are floppy
 | |
| +>>>>>>>21	default		x		\b, FAT (12 bit by descriptor)
 | |
|  # FAT32 bit specific
 | |
| ->>>>>82		string		FAT32		\b, FAT (32 bit)
 | |
| +>>>>>82		string/c	fat32		\b, FAT (32 bit)
 | |
|  >>>>>>36	ulelong		x		\b, sectors/FAT %u
 | |
|  # http://technet.microsoft.com/en-us/library/cc977221.aspx
 | |
|  >>>>>>40	uleshort	>0		\b, extension flags 0x%x
 | |
| @@ -1443,9 +1478,12 @@
 | |
|  >>>>>>48	uleshort	>1		\b, infoSector %u
 | |
|  #>>>>>>48	uleshort	=1		\b, infoSector %u (usual)
 | |
|  >>>>>>48	uleshort	<1		\b, infoSector %u
 | |
| ->>>>>>50	uleshort	>6		\b, Backup boot sector %u
 | |
| +# 0 or 0xFFFF instead of usual 6 means no backup sector
 | |
| +>>>>>>50	uleshort	=0xFFFF		\b, no Backup boot sector
 | |
| +>>>>>>50	uleshort	=0		\b, no Backup boot sector
 | |
|  #>>>>>>50	uleshort	=6		\b, Backup boot sector %u (usual) 
 | |
| ->>>>>>50	uleshort	<6		\b, Backup boot sector %u
 | |
| +>>>>>>50	default		x		
 | |
| +>>>>>>>50	uleshort	x		\b, Backup boot sector %u
 | |
|  # corrected by Joerg Jenderek at Feb 2011 according to http://thestarman.pcministry.com/asm/mbr/MSWIN41.htm#FSINFO
 | |
|  >>>>>>52	ulelong		>0		\b, reserved1 0x%x
 | |
|  >>>>>>56	ulelong		>0		\b, reserved2 0x%x
 | |
| @@ -1880,12 +1918,11 @@
 | |
|  # defect IO.SYS+MSDOS.SYS ?
 | |
|  #>>>>>0x162	use			2xDOS-filename
 | |
|  
 | |
| -# CDROM Filesystems
 | |
| -# Modified for UDF by gerardo.cacciari@gmail.com
 | |
| -32769	string    CD001     #
 | |
| +0	name				cdrom
 | |
| +>38913	string   !NSR0      ISO 9660 CD-ROM filesystem data
 | |
|  !:mime	application/x-iso9660-image
 | |
| ->38913	string   !NSR0      ISO 9660 CD-ROM filesystem data
 | |
|  >38913	string    NSR0      UDF filesystem data
 | |
| +!:mime	application/x-iso9660-image
 | |
|  >>38917	string    1         (version 1.0)
 | |
|  >>38917	string    2         (version 1.5)
 | |
|  >>38917	string    3         (version 2.0)
 | |
| @@ -1898,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 gerardo.cacciari@gmail.com
 | |
| +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
 | |
|  
 | |
| @@ -2080,6 +2129,7 @@
 | |
|  #----------------------------------------------------------
 | |
|  #delta ISO    Daniel Novotny (dnovotny@redhat.com)
 | |
|  0	string  DISO	Delta ISO data
 | |
| +!:strength +50
 | |
|  >4	belong  x	version %d
 | |
|  
 | |
|  # VMS backup savesets - gerardo.cacciari@gmail.com
 | |
| @@ -2131,7 +2181,6 @@
 | |
|  # which is mapped to VBN 2 of [000000]INDEXF.SYS;1 - gerardo.cacciari@gmail.com
 | |
|  #
 | |
|  1008    string          DECFILE11       Files-11 On-Disk Structure
 | |
| ->525    byte            x               Level %d
 | |
|  >525    byte            x               (ODS-%d);
 | |
|  >1017   string          A               RSX-11, VAX/VMS or OpenVMS VAX file system;
 | |
|  >1017   string          B
 | |
| @@ -2266,14 +2315,31 @@
 | |
|  
 | |
|  # UBIfs
 | |
|  # Linux kernel sources: fs/ubifs/ubifs-media.h
 | |
| -0       belong  0x31181006
 | |
| ->0x16   short   0               UBIfs image
 | |
| ->0x08   lequad  x               \b, sequence number %llu
 | |
| ->0x10   leshort x               \b, length %u
 | |
| ->0x04   lelong  x               \b, CRC 0x%08x
 | |
| +0	lelong	0x06101831
 | |
| +>0x16	leshort	0		UBIfs image
 | |
| +>0x08	lequad	x		\b, sequence number %llu
 | |
| +>0x10	leshort x		\b, length %u
 | |
| +>0x04	lelong	x		\b, CRC 0x%08x
 | |
|  
 | |
| -0       belong  0x55424923
 | |
| ->0x04   short   <2
 | |
| ->0x05   string  \0\0\0
 | |
| ->0x1c   string  \0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
 | |
| ->0x04   short   x       UBI image, version %u
 | |
| +0	lelong	0x23494255
 | |
| +>0x04	leshort	<2
 | |
| +>0x05	string	\0\0\0
 | |
| +>0x1c	string	\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
 | |
| +>0x04	leshort	x		UBI image, version %u
 | |
| +
 | |
| +# NEC PC-88 2D disk image
 | |
| +# From Fabio R. Schmidlin <sd-snatcher@users.sourceforge.net>
 | |
| +0x20		ulelong&0xFFFFFEFF	0x2A0
 | |
| +>0x10		string			\0\0\0\0\0\0\0\0\0\0
 | |
| +>>0x280		string			\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
 | |
| +>>>0x1A		ubyte&0xEF		0
 | |
| +>>>>0x1B	ubyte&0x8F		0
 | |
| +>>>>>0x1B	ubyte&70		<0x40
 | |
| +>>>>>>0x1C	ulelong			>0x21
 | |
| +>>>>>>>0	regex	[[:print:]]*	NEC PC-88 disk image, name=%s
 | |
| +>>>>>>>>0x1B	ubyte	0		\b, media=2D
 | |
| +>>>>>>>>0x1B	ubyte	0x10		\b, media=2DD
 | |
| +>>>>>>>>0x1B	ubyte	0x20		\b, media=2HD
 | |
| +>>>>>>>>0x1B	ubyte	0x30		\b, media=1D
 | |
| +>>>>>>>>0x1B	ubyte	0x40		\b, media=1DD
 | |
| +>>>>>>>>0x1A	ubyte	0x10		\b, write-protected
 | |
| Index: contrib/file/magic/Magdir/images
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/images	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/images	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: images,v 1.91 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: images,v 1.102 2015/01/02 02:36:35 christos Exp $
 | |
|  # images:  file(1) magic for image formats (see also "iff", and "c-lang" for
 | |
|  # XPM bitmaps)
 | |
|  #
 | |
| @@ -115,9 +115,154 @@
 | |
|  # never changed.  The TIFF specification recommends testing for it.
 | |
|  0	string		MM\x00\x2a	TIFF image data, big-endian
 | |
|  !:mime	image/tiff
 | |
| +>(4.L)	use		\^tiff_ifd
 | |
|  0	string		II\x2a\x00	TIFF image data, little-endian
 | |
|  !:mime	image/tiff
 | |
| +>(4.l)	use		tiff_ifd
 | |
|  
 | |
| +0	name		tiff_ifd
 | |
| +>0	leshort		x		\b, direntries=%d
 | |
| +>2	use		tiff_entry
 | |
| +
 | |
| +0	name		tiff_entry
 | |
| +# NewSubFileType
 | |
| +>0	leshort		0xfe
 | |
| +>>12	use		tiff_entry
 | |
| +>0	leshort		0x100
 | |
| +>>4	lelong		1
 | |
| +>>>12	use		tiff_entry
 | |
| +>>>8	leshort		x		\b, width=%d
 | |
| +>0	leshort		0x101
 | |
| +>>4	lelong		1
 | |
| +>>>8	leshort		x		\b, height=%d
 | |
| +>>>12	use		tiff_entry
 | |
| +>0	leshort		0x102
 | |
| +>>8	leshort		x		\b, bps=%d
 | |
| +>>12	use		tiff_entry
 | |
| +>0	leshort		0x103
 | |
| +>>4	lelong		1		\b, compression=
 | |
| +>>>8	leshort		1		\bnone
 | |
| +>>>8	leshort		2		\bhuffman
 | |
| +>>>8	leshort		3		\bbi-level group 3
 | |
| +>>>8	leshort		4		\bbi-level group 4
 | |
| +>>>8	leshort		5		\bLZW
 | |
| +>>>8	leshort		6		\bJPEG (old)
 | |
| +>>>8	leshort		7		\bJPEG
 | |
| +>>>8	leshort		8		\bdeflate
 | |
| +>>>8	leshort		9		\bJBIG, ITU-T T.85
 | |
| +>>>8	leshort		0xa		\bJBIG, ITU-T T.43
 | |
| +>>>8	leshort		0x7ffe		\bNeXT RLE 2-bit
 | |
| +>>>8	leshort		0x8005		\bPackBits (Macintosh RLE)
 | |
| +>>>8	leshort		0x8029		\bThunderscan RLE
 | |
| +>>>8	leshort		0x807f		\bRasterPadding (CT or MP)
 | |
| +>>>8	leshort		0x8080		\bRLE (Line Work)
 | |
| +>>>8	leshort		0x8081		\bRLE (High-Res Cont-Tone)
 | |
| +>>>8	leshort		0x8082		\bRLE (Binary Line Work)
 | |
| +>>>8	leshort		0x80b2		\bDeflate (PKZIP)
 | |
| +>>>8	leshort		0x80b3		\bKodak DCS
 | |
| +>>>8	leshort		0x8765		\bJBIG
 | |
| +>>>8	leshort		0x8798		\bJPEG2000
 | |
| +>>>8	leshort		0x8799		\bNikon NEF Compressed
 | |
| +>>>8	default		x	
 | |
| +>>>>8	leshort		x		\b(unknown 0x%x)
 | |
| +>>>12	use		tiff_entry
 | |
| +>0	leshort		0x106		\b, PhotometricIntepretation=
 | |
| +>>8	leshort		0		\bWhiteIsZero
 | |
| +>>8	leshort		1		\bBlackIsZero
 | |
| +>>8	leshort		2		\bRGB
 | |
| +>>8	leshort		3		\bRGB Palette
 | |
| +>>8	leshort		4		\bTransparency Mask
 | |
| +>>8	leshort		5		\bCMYK
 | |
| +>>8	leshort		6		\bYCbCr
 | |
| +>>8	leshort		8		\bCIELab
 | |
| +>>>8	leshort		x		\b(unknown=0x%x)
 | |
| +>>12	use		tiff_entry
 | |
| +# FillOrder
 | |
| +>0	leshort		0x10a
 | |
| +>>4	lelong		1
 | |
| +>>>12	use		tiff_entry
 | |
| +# DocumentName
 | |
| +>0	leshort		0x10d
 | |
| +>>(8.l)	string		x		\b, name=%s
 | |
| +>>>12	use		tiff_entry
 | |
| +# ImageDescription
 | |
| +>0	leshort		0x10e
 | |
| +>>(8.l)	string		x		\b, description=%s
 | |
| +>>>12	use		tiff_entry
 | |
| +# Make
 | |
| +>0	leshort		0x10f
 | |
| +>>(8.l)	string		x		\b, manufacturer=%s
 | |
| +>>>12	use		tiff_entry
 | |
| +# Model
 | |
| +>0	leshort		0x110
 | |
| +>>(8.l)	string		x		\b, model=%s
 | |
| +>>>12	use		tiff_entry
 | |
| +# StripOffsets
 | |
| +>0	leshort		0x111
 | |
| +>>12	use		tiff_entry
 | |
| +# Orientation
 | |
| +>0	leshort		0x112		\b, orientation=
 | |
| +>>8	leshort		1		\bupper-left
 | |
| +>>8	leshort		3		\blower-right
 | |
| +>>8	leshort		6		\bupper-right
 | |
| +>>8	leshort		8		\blower-left
 | |
| +>>8	leshort		9		\bundefined
 | |
| +>>8	default		x
 | |
| +>>>8	leshort		x		\b[*%d*]
 | |
| +>>12	use		tiff_entry
 | |
| +# XResolution
 | |
| +>0	leshort		0x11a
 | |
| +>>8	lelong		x		\b, xresolution=%d
 | |
| +>>12	use		tiff_entry
 | |
| +# YResolution
 | |
| +>0	leshort		0x11b
 | |
| +>>8	lelong		x		\b, yresolution=%d
 | |
| +>>12	use		tiff_entry
 | |
| +# ResolutionUnit
 | |
| +>0	leshort		0x128
 | |
| +>>8	leshort		x		\b, resolutionunit=%d
 | |
| +>>12	use		tiff_entry
 | |
| +# Software
 | |
| +>0	leshort		0x131
 | |
| +>>(8.l)	string		x		\b, software=%s
 | |
| +>>12	use		tiff_entry
 | |
| +# Datetime
 | |
| +>0	leshort		0x132
 | |
| +>>(8.l)	string		x		\b, datetime=%s
 | |
| +>>12	use		tiff_entry
 | |
| +# HostComputer
 | |
| +>0	leshort		0x13c
 | |
| +>>(8.l)	string		x		\b, hostcomputer=%s
 | |
| +>>12	use		tiff_entry
 | |
| +# WhitePoint
 | |
| +>0	leshort		0x13e
 | |
| +>>12	use		tiff_entry
 | |
| +# PrimaryChromaticities
 | |
| +>0	leshort		0x13f
 | |
| +>>12	use		tiff_entry
 | |
| +# YCbCrCoefficients
 | |
| +>0	leshort		0x211
 | |
| +>>12	use		tiff_entry
 | |
| +# YCbCrPositioning
 | |
| +>0	leshort		0x213
 | |
| +>>12	use		tiff_entry
 | |
| +# ReferenceBlackWhite
 | |
| +>0	leshort		0x214
 | |
| +>>12	use		tiff_entry
 | |
| +# Copyright
 | |
| +>0	leshort		0x8298
 | |
| +>>(8.l)	string		x		\b, copyright=%s
 | |
| +>>12	use		tiff_entry
 | |
| +# ExifOffset
 | |
| +>0	leshort		0x8769
 | |
| +>>12	use		tiff_entry
 | |
| +# GPS IFD
 | |
| +>0	leshort		0x8825		\b, GPS-Data
 | |
| +>>12	use		tiff_entry
 | |
| +
 | |
| +#>0	leshort		x		\b, unknown=0x%x
 | |
| +#>>12	use		tiff_entry
 | |
| +
 | |
|  0	string		MM\x00\x2b	Big TIFF image data, big-endian
 | |
|  !:mime	image/tiff
 | |
|  0	string		II\x2b\x00	Big TIFF image data, little-endian
 | |
| @@ -892,6 +1037,65 @@
 | |
|  0	string	\x46\x4d\x52\x00	ISO/IEC 19794-2 Format Minutiae Record (FMR)
 | |
|  
 | |
|  # WEBP https://developers.google.com/speed/webp/docs/riff_container
 | |
| -0	string	RIFF
 | |
| ->8	string	WEBP	Web/P image data
 | |
| ->>4	lelong	x	\b, %d bytes
 | |
| +#0	string	RIFF
 | |
| +#>8	string	WEBP	Web/P image data
 | |
| +#>>4	lelong	x	\b, %d bytes
 | |
| +
 | |
| +# doc: http://www.shikino.co.jp/eng/products/images/FLOWER.jpg.zip
 | |
| +# example: http://www.shikino.co.jp/eng/products/images/FLOWER.wdp.zip
 | |
| +90	bequad		0x574D50484F544F00	JPEG-XR Image
 | |
| +>98	byte&0x08	=0x08			\b, hard tiling
 | |
| +>99	byte&0x80	=0x80			\b, tiling present
 | |
| +>99	byte&0x40	=0x40			\b, codestream present
 | |
| +>99	byte&0x38	x			\b, spatial xform=
 | |
| +>99	byte&0x38	0x00			\bTL
 | |
| +>99	byte&0x38	0x08			\bBL
 | |
| +>99	byte&0x38	0x10			\bTR
 | |
| +>99	byte&0x38	0x18			\bBR
 | |
| +>99	byte&0x38	0x20			\bBT
 | |
| +>99	byte&0x38	0x28			\bRB
 | |
| +>99	byte&0x38	0x30			\bLT
 | |
| +>99	byte&0x38	0x38			\bLB
 | |
| +>100	byte&0x80	=0x80			\b, short header
 | |
| +>>102	beshort+1	x			\b, %d
 | |
| +>>104	beshort+1	x			\bx%d
 | |
| +>100	byte&0x80	=0x00			\b, long header
 | |
| +>>102	belong+1	x			\b, %x
 | |
| +>>106	belong+1	x			\bx%x
 | |
| +>101	beshort&0xf	x			\b, bitdepth=
 | |
| +>>101	beshort&0xf	0x0			\b1-WHITE=1
 | |
| +>>101	beshort&0xf	0x1			\b8
 | |
| +>>101	beshort&0xf	0x2			\b16
 | |
| +>>101	beshort&0xf	0x3			\b16-SIGNED
 | |
| +>>101	beshort&0xf	0x4			\b16-FLOAT
 | |
| +>>101	beshort&0xf	0x5			\b(reserved 5)
 | |
| +>>101	beshort&0xf	0x6			\b32-SIGNED
 | |
| +>>101	beshort&0xf	0x7			\b32-FLOAT
 | |
| +>>101	beshort&0xf	0x8			\b5
 | |
| +>>101	beshort&0xf	0x9			\b10
 | |
| +>>101	beshort&0xf	0xa			\b5-6-5
 | |
| +>>101	beshort&0xf	0xb			\b(reserved %d)
 | |
| +>>101	beshort&0xf	0xc			\b(reserved %d)
 | |
| +>>101	beshort&0xf	0xd			\b(reserved %d)
 | |
| +>>101	beshort&0xf	0xe			\b(reserved %d)
 | |
| +>>101	beshort&0xf	0xf			\b1-BLACK=1
 | |
| +>101	beshort&0xf0	x			\b, colorfmt=
 | |
| +>>101	beshort&0xf0	0x00			\bYONLY
 | |
| +>>101	beshort&0xf0	0x10			\bYUV240
 | |
| +>>101	beshort&0xf0	0x20			\bYWV422
 | |
| +>>101	beshort&0xf0	0x30			\bYWV444
 | |
| +>>101	beshort&0xf0	0x40			\bCMYK
 | |
| +>>101	beshort&0xf0	0x50			\bCMYKDIRECT
 | |
| +>>101	beshort&0xf0	0x60			\bNCOMPONENT
 | |
| +>>101	beshort&0xf0	0x70			\bRGB
 | |
| +>>101	beshort&0xf0	0x80			\bRGBE
 | |
| +>>101	beshort&0xf0	>0x80			\b(reserved 0x%x)
 | |
| +
 | |
| +# From: Johan van der Knijff <johan.vanderknijff@kb.nl>
 | |
| +#
 | |
| +# BPG (Better Portable Graphics) format
 | |
| +# http://bellard.org/bpg/
 | |
| +# http://fileformats.archiveteam.org/wiki/BPG
 | |
| +#
 | |
| +0	string	\x42\x50\x47\xFB	BPG (Better Portable Graphics)
 | |
| +!:mime  image/bpg
 | |
| Index: contrib/file/magic/Magdir/jpeg
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/jpeg	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/jpeg	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: jpeg,v 1.19 2013/02/04 15:50:03 christos Exp $
 | |
| +# $File: jpeg,v 1.25 2015/01/02 16:56:50 christos Exp $
 | |
|  # JPEG images
 | |
|  # SunOS 5.5.1 had
 | |
|  #
 | |
| @@ -22,133 +22,74 @@
 | |
|  >>11	byte		x		\b %d.
 | |
|  >>12	byte		x		\b%02d
 | |
|  # Next, the resolution or aspect ratio of the image:
 | |
| -#>>13	byte		0		\b, aspect ratio
 | |
| -#>>13	byte		1		\b, resolution (DPI)
 | |
| -#>>13	byte		2		\b, resolution (DPCM)
 | |
| -#>>4	beshort		x		\b, segment length %d
 | |
| +>>13	byte		0		\b, aspect ratio
 | |
| +>>13	byte		1		\b, resolution (DPI)
 | |
| +>>13	byte		2		\b, resolution (DPCM)
 | |
| +>>14	beshort		x		\b, density %dx
 | |
| +>>16	beshort		x		\b%d
 | |
| +>>4	beshort		x		\b, segment length %d
 | |
|  # Next, show thumbnail info, if it exists:
 | |
|  >>18	byte		!0		\b, thumbnail %dx
 | |
|  >>>19	byte		x		\b%d
 | |
| +>6	string		Exif		\b, Exif standard: [
 | |
| +>>12	indirect/r	x
 | |
| +>>12	string		x		\b]
 | |
|  
 | |
| -# EXIF moved down here to avoid reporting a bogus version number,
 | |
| -# and EXIF version number printing added.
 | |
| -#   - Patrik R=E5dman <patrik+file-magic@iki.fi>
 | |
| ->6	string		Exif		\b, EXIF standard
 | |
| -# Look for EXIF IFD offset in IFD 0, and then look for EXIF version tag in EXIF IFD.
 | |
| -# All possible combinations of entries have to be enumerated, since no looping
 | |
| -# is possible. And both endians are possible...
 | |
| -# The combinations included below are from real-world JPEGs.
 | |
| -# Little-endian
 | |
| ->>12	string		II		
 | |
| -# IFD 0 Entry #5:
 | |
| ->>>70	leshort		0x8769          
 | |
| -# EXIF IFD Entry #1:
 | |
| ->>>>(78.l+14)	leshort	0x9000		
 | |
| ->>>>>(78.l+23)	byte	x		%c
 | |
| ->>>>>(78.l+24)	byte	x		\b.%c
 | |
| ->>>>>(78.l+25)	byte	!0x30		\b%c
 | |
| -# IFD 0 Entry #9:
 | |
| ->>>118	leshort		0x8769          
 | |
| -# EXIF IFD Entry #3:
 | |
| ->>>>(126.l+38)	leshort	0x9000		
 | |
| ->>>>>(126.l+47)	byte	x		%c
 | |
| ->>>>>(126.l+48)	byte	x		\b.%c
 | |
| ->>>>>(126.l+49)	byte	!0x30		\b%c
 | |
| -# IFD 0 Entry #10
 | |
| ->>>130	leshort		0x8769          
 | |
| -# EXIF IFD Entry #3:
 | |
| ->>>>(138.l+38)	leshort	0x9000		
 | |
| ->>>>>(138.l+47)	byte	x		%c
 | |
| ->>>>>(138.l+48)	byte	x		\b.%c
 | |
| ->>>>>(138.l+49)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #4:
 | |
| ->>>>(138.l+50)	leshort	0x9000		
 | |
| ->>>>>(138.l+59)	byte	x		%c
 | |
| ->>>>>(138.l+60)	byte	x		\b.%c
 | |
| ->>>>>(138.l+61)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #5:
 | |
| ->>>>(138.l+62)	leshort	0x9000		
 | |
| ->>>>>(138.l+71)	byte	x		%c
 | |
| ->>>>>(138.l+72)	byte	x		\b.%c
 | |
| ->>>>>(138.l+73)	byte	!0x30		\b%c
 | |
| -# IFD 0 Entry #11
 | |
| ->>>142	leshort		0x8769          
 | |
| -# EXIF IFD Entry #3:
 | |
| ->>>>(150.l+38)	leshort	0x9000		
 | |
| ->>>>>(150.l+47)	byte	x		%c
 | |
| ->>>>>(150.l+48)	byte	x		\b.%c
 | |
| ->>>>>(150.l+49)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #4:
 | |
| ->>>>(150.l+50)	leshort	0x9000		
 | |
| ->>>>>(150.l+59)	byte	x		%c
 | |
| ->>>>>(150.l+60)	byte	x		\b.%c
 | |
| ->>>>>(150.l+61)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #5:
 | |
| ->>>>(150.l+62)	leshort	0x9000		
 | |
| ->>>>>(150.l+71)	byte	x		%c
 | |
| ->>>>>(150.l+72)	byte	x		\b.%c
 | |
| ->>>>>(150.l+73)	byte	!0x30		\b%c
 | |
| -# Big-endian
 | |
| ->>12	string		MM		
 | |
| -# IFD 0 Entry #9:
 | |
| ->>>118	beshort		0x8769          
 | |
| -# EXIF IFD Entry #1:
 | |
| ->>>>(126.L+14)	beshort	0x9000		
 | |
| ->>>>>(126.L+23)	byte	x		%c
 | |
| ->>>>>(126.L+24)	byte	x		\b.%c
 | |
| ->>>>>(126.L+25)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #3:
 | |
| ->>>>(126.L+38)	beshort	0x9000		
 | |
| ->>>>>(126.L+47)	byte	x		%c
 | |
| ->>>>>(126.L+48)	byte	x		\b.%c
 | |
| ->>>>>(126.L+49)	byte	!0x30		\b%c
 | |
| -# IFD 0 Entry #10
 | |
| ->>>130	beshort		0x8769          
 | |
| -# EXIF IFD Entry #3:
 | |
| ->>>>(138.L+38)	beshort	0x9000		
 | |
| ->>>>>(138.L+47)	byte	x		%c
 | |
| ->>>>>(138.L+48)	byte	x		\b.%c
 | |
| ->>>>>(138.L+49)	byte	!0x30		\b%c
 | |
| -# EXIF IFD Entry #5:
 | |
| ->>>>(138.L+62)	beshort	0x9000		
 | |
| ->>>>>(138.L+71)	byte	x		%c
 | |
| ->>>>>(138.L+72)	byte	x		\b.%c
 | |
| ->>>>>(138.L+73)	byte	!0x30		\b%c
 | |
| -# IFD 0 Entry #11
 | |
| ->>>142	beshort		0x8769          
 | |
| -# EXIF IFD Entry #4:
 | |
| ->>>>(150.L+50)	beshort	0x9000		
 | |
| ->>>>>(150.L+59)	byte	x		%c
 | |
| ->>>>>(150.L+60)	byte	x		\b.%c
 | |
| ->>>>>(150.L+61)	byte	!0x30		\b%c
 | |
| -# Here things get sticky.  We can do ONE MORE marker segment with
 | |
| -# indirect addressing, and that's all.  It would be great if we could
 | |
| -# do pointer arithemetic like in an assembler language.  Christos?
 | |
| -# And if there was some sort of looping construct to do searches, plus a few
 | |
| -# named accumulators, it would be even more effective...
 | |
| -# At least we can show a comment if no other segments got inserted before:
 | |
| ->(4.S+5)	byte		0xFE		\b, comment:
 | |
| ->>(4.S+6)	pstring/HJ	x		"%s"
 | |
| -# Or, we can show the encoding type (I've included only the three most common)
 | |
| -# and image dimensions if we are lucky and the SOFn (image segment) is here:
 | |
| ->(4.S+5)	byte		0xC0		\b, baseline
 | |
| ->>(4.S+6)	byte		x		\b, precision %d
 | |
| ->>(4.S+7)	beshort		x		\b, %dx
 | |
| ->>(4.S+9)	beshort		x		\b%d
 | |
| ->(4.S+5)	byte		0xC1		\b, extended sequential
 | |
| ->>(4.S+6)	byte		x		\b, precision %d
 | |
| ->>(4.S+7)	beshort		x		\b, %dx
 | |
| ->>(4.S+9)	beshort		x		\b%d
 | |
| ->(4.S+5)	byte		0xC2		\b, progressive
 | |
| ->>(4.S+6)	byte		x		\b, precision %d
 | |
| ->>(4.S+7)	beshort		x		\b, %dx
 | |
| ->>(4.S+9)	beshort		x		\b%d
 | |
| -# I've commented-out quantisation table reporting.  I doubt anyone cares yet.
 | |
| -#>(4.S+5)	byte		0xDB		\b, quantisation table
 | |
| -#>>(4.S+6)	beshort		x		\b length=%d
 | |
| -#>14	beshort		x		\b, %d x
 | |
| -#>16	beshort		x		\b %d
 | |
| +# Jump to the first segment
 | |
| +>(4.S+4)	use		jpeg_segment
 | |
|  
 | |
| +# This uses recursion...
 | |
| +0		name		jpeg_segment
 | |
| +>0	beshort		0xFFFE
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +>>2	pstring/HJ	x		\b, comment: "%s"
 | |
| +
 | |
| +>0	beshort		0xFFC0
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +>>4	byte		x		\b, baseline, precision %d
 | |
| +>>7	beshort		x		\b, %dx
 | |
| +>>5	beshort		x		\b%d
 | |
| +>>9	byte		x		\b, frames %d
 | |
| +
 | |
| +>0	beshort		0xFFC1		
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +>>4	byte		x		\b, extended sequential, precision %d
 | |
| +>>7	beshort		x		\b, %dx
 | |
| +>>5	beshort		x		\b%d
 | |
| +>>9	byte		x		\b, frames %d
 | |
| +
 | |
| +>0	beshort		0xFFC2		
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +>>4	byte		x		\b, progressive, precision %d
 | |
| +>>7	beshort		x		\b, %dx
 | |
| +>>5	beshort		x		\b%d
 | |
| +>>9	byte		x		\b, frames %d
 | |
| +
 | |
| +# Define Huffman Tables
 | |
| +>0	beshort		0xFFC4
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +
 | |
| +>0	beshort		0xFFE1		
 | |
| +#>>(2.S+2)	use			jpeg_segment
 | |
| +>>4	string		Exif		\b, Exif Standard: [
 | |
| +>>>10	indirect/r	x		
 | |
| +>>>10	string		x		\b]
 | |
| +
 | |
| +# Application specific markers
 | |
| +>0	beshort&0xFFE0	=0xFFE0
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +
 | |
| +# DB: Define Quantization tables
 | |
| +# DD: Define Restart interval [XXX: wrong here, it is 4 bytes]
 | |
| +# D8: Start of image
 | |
| +# D9: End of image
 | |
| +# Dn: Restart
 | |
| +>0	beshort&0xFFD0	=0xFFD0
 | |
| +>>(2.S+2)	use			jpeg_segment
 | |
| +
 | |
| +#>0	beshort		x		unknown 0x%x
 | |
| +#>>(2.S+2)	use			jpeg_segment
 | |
| +
 | |
|  # HSI is Handmade Software's proprietary JPEG encoding scheme
 | |
|  0	string		hsi1		JPEG image data, HSI proprietary
 | |
|  
 | |
| Index: contrib/file/magic/Magdir/kerberos
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/kerberos	(revision 0)
 | |
| +++ contrib/file/magic/Magdir/kerberos	(working copy)
 | |
| @@ -0,0 +1,45 @@
 | |
| +
 | |
| +#------------------------------------------------------------------------------
 | |
| +# $File: kerberos,v 1.1 2014/12/10 18:45:43 christos Exp $
 | |
| +# kerberos: MIT kerberos file binary formats
 | |
| +#
 | |
| +
 | |
| +# This magic entry is for demonstration purposes and could be improved
 | |
| +# if the following features were implemented in file:
 | |
| +#
 | |
| +# Strings inside [[ .. ]] in the descriptions have special meanings and
 | |
| +# are not printed.
 | |
| +#
 | |
| +# 	- Provide some form of iteration in number of components
 | |
| +#		[[${counter}=%d]] in the description
 | |
| +#		then append
 | |
| +#		[${counter}--] in the offset of the entries
 | |
| +#	- Provide a way to round the next offset
 | |
| +#		Add [R:4] after the offset?
 | |
| +#	- Provide a way to have optional entries
 | |
| +#		XXX: Syntax:
 | |
| +#	- Provide a way to "save" entries to print them later.
 | |
| +#		if the description is [[${name}=%s]], then nothing is
 | |
| +#		printed and a subsequent entry in the same magic file
 | |
| +#		can refer to ${name}
 | |
| +#	- Provide a way to format strings as hex values
 | |
| +#
 | |
| +# http://www.gnu.org/software/shishi/manual/html_node/\
 | |
| +#	The-Keytab-Binary-File-Format.html
 | |
| +#
 | |
| +
 | |
| +0		name		keytab_entry
 | |
| +#>0		beshort		x		\b, size=%d
 | |
| +#>2		beshort		x		\b, components=%d
 | |
| +>4		pstring/H	x		\b, realm=%s
 | |
| +>>&0		pstring/H	x		\b, principal=%s/
 | |
| +>>>&0		pstring/H	x		\b%s
 | |
| +>>>>&0		belong		x		\b, type=%d
 | |
| +>>>>>&0		bedate		x		\b, date=%s
 | |
| +>>>>>>&0	byte		x		\b, kvno=%u
 | |
| +#>>>>>>>&0	pstring/H	x
 | |
| +#>>>>>>>>&0	belong		x	
 | |
| +#>>>>>>>>>>&0	use		keytab_entry
 | |
| +
 | |
| +0		belong		0x05020000	Kerberos Keytab file
 | |
| +>4		use		keytab_entry
 | |
| Index: contrib/file/magic/Magdir/linux
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/linux	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/linux	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: linux,v 1.57 2014/05/20 20:10:17 christos Exp $
 | |
| +# $File: linux,v 1.59 2014/11/03 21:03:36 christos Exp $
 | |
|  # linux:  file(1) magic for Linux files
 | |
|  #
 | |
|  # Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
 | |
| @@ -413,3 +413,22 @@
 | |
|  >>>>20		belong		>16
 | |
|  >>>>>36		belong		x	\b, DT structure block size=%d
 | |
|  
 | |
| +# glibc locale archive as defined in glibc locale/locarchive.h
 | |
| +0		lelong		0xde020109	locale archive
 | |
| +>24		lelong		x		%d strings
 | |
| +
 | |
| +# Summary:     Database file for mlocate
 | |
| +# Description: A database file as used by mlocate, a fast implementation
 | |
| +#              of locate/updatedb. It uses merging to reuse the existing
 | |
| +#              database and avoid rereading most of the filesystem. It's
 | |
| +#              the default version of locate on Arch Linux (and others).
 | |
| +# File path:   /var/lib/mlocate/mlocate.db by default (but configurable)
 | |
| +# Site:        https://fedorahosted.org/mlocate/
 | |
| +# Format docs: http://linux.die.net/man/5/mlocate.db
 | |
| +# Type: mlocate database file
 | |
| +# URL:  https://fedorahosted.org/mlocate/
 | |
| +# From: Wander Nauta <info@wandernauta.nl>
 | |
| +0		string		\0mlocate	mlocate database
 | |
| +>12		byte		x		\b, version %d
 | |
| +>13		byte		1		\b, require visibility
 | |
| +>16		string		x		\b, root %s
 | |
| Index: contrib/file/magic/Magdir/macintosh
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/macintosh	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/macintosh	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: macintosh,v 1.23 2013/11/19 18:47:58 christos Exp $
 | |
| +# $File: macintosh,v 1.25 2014/09/03 13:34:16 christos Exp $
 | |
|  # macintosh description
 | |
|  #
 | |
|  # BinHex is the Macintosh ASCII-encoded file format (see also "apple")
 | |
| @@ -165,7 +165,7 @@
 | |
|  #>65	string		ZSYS		(Pre-System 7 system file)
 | |
|  #>65	string		acf3		(Aldus FreeHand)
 | |
|  #>65	string		cdev		(control panel)
 | |
| -#>65	string		dfil		(Desk Acessory suitcase)
 | |
| +#>65	string		dfil		(Desk Accessory suitcase)
 | |
|  #>65	string		libr		(library)
 | |
|  #>65	string		nX^d		(WriteNow word processor)
 | |
|  #>65	string		nX^w		(WriteNow dictionary)
 | |
| @@ -288,20 +288,38 @@
 | |
|  >0x412	beshort			x		number of blocks: %d,
 | |
|  >0x424	pstring			x		volume name: %s
 | |
|  
 | |
| +# *.hfs updated by Joerg Jenderek
 | |
| +# http://en.wikipedia.org/wiki/Hierarchical_File_System
 | |
|  # "BD" gives many false positives
 | |
| -#0x400	beshort			0x4244		Macintosh HFS data
 | |
| -#>0	beshort			0x4C4B		(bootable)
 | |
| -#>0x40a	beshort			&0x8000		(locked)
 | |
| -#>0x40a	beshort			^0x0100		(mounted)
 | |
| -#>0x40a	beshort			&0x0200		(spared blocks)
 | |
| -#>0x40a	beshort			&0x0800		(unclean)
 | |
| -#>0x47C	beshort			0x482B		(Embedded HFS+ Volume)
 | |
| -#>0x402	beldate-0x7C25B080	x		created: %s,
 | |
| -#>0x406	beldate-0x7C25B080	x		last modified: %s,
 | |
| -#>0x440	beldate-0x7C25B080	>0		last backup: %s,
 | |
| -#>0x414	belong			x		block size: %d,
 | |
| -#>0x412	beshort			x		number of blocks: %d,
 | |
| -#>0x424	pstring			x		volume name: %s
 | |
| +0x400	beshort			0x4244		
 | |
| +# ftp://ftp.mars.org/pub/hfs/hfsutils-3.2.6.tar.gz/hfsutils-3.2.6/libhfs/apple.h
 | |
| +# first block of volume bit map (always 3)
 | |
| +>0x40e	ubeshort		0x0003		
 | |
| +# maximal length of volume name is 27
 | |
| +>>0x424		ubyte			<28	Macintosh HFS data
 | |
| +#!:mime	application/octet-stream
 | |
| +# these mime and apple types are not sure
 | |
| +!:mime	application/x-apple-diskimage
 | |
| +#!:apple	hfsdINIT
 | |
| +#!:apple	MACSdisk
 | |
| +>>>0		beshort			0x4C4B	(bootable)
 | |
| +#>>>0		beshort			0x0000	(not bootable)
 | |
| +>>>0x40a	beshort			&0x8000	(locked)
 | |
| +>>>0x40a	beshort			^0x0100	(mounted)
 | |
| +>>>0x40a	beshort			&0x0200	(spared blocks)
 | |
| +>>>0x40a	beshort			&0x0800	(unclean)
 | |
| +>>>0x47C	beshort			0x482B	(Embedded HFS+ Volume)
 | |
| +# http://www.epochconverter.com/
 | |
| +# 0x7C245F00 seconds	~ 2082758400	~ 01 Jan 2036 00:00:00	~ 66 years to 1970
 | |
| +# 0x7C25B080 seconds	~ 2082844800	~ 02 Jan 2036 00:00:00
 | |
| +# construct not working
 | |
| +#>>>0x402	beldate-0x7C25B080	x	created: %s,
 | |
| +#>>>0x406	beldate-0x7C25B080	x	last modified: %s,
 | |
| +#>>>0x440	beldate-0x7C25B080	>0	last backup: %s,
 | |
| +# found block sizes 200h,1200h,2800h
 | |
| +>>>0x414	belong			x	block size: %d,
 | |
| +>>>0x412	beshort			x	number of blocks: %d,
 | |
| +>>>0x424	pstring			x	volume name: %s
 | |
|  
 | |
|  0x400	beshort			0x482B		Macintosh HFS Extended
 | |
|  >&0	beshort			x		version %d data
 | |
| @@ -322,43 +340,9 @@
 | |
|  >&42	belong			x		number of blocks: %d,
 | |
|  >&46	belong			x		free blocks: %d
 | |
|  
 | |
| -# I don't think this is really necessary since it doesn't do much and 
 | |
| -# anything with a valid driver descriptor will also have a valid
 | |
| -# partition map
 | |
| -#0		beshort		0x4552		Apple Device Driver data
 | |
| -#>&24		beshort		=1		\b, MacOS
 | |
| -
 | |
| -# Is that the partition type a cstring or a pstring? Well, IM says "strings 
 | |
| -# shorter than 32 bytes must be terminated with NULL" so I'll treat it as a 
 | |
| -# cstring. Of course, partitions can contain more than four entries, but 
 | |
| -# what're you gonna do?
 | |
| -# GRR: This magic is too weak, it is just "PM"
 | |
| -#0x200		beshort		0x504D		Apple Partition data
 | |
| -#>0x2		beshort		x		(block size: %d):
 | |
| -#>0x230		string		x		first type: %s,
 | |
| -#>0x210		string		x		name: %s,
 | |
| -#>0x254		belong		x		number of blocks: %d,
 | |
| -#>0x400		beshort		0x504D		
 | |
| -#>>0x430		string		x		second type: %s,
 | |
| -#>>0x410		string		x		name: %s,
 | |
| -#>>0x454		belong		x		number of blocks: %d,
 | |
| -#>>0x600		beshort		0x504D
 | |
| -#>>>0x630	string		x		third type: %s,
 | |
| -#>>>0x610	string		x		name: %s,
 | |
| -#>>>0x654	belong		x		number of blocks: %d,
 | |
| -#>>0x800		beshort		0x504D		
 | |
| -#>>>0x830	string		x		fourth type: %s,
 | |
| -#>>>0x810	string		x		name: %s,
 | |
| -#>>>0x854	belong		x		number of blocks: %d,
 | |
| -#>>>0xa00	beshort		0x504D		
 | |
| -#>>>>0xa30	string		x		fifth type: %s,
 | |
| -#>>>>0xa10	string		x		name: %s,
 | |
| -#>>>>0xa54	belong		x		number of blocks: %d
 | |
| -#>>>0xc00	beshort		0x504D
 | |
| -#>>>>0xc30	string		x		sixth type: %s,
 | |
| -#>>>>0xc10	string		x		name: %s,
 | |
| -#>>>>0xc54	belong		x		number of blocks: %d
 | |
|  ## AFAIK, only the signature is different
 | |
| +# same as Apple Partition Map
 | |
| +# GRR: This magic is too weak, it is just "TS"
 | |
|  #0x200		beshort		0x5453		Apple Old Partition data
 | |
|  #>0x2		beshort		x		block size: %d,
 | |
|  #>0x230		string		x		first type: %s,
 | |
| Index: contrib/file/magic/Magdir/meteorological
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/meteorological	(revision 0)
 | |
| +++ contrib/file/magic/Magdir/meteorological	(working copy)
 | |
| @@ -0,0 +1,49 @@
 | |
| +
 | |
| +#------------------------------------------------------------------------------
 | |
| +# $File: meteorological,v 1.1 2014/08/04 06:26:16 christos Exp $
 | |
| +# rinex:  file(1) magic for RINEX files
 | |
| +# http://igscb.jpl.nasa.gov/igscb/data/format/rinex210.txt
 | |
| +# ftp://cddis.gsfc.nasa.gov/pub/reports/formats/rinex300.pdf
 | |
| +# data for testing: ftp://cddis.gsfc.nasa.gov/pub/gps/data
 | |
| +60	string		RINEX
 | |
| +>80	search/256	XXRINEXB	RINEX Data, GEO SBAS Broadcast
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/broadcast
 | |
| +>80	search/256	XXRINEXD	RINEX Data, Observation (Hatanaka comp)
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/observation
 | |
| +>80	search/256	XXRINEXC	RINEX Data, Clock
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/clock
 | |
| +>80	search/256	XXRINEXH	RINEX Data, GEO SBAS Navigation
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/navigation
 | |
| +>80	search/256	XXRINEXG	RINEX Data, GLONASS Navigation
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/navigation
 | |
| +>80	search/256	XXRINEXL	RINEX Data, Galileo Navigation
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/navigation
 | |
| +>80	search/256	XXRINEXM	RINEX Data, Meteorological
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/meteorological
 | |
| +>80	search/256	XXRINEXN	RINEX Data, Navigation	
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/navigation
 | |
| +>80	search/256	XXRINEXO	RINEX Data, Observation
 | |
| +>>&32	string		x		\b, date %15.15s
 | |
| +>>5	string		x		\b, version %6.6s
 | |
| +!:mime	rinex/observation
 | |
| +
 | |
| +# https://en.wikipedia.org/wiki/GRIB
 | |
| +0	string	GRIB
 | |
| +>7	byte	=1	Gridded binary (GRIB) version 1
 | |
| +>7	byte	=2	Gridded binary (GRIB) version 2
 | |
| Index: contrib/file/magic/Magdir/msooxml
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/msooxml	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/msooxml	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: msooxml,v 1.4 2014/01/06 18:16:24 rrt Exp $
 | |
| +# $File: msooxml,v 1.5 2014/08/05 07:38:45 christos Exp $
 | |
|  # msooxml:  file(1) magic for Microsoft Office XML
 | |
|  # From: Ralf Brown <ralf.brown@gmail.com>
 | |
|  
 | |
| @@ -16,7 +16,7 @@
 | |
|  0		string		PK\003\004
 | |
|  !:strength +10
 | |
|  # make sure the first file is correct
 | |
| ->0x1E		regex		\[Content_Types\]\.xml|_rels/\.rels
 | |
| +>0x1E		regex		\\[Content_Types\\]\\.xml|_rels/\\.rels
 | |
|  # skip to the second local file header
 | |
|  # since some documents include a 520-byte extra field following the file
 | |
|  # header, we need to scan for the next header
 | |
| Index: contrib/file/magic/Magdir/netbsd
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/netbsd	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/netbsd	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: netbsd,v 1.21 2014/03/29 15:40:34 christos Exp $
 | |
| +# $File: netbsd,v 1.22 2014/12/08 20:53:52 christos Exp $
 | |
|  # netbsd:  file(1) magic for NetBSD objects
 | |
|  #
 | |
|  # All new-style magic numbers are in network byte order.
 | |
| @@ -247,7 +247,7 @@
 | |
|  # Kernel core dump format
 | |
|  0	belong&0x0000ffff 0x00008fca	NetBSD kernel core file
 | |
|  >0	belong&0x03ff0000 0x00000000	\b, Unknown
 | |
| ->0	belong&0x03ff0000 0x00001000	\b, sun 68010/68020
 | |
| +>0	belong&0x03ff0000 0x00010000	\b, sun 68010/68020
 | |
|  >0	belong&0x03ff0000 0x00020000	\b, sun 68020
 | |
|  >0	belong&0x03ff0000 0x00640000	\b, 386 PC
 | |
|  >0	belong&0x03ff0000 0x00860000	\b, i386 BSD
 | |
| @@ -262,20 +262,24 @@
 | |
|  >0	belong&0x03ff0000 0x008f0000	\b, arm6 BSD
 | |
|  >0	belong&0x03ff0000 0x00900000	\b, m68k BSD (2K pages)
 | |
|  >0	belong&0x03ff0000 0x00910000	\b, sh3 BSD
 | |
| ->0	belong&0x03ff0000 0x00920000	\b, ppc BSD (Big Endian)
 | |
| ->0	belong&0x03ff0000 0x00930000	\b, vax BSD (4K pages)
 | |
| ->0	belong&0x03ff0000 0x00940000	\b, mips1 BSD
 | |
| ->0	belong&0x03ff0000 0x00950000	\b, mips2 BSD
 | |
| ->0	belong&0x03ff0000 0x00960000	\b, parisc BSD
 | |
| ->0	belong&0x03ff0000 0x00970000	\b, sh5/64 BSD
 | |
| ->0	belong&0x03ff0000 0x00980000	\b, SPARC/64 BSD
 | |
| ->0	belong&0x03ff0000 0x00990000	\b, amd64 BSD
 | |
| ->0	belong&0x03ff0000 0x009a0000	\b, hp200 (68010) BSD
 | |
| ->0	belong&0x03ff0000 0x009b0000	\b, hp300 (68020+68881) BSD
 | |
| ->0	belong&0x03ff0000 0x009b0000	\b, hp300 (68020+68881) BSD
 | |
| ->0	belong&0x03ff0000 0x00c80000	\b, hp200
 | |
| ->0	belong&0x03ff0000 0x020b0000	\b, hp300 (68020+68881) HP-UX
 | |
| ->0	belong&0x03ff0000 0x020c0000	\b, hp300 (68020+68881) HP-UX
 | |
| +>0	belong&0x03ff0000 0x00950000	\b, ppc BSD (Big Endian)
 | |
| +>0	belong&0x03ff0000 0x00960000	\b, vax BSD (4K pages)
 | |
| +>0	belong&0x03ff0000 0x00970000	\b, mips1 BSD
 | |
| +>0	belong&0x03ff0000 0x00980000	\b, mips2 BSD
 | |
| +>0	belong&0x03ff0000 0x00990000	\b, m88k BSD
 | |
| +>0	belong&0x03ff0000 0x00920000	\b, parisc BSD
 | |
| +>0	belong&0x03ff0000 0x009b0000	\b, sh5/64 BSD
 | |
| +>0	belong&0x03ff0000 0x009c0000	\b, SPARC/64 BSD
 | |
| +>0	belong&0x03ff0000 0x009d0000	\b, amd64 BSD
 | |
| +>0	belong&0x03ff0000 0x009e0000	\b, sh5/32 BSD
 | |
| +>0	belong&0x03ff0000 0x009f0000	\b, ia64 BSD
 | |
| +>0	belong&0x03ff0000 0x00b70000	\b, aarch64 BSD
 | |
| +>0	belong&0x03ff0000 0x00b80000	\b, or1k BSD
 | |
| +>0	belong&0x03ff0000 0x00b90000	\b, Risk-V BSD
 | |
| +>0	belong&0x03ff0000 0x00c80000	\b, hp200 BSD
 | |
| +>0	belong&0x03ff0000 0x012c0000	\b, hp300 BSD
 | |
| +>0	belong&0x03ff0000 0x020b0000	\b, hp800 HP-UX
 | |
| +>0	belong&0x03ff0000 0x020c0000	\b, hp200/hp300 HP-UX
 | |
|  >0	belong&0xfc000000 0x04000000	\b, CPU
 | |
|  >0	belong&0xfc000000 0x08000000	\b, DATA
 | |
|  >0	belong&0xfc000000 0x10000000	\b, STACK
 | |
| Index: contrib/file/magic/Magdir/pascal
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/pascal	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/pascal	(working copy)
 | |
| @@ -1,10 +1,10 @@
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: pascal,v 1.1 2011/12/08 12:12:46 rrt Exp $
 | |
| +# $File: pascal,v 1.2 2014/07/14 14:21:33 rrt Exp $
 | |
|  # pascal:  file(1) magic for Pascal source
 | |
|  #
 | |
|  0	search/8192	(input,		Pascal source text
 | |
|  !:mime	text/x-pascal
 | |
| -0	regex		\^program	Pascal source text
 | |
| -!:mime	text/x-pascal
 | |
| -0	regex           	\^record		Pascal source text
 | |
| -!:mime	text/x-pascal
 | |
| +#0	regex		\^program	Pascal source text
 | |
| +#!:mime	text/x-pascal
 | |
| +#0	regex           	\^record		Pascal source text
 | |
| +#!:mime	text/x-pascal
 | |
| Index: contrib/file/magic/Magdir/pgp
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/pgp	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/pgp	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: pgp,v 1.9 2009/09/19 16:28:11 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,7 +21,449 @@
 | |
|  
 | |
|  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:
 | |
| +#  - symmetric encrypted packet header
 | |
| +#  - RSA (e=65537) secret (sub-)keys
 | |
| +
 | |
| +# 1024b RSA encrypted data
 | |
| +
 | |
| +0	string	\x84\x8c\x03		PGP RSA encrypted session key -
 | |
| +>3	lelong	x			keyid: %X
 | |
| +>7	lelong	x			%X
 | |
| +>11	byte	0x01			RSA (Encrypt or Sign) 1024b
 | |
| +>11	byte	0x02			RSA Encrypt-Only 1024b
 | |
| +>12	string	\x04\x00
 | |
| +>12	string	\x03\xff
 | |
| +>12	string	\x03\xfe
 | |
| +>12	string	\x03\xfd
 | |
| +>12	string	\x03\xfc
 | |
| +>12	string	\x03\xfb
 | |
| +>12	string	\x03\xfa
 | |
| +>12	string	\x03\xf9
 | |
| +>142	byte	0xd2			.
 | |
| +
 | |
| +# 2048b RSA encrypted data
 | |
| +
 | |
| +0	string	\x85\x01\x0c\x03	PGP RSA encrypted session key -
 | |
| +>4	lelong	x			keyid: %X
 | |
| +>8	lelong	x			%X
 | |
| +>12	byte	0x01			RSA (Encrypt or Sign) 2048b
 | |
| +>12	byte	0x02			RSA Encrypt-Only 2048b
 | |
| +>13	string	\x08\x00
 | |
| +>13	string	\x07\xff
 | |
| +>13	string	\x07\xfe
 | |
| +>13	string	\x07\xfd
 | |
| +>13	string	\x07\xfc
 | |
| +>13	string	\x07\xfb
 | |
| +>13	string	\x07\xfa
 | |
| +>13	string	\x07\xf9
 | |
| +>271	byte	0xd2			.
 | |
| +
 | |
| +# 3072b RSA encrypted data
 | |
| +
 | |
| +0	string	\x85\x01\x8c\x03	PGP RSA encrypted session key -
 | |
| +>4	lelong	x			keyid: %X
 | |
| +>8	lelong	x			%X
 | |
| +>12	byte	0x01			RSA (Encrypt or Sign) 3072b
 | |
| +>12	byte	0x02			RSA Encrypt-Only 3072b
 | |
| +>13	string	\x0c\x00
 | |
| +>13	string	\x0b\xff
 | |
| +>13	string	\x0b\xfe
 | |
| +>13	string	\x0b\xfd
 | |
| +>13	string	\x0b\xfc
 | |
| +>13	string	\x0b\xfb
 | |
| +>13	string	\x0b\xfa
 | |
| +>13	string	\x0b\xf9
 | |
| +>399	byte	0xd2			.
 | |
| +
 | |
| +# 3072b RSA encrypted data
 | |
| +
 | |
| +0	string	\x85\x02\x0c\x03	PGP RSA encrypted session key -
 | |
| +>4	lelong	x			keyid: %X
 | |
| +>8	lelong	x			%X
 | |
| +>12	byte	0x01			RSA (Encrypt or Sign) 4096b
 | |
| +>12	byte	0x02			RSA Encrypt-Only 4096b
 | |
| +>13	string	\x10\x00
 | |
| +>13	string	\x0f\xff
 | |
| +>13	string	\x0f\xfe
 | |
| +>13	string	\x0f\xfd
 | |
| +>13	string	\x0f\xfc
 | |
| +>13	string	\x0f\xfb
 | |
| +>13	string	\x0f\xfa
 | |
| +>13	string	\x0f\xf9
 | |
| +>527	byte	0xd2			.
 | |
| +
 | |
| +# 4096b RSA encrypted data
 | |
| +
 | |
| +0	string	\x85\x04\x0c\x03	PGP RSA encrypted session key -
 | |
| +>4	lelong	x			keyid: %X
 | |
| +>8	lelong	x			%X
 | |
| +>12	byte	0x01			RSA (Encrypt or Sign) 8129b
 | |
| +>12	byte	0x02			RSA Encrypt-Only 8129b
 | |
| +>13	string	\x20\x00
 | |
| +>13	string	\x1f\xff
 | |
| +>13	string	\x1f\xfe
 | |
| +>13	string	\x1f\xfd
 | |
| +>13	string	\x1f\xfc
 | |
| +>13	string	\x1f\xfb
 | |
| +>13	string	\x1f\xfa
 | |
| +>13	string	\x1f\xf9
 | |
| +>1039	byte	0xd2			.
 | |
| +
 | |
| +# crypto algo mapper
 | |
| +
 | |
| +0	name	crypto
 | |
| +>0	byte	0x00			Plaintext or unencrypted data
 | |
| +>0	byte	0x01			IDEA
 | |
| +>0	byte	0x02			TripleDES
 | |
| +>0	byte	0x03			CAST5 (128 bit key)
 | |
| +>0	byte	0x04			Blowfish (128 bit key, 16 rounds)
 | |
| +>0	byte	0x07			AES with 128-bit key
 | |
| +>0	byte	0x08			AES with 192-bit key
 | |
| +>0	byte	0x09			AES with 256-bit key
 | |
| +>0	byte	0x0a			Twofish with 256-bit key
 | |
| +
 | |
| +# hash algo mapper
 | |
| +
 | |
| +0	name	hash
 | |
| +>0	byte	0x01			MD5
 | |
| +>0	byte	0x02			SHA-1
 | |
| +>0	byte	0x03			RIPE-MD/160
 | |
| +>0	byte	0x08			SHA256
 | |
| +>0	byte	0x09			SHA384
 | |
| +>0	byte	0x0a			SHA512
 | |
| +>0	byte	0x0b			SHA224
 | |
| +
 | |
| +# pgp symmetric encrypted data
 | |
| +
 | |
| +0	byte	0x8c			PGP symmetric key encrypted data -
 | |
| +>1	byte	0x0d
 | |
| +>1	byte	0x0c
 | |
| +>2	byte	0x04
 | |
| +>3	use	crypto
 | |
| +>4	byte	0x01			salted -
 | |
| +>>5	use	hash
 | |
| +>>14	byte	0xd2			.
 | |
| +>>14	byte	0xc9			.
 | |
| +>4	byte	0x03			salted & iterated -
 | |
| +>>5	use	hash
 | |
| +>>15	byte	0xd2			.
 | |
| +>>15	byte	0xc9			.
 | |
| +
 | |
| +# encrypted keymaterial needs s2k & can be checksummed/hashed
 | |
| +
 | |
| +0	name	chkcrypto
 | |
| +>0	use	crypto
 | |
| +>1	byte	0x00			Simple S2K
 | |
| +>1	byte	0x01			Salted S2K
 | |
| +>1	byte	0x03			Salted&Iterated S2K
 | |
| +>2	use	hash
 | |
| +
 | |
| +# all PGP keys start with this prolog
 | |
| +# containing version, creation date, and purpose
 | |
| +
 | |
| +0	name	keyprolog
 | |
| +>0	byte	0x04
 | |
| +>1	beldate	x			created on %s -
 | |
| +>5	byte	0x01			RSA (Encrypt or Sign)
 | |
| +>5	byte	0x02			RSA Encrypt-Only
 | |
| +
 | |
| +# end of secret keys known signature
 | |
| +# contains e=65537 and the prolog to
 | |
| +# the encrypted parameters
 | |
| +
 | |
| +0	name	keyend
 | |
| +>0	string	\x00\x11\x01\x00\x01	e=65537
 | |
| +>5	use	crypto
 | |
| +>5	byte	0xff			checksummed
 | |
| +>>6	use	chkcrypto
 | |
| +>5	byte	0xfe			hashed
 | |
| +>>6	use	chkcrypto
 | |
| +
 | |
| +# PGP secret keys contain also the public parts
 | |
| +# these vary by bitsize of the key
 | |
| +
 | |
| +0	name	x1024
 | |
| +>0	use	keyprolog
 | |
| +>6	string	\x03\xfe
 | |
| +>6	string	\x03\xff
 | |
| +>6	string	\x04\x00
 | |
| +>136	use	keyend
 | |
| +
 | |
| +0	name	x2048
 | |
| +>0	use	keyprolog
 | |
| +>6	string	\x80\x00
 | |
| +>6	string	\x07\xfe
 | |
| +>6	string	\x07\xff
 | |
| +>264	use	keyend
 | |
| +
 | |
| +0	name	x3072
 | |
| +>0	use	keyprolog
 | |
| +>6	string	\x0b\xfe
 | |
| +>6	string	\x0b\xff
 | |
| +>6	string	\x0c\x00
 | |
| +>392	use	keyend
 | |
| +
 | |
| +0	name	x4096
 | |
| +>0	use	keyprolog
 | |
| +>6	string	\x10\x00
 | |
| +>6	string	\x0f\xfe
 | |
| +>6	string	\x0f\xff
 | |
| +>520	use	keyend
 | |
| +
 | |
| +# \x00|\x1f[\xfe\xff]).{1024})'
 | |
| +0	name	x8192
 | |
| +>0	use	keyprolog
 | |
| +>6	string	\x20\x00
 | |
| +>6	string	\x1f\xfe
 | |
| +>6	string	\x1f\xff
 | |
| +>1032	use	keyend
 | |
| +
 | |
| +# depending on the size of the pkt
 | |
| +# we branch into the proper key size
 | |
| +# signatures defined as x{keysize}
 | |
| +
 | |
| +>0	name	pgpkey
 | |
| +>0	string	\x01\xd8	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xeb	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xfb	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xfd	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xf3	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xee	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xfe	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x01\xf4	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x0d	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x03	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x05	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x15	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x00	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x10	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x04	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x06	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x02\x16	1024b
 | |
| +>>2	use	x1024
 | |
| +>0	string	\x03\x98	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xab	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xbb	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xbd	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xcd	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xb3	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xc3	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xc5	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xd5	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xae	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xbe	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xc0	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xd0	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xb4	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xc4	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xc6	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x03\xd6	2048b
 | |
| +>>2	use	x2048
 | |
| +>0	string	\x05X		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05k		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05{		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05}		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x8d	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05s		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x83	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x85	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x95	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05n		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x7e	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x80	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x90	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05t		3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x84	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x86	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x05\x96	3072b
 | |
| +>>2	use	x3072
 | |
| +>0	string	\x07[		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07\x18	4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07+		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07;		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07=		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07M		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x073		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07C		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07E		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07U		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07.		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07>		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07@		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07P		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x074		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07D		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07F		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x07V		4096b
 | |
| +>>2	use	x4096
 | |
| +>0	string	\x0e[		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e\x18	8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e+		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e;		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e=		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eM		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e3		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eC		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eE		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eU		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e.		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e>		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e@		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eP		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0e4		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eD		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eF		8192b
 | |
| +>>2	use	x8192
 | |
| +>0	string	\x0eV		8192b
 | |
| +>>2	use	x8192
 | |
| +
 | |
| +# PGP RSA (e=65537) secret (sub-)key header
 | |
| +
 | |
| +0	byte	0x95			PGP	Secret Key -
 | |
| +>1	use	pgpkey
 | |
| +0	byte	0x97			PGP	Secret Sub-key -
 | |
| +>1	use	pgpkey
 | |
| +0	byte	0x9d			PGP	Secret Sub-key -
 | |
| +>1	use	pgpkey
 | |
| Index: contrib/file/magic/Magdir/python
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/python	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/python	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: python,v 1.25 2014/05/06 16:08:32 christos Exp $
 | |
| +# $File: python,v 1.26 2014/08/04 05:58:40 christos Exp $
 | |
|  # python:  file(1) magic for python
 | |
|  #
 | |
|  # Outlook puts """ too for urgent messages
 | |
| @@ -23,6 +23,7 @@
 | |
|  0	belong		0x4f0c0d0a	python 3.1 byte-compiled
 | |
|  0	belong		0x6c0c0d0a	python 3.2 byte-compiled
 | |
|  0	belong		0x9e0c0d0a	python 3.3 byte-compiled
 | |
| +0	belong		0xee0c0d0a	python 3.4 byte-compiled
 | |
|  
 | |
|  0	search/1/w	#!\ /usr/bin/python	Python script text executable
 | |
|  !:mime text/x-python
 | |
| Index: contrib/file/magic/Magdir/qt
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/qt	(revision 0)
 | |
| +++ contrib/file/magic/Magdir/qt	(working copy)
 | |
| @@ -0,0 +1,19 @@
 | |
| +
 | |
| +#------------------------------------------------------------------------------
 | |
| +# $File: qt,v 1.2 2014/12/16 19:49:29 christos Exp $
 | |
| +# qt:  file(1) magic for Qt
 | |
| +
 | |
| +# http://doc.qt.io/qt-5/resources.html
 | |
| +0	string		\<!DOCTYPE\040RCC\>	Qt Resource Collection file
 | |
| +
 | |
| +# https://qt.gitorious.org/qt/qtbase/source/\
 | |
| +# 5367fa356233da4c0f28172a8f817791525f5457:\
 | |
| +# src/tools/rcc/rcc.cpp#L840
 | |
| +0	string		qres\0\0		Qt Binary Resource file
 | |
| +0	search/1024	The\040Resource\040Compiler\040for\040Qt	Qt C-code resource file
 | |
| +
 | |
| +# https://qt.gitorious.org/qt/qtbase/source/\
 | |
| +# 5367fa356233da4c0f28172a8f817791525f5457:\
 | |
| +# src/corelib/kernel/qtranslator.cpp#L62
 | |
| +0	string		\x3c\xb8\x64\x18\xca\xef\x9c\x95
 | |
| +>8	string		\xcd\x21\x1c\xbf\x60\xa1\xbd\xdd	Qt Translation file
 | |
| Index: contrib/file/magic/Magdir/riff
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/riff	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/riff	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: riff,v 1.27 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: riff,v 1.30 2014/09/23 17:02:12 christos Exp $
 | |
|  # riff:  file(1) magic for RIFF format
 | |
|  # See
 | |
|  #
 | |
| @@ -45,6 +45,26 @@
 | |
|  >>&(4.l+4)  use riff-walk
 | |
|  >0  string  fact
 | |
|  >>&(4.l+4)  use riff-walk
 | |
| +>0  string  VP8
 | |
| +>>11		byte		0x9d
 | |
| +>>>12		byte		0x01
 | |
| +>>>>13		byte		0x2a	\b, VP8 encoding
 | |
| +>>>>>14		leshort&0x3fff	x	\b, %d
 | |
| +>>>>>16		leshort&0x3fff	x	\bx%d, Scaling:
 | |
| +>>>>>14		leshort&0xc000	0x0000	\b [none]
 | |
| +>>>>>14		leshort&0xc000	0x1000	\b [5/4]
 | |
| +>>>>>14		leshort&0xc000	0x2000	\b [5/3]
 | |
| +>>>>>14		leshort&0xc000	0x3000	\b [2]
 | |
| +>>>>>14		leshort&0xc000	0x0000	\bx[none]
 | |
| +>>>>>14		leshort&0xc000	0x1000	\bx[5/4]
 | |
| +>>>>>14		leshort&0xc000	0x2000	\bx[5/3]
 | |
| +>>>>>14		leshort&0xc000	0x3000	\bx[2]
 | |
| +>>>>>15		byte&0x80	=0x00	\b, YUV color
 | |
| +>>>>>15		byte&0x80	=0x80	\b, bad color specification
 | |
| +>>>>>15		byte&0x40	=0x40	\b, no clamping required
 | |
| +>>>>>15		byte&0x40	=0x00	\b, decoders should clamp
 | |
| +#>0  string  x		we got %s
 | |
| +#>>&(4.l+4)  use riff-walk
 | |
|  
 | |
|  # AVI section extended by Patrik Radman <patrik+file-magic@iki.fi>
 | |
|  #
 | |
| @@ -209,6 +229,8 @@
 | |
|  >8	string		4XMV		\b, 4X Movie file 
 | |
|  # AMV-type AVI file: http://wiki.multimedia.cx/index.php?title=AMV
 | |
|  >8	string		AMV\040		\b, AMV 
 | |
| +>8      string          WEBP            \b, Web/P image
 | |
| +>>12	use		riff-walk
 | |
|  
 | |
|  #
 | |
|  # XXX - some of the below may only appear in little-endian form.
 | |
| @@ -284,4 +306,3 @@
 | |
|  >>&6	leshort		=2		\b, stereo
 | |
|  >>&6	leshort		>2		\b, %d channels
 | |
|  >>&8	lelong		>0		%d Hz
 | |
| -
 | |
| Index: contrib/file/magic/Magdir/rinex
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/rinex	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/rinex	(working copy)
 | |
| @@ -1,44 +0,0 @@
 | |
| -
 | |
| -#------------------------------------------------------------------------------
 | |
| -# $File: rinex,v 1.4 2011/05/03 01:44:17 christos Exp $
 | |
| -# rinex:  file(1) magic for RINEX files
 | |
| -# http://igscb.jpl.nasa.gov/igscb/data/format/rinex210.txt
 | |
| -# ftp://cddis.gsfc.nasa.gov/pub/reports/formats/rinex300.pdf
 | |
| -# data for testing: ftp://cddis.gsfc.nasa.gov/pub/gps/data
 | |
| -60	string		RINEX
 | |
| ->80	search/256	XXRINEXB	RINEX Data, GEO SBAS Broadcast
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/broadcast
 | |
| ->80	search/256	XXRINEXD	RINEX Data, Observation (Hatanaka comp)
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/observation
 | |
| ->80	search/256	XXRINEXC	RINEX Data, Clock
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/clock
 | |
| ->80	search/256	XXRINEXH	RINEX Data, GEO SBAS Navigation
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/navigation
 | |
| ->80	search/256	XXRINEXG	RINEX Data, GLONASS Navigation
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/navigation
 | |
| ->80	search/256	XXRINEXL	RINEX Data, Galileo Navigation
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/navigation
 | |
| ->80	search/256	XXRINEXM	RINEX Data, Meteorological
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/meteorological
 | |
| ->80	search/256	XXRINEXN	RINEX Data, Navigation	
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/navigation
 | |
| ->80	search/256	XXRINEXO	RINEX Data, Observation
 | |
| ->>&32	string		x		\b, date %15.15s
 | |
| ->>5	string		x		\b, version %6.6s
 | |
| -!:mime	rinex/observation
 | |
| Index: contrib/file/magic/Magdir/sequent
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/sequent	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/sequent	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: sequent,v 1.11 2014/06/02 19:27:54 christos Exp $
 | |
| +# $File: sequent,v 1.12 2014/08/16 16:07:12 christos Exp $
 | |
|  # sequent:  file(1) magic for Sequent machines
 | |
|  #
 | |
|  # Sequent information updated by Don Dwiggins <atsun!dwiggins>.
 | |
| @@ -30,9 +30,6 @@
 | |
|  0	leshort	0x32eb		SYMMETRY i386 executable (invalid @ 0)
 | |
|  >16	lelong	>0		not stripped
 | |
|  >124	lelong	>0		version %d
 | |
| -0	leshort	0x42eb		SYMMETRY i386 standalone executable
 | |
| ->16	lelong	>0		not stripped
 | |
| ->124	lelong	>0		version %d
 | |
|  # http://en.wikipedia.org/wiki/Sequent_Computer_Systems
 | |
|  # below test line conflicts with MS-DOS 2.11 floppies and Acronis loader
 | |
|  #0	leshort	0x42eb		SYMMETRY i386 standalone executable
 | |
| Index: contrib/file/magic/Magdir/sereal
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/sereal	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/sereal	(working copy)
 | |
| @@ -1,5 +1,6 @@
 | |
| +
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: sereal,v 1.1 2014/05/14 23:04:59 christos Exp $
 | |
| +# $File: sereal,v 1.2 2014/11/11 20:10:49 christos Exp $
 | |
|  # sereal: file(1) magic the Sereal binary serialization format
 | |
|  #
 | |
|  # From: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
 | |
| @@ -15,10 +16,10 @@
 | |
|  #
 | |
|  # See https://github.com/Sereal/Sereal/commit/35372ae01d in the
 | |
|  # Sereal.git repository for test Sereal data.
 | |
| -0      string             \=srl   Sereal data
 | |
| +0	string		\=srl   Sereal data
 | |
|  !:mime application/sereal
 | |
| ->4     byte&0x0F          x       (version %d,
 | |
| ->4     byte&0xF0          0x00    uncompressed)
 | |
| ->4     byte&0xF0          0x10    compressed with non-incremental Snappy)
 | |
| ->4     byte&0xF0          0x20    compressed with incremental Snappy)
 | |
| ->4     byte&0xF0          >0x20   unknown subformat, flag: %d>>4)
 | |
| +>4	byte&0x0F	x	(version %d,
 | |
| +>4	byte&0xF0	0x00	uncompressed)
 | |
| +>4	byte&0xF0	0x10	compressed with non-incremental Snappy)
 | |
| +>4	byte&0xF0	0x20	compressed with incremental Snappy)
 | |
| +>4	byte&0xF0	>0x20	unknown subformat, flag: %d>>4)
 | |
| Index: contrib/file/magic/Magdir/ssh
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/ssh	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/ssh	(working copy)
 | |
| @@ -3,6 +3,7 @@
 | |
|  
 | |
|  0	string	SSH\ PRIVATE\ KEY	OpenSSH RSA1 private key,
 | |
|  >28	string	>\0			version %s
 | |
| +0	string	-----BEGIN\ OPENSSH\ PRIVATE\ KEY-----	OpenSSH private key
 | |
|  
 | |
|  0	string	ssh-dss\ 		OpenSSH DSA public key
 | |
|  0	string	ssh-rsa\ 		OpenSSH RSA public key
 | |
| @@ -9,3 +10,4 @@
 | |
|  0	string	ecdsa-sha2-nistp256	OpenSSH ECDSA public key
 | |
|  0	string	ecdsa-sha2-nistp384	OpenSSH ECDSA public key
 | |
|  0	string	ecdsa-sha2-nistp521	OpenSSH ECDSA public key
 | |
| +0	string	ssh-ed25519		OpenSSH ED25519 public key
 | |
| Index: contrib/file/magic/Magdir/vms
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/vms	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/vms	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: vms,v 1.7 2013/03/09 22:36:00 christos Exp $
 | |
| +# $File: vms,v 1.9 2014/08/17 13:47:59 christos Exp $
 | |
|  # vms:  file(1) magic for VMS executables (experimental)
 | |
|  #
 | |
|  # VMS .exe formats, both VAX and AXP (Greg Roelofs, newt@uchicago.edu)
 | |
| Index: contrib/file/magic/Magdir/vorbis
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/vorbis	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/vorbis	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: vorbis,v 1.18 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: vorbis,v 1.20 2014/09/23 16:35:08 christos Exp $
 | |
|  # vorbis:  file(1) magic for Ogg/Vorbis files
 | |
|  #
 | |
|  # From Felix von Leitner <leitner@fefe.de>
 | |
| @@ -23,7 +23,6 @@
 | |
|  # --- Ogg Framing ---
 | |
|  #0		search/1000	OggS		Ogg data
 | |
|  0		string	OggS		Ogg data
 | |
| -!:mime		application/ogg
 | |
|  >4		byte		!0		UNKNOWN REVISION %u
 | |
|  ##>4		byte		0		revision 0
 | |
|  >4		byte		0
 | |
| @@ -31,9 +30,12 @@
 | |
|  # non-Vorbis content: FLAC (Free Lossless Audio Codec, http://flac.sourceforge.net)
 | |
|  >>28		string		\x7fFLAC	\b, FLAC audio
 | |
|  # non-Vorbis content: Theora
 | |
| +!:mime		audio/ogg
 | |
|  >>28		string		\x80theora	\b, Theora video
 | |
| +!:mime		video/ogg
 | |
|  # non-Vorbis content: Kate
 | |
| ->>28		string		\x80kate\0\0\0\0	\b, Kate
 | |
| +>>28		string		\x80kate\0\0\0\0	\b, Kate (Karaoke and Text)
 | |
| +!:mime		application/ogg
 | |
|  >>>37		ubyte		x		v%u
 | |
|  >>>38		ubyte		x		\b.%u,
 | |
|  >>>40		byte		0		utf8 encoding,
 | |
| @@ -44,12 +46,15 @@
 | |
|  >>>76		string		\0		no category set
 | |
|  # non-Vorbis content: Skeleton
 | |
|  >>28		string		fishead\0	\b, Skeleton
 | |
| +!:mime		video/ogg
 | |
|  >>>36		short		x		v%u
 | |
|  >>>40		short		x		\b.%u
 | |
|  # non-Vorbis content: Speex
 | |
|  >>28		string		Speex\ \ \ 	\b, Speex audio
 | |
| +!:mime		audio/ogg
 | |
|  # non-Vorbis content: OGM
 | |
|  >>28		string		\x01video\0\0\0	\b, OGM video
 | |
| +!:mime		video/ogg
 | |
|  >>>37		string/c	div3		(DivX 3)
 | |
|  >>>37		string/c	divx		(DivX 4)
 | |
|  >>>37		string/c	dx50		(DivX 5)
 | |
| @@ -56,6 +61,7 @@
 | |
|  >>>37		string/c	xvid		(XviD)
 | |
|  # --- First vorbis packet - general header ---
 | |
|  >>28		string		\x01vorbis	\b, Vorbis audio,
 | |
| +!:mime		audio/ogg
 | |
|  >>>35		lelong		!0		UNKNOWN VERSION %u,
 | |
|  ##>>>35		lelong		0		version 0,
 | |
|  >>>35		lelong		0
 | |
| Index: contrib/file/magic/Magdir/windows
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Magdir/windows	(revision 284174)
 | |
| +++ contrib/file/magic/Magdir/windows	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  
 | |
|  #------------------------------------------------------------------------------
 | |
| -# $File: windows,v 1.8 2014/04/30 21:41:02 christos Exp $
 | |
| +# $File: windows,v 1.10 2014/09/24 19:52:46 christos Exp $
 | |
|  # windows:  file(1) magic for Microsoft Windows
 | |
|  #
 | |
|  # This file is mainly reserved for files where programs
 | |
| @@ -159,8 +159,9 @@
 | |
|  >&0	string		Version\ 5.00\r\n\r\n	Windows Registry text (Win2K or above)
 | |
|  
 | |
|  # Windows *.INF *.INI files updated by Joerg Jenderek at Apr 2013
 | |
| -# emtpy ,comment , section , unicode line
 | |
| -0	regex/s		\\`(\r\n|;|[[]|\xFF\xFE)			
 | |
| +# empty ,comment , section
 | |
| +# PR/383: remove unicode BOM because it is not portable across regex impls
 | |
| +0	regex/s		\\`(\\r\\n|;|[[])
 | |
|  # left bracket in section line
 | |
|  >&0	search/8192	[						
 | |
|  # http://en.wikipedia.org/wiki/Autorun.inf
 | |
| Index: contrib/file/magic/Makefile.am
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Makefile.am	(revision 284174)
 | |
| +++ contrib/file/magic/Makefile.am	(working copy)
 | |
| @@ -1,5 +1,5 @@
 | |
|  #
 | |
| -# $File: Makefile.am,v 1.98 2014/06/03 18:22:34 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 \
 | |
| @@ -142,6 +143,7 @@ $(MAGIC_FRAGMENT_DIR)/matroska \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mcrypt \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mercurial \
 | |
|  $(MAGIC_FRAGMENT_DIR)/metastore \
 | |
| +$(MAGIC_FRAGMENT_DIR)/meteorological \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mime \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mips \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mirage \
 | |
| @@ -196,9 +198,9 @@ $(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)/rinex \
 | |
|  $(MAGIC_FRAGMENT_DIR)/rpm \
 | |
|  $(MAGIC_FRAGMENT_DIR)/rtf \
 | |
|  $(MAGIC_FRAGMENT_DIR)/ruby \
 | |
| Index: contrib/file/magic/Makefile.in
 | |
| ===================================================================
 | |
| --- contrib/file/magic/Makefile.in	(revision 284174)
 | |
| +++ contrib/file/magic/Makefile.in	(working copy)
 | |
| @@ -262,7 +262,7 @@ top_builddir = @top_builddir@
 | |
|  top_srcdir = @top_srcdir@
 | |
|  
 | |
|  #
 | |
| -# $File: Makefile.am,v 1.98 2014/06/03 18:22:34 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
 | |
| @@ -378,6 +378,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 \
 | |
| @@ -403,6 +404,7 @@ $(MAGIC_FRAGMENT_DIR)/matroska \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mcrypt \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mercurial \
 | |
|  $(MAGIC_FRAGMENT_DIR)/metastore \
 | |
| +$(MAGIC_FRAGMENT_DIR)/meteorological \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mime \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mips \
 | |
|  $(MAGIC_FRAGMENT_DIR)/mirage \
 | |
| @@ -457,9 +459,9 @@ $(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)/rinex \
 | |
|  $(MAGIC_FRAGMENT_DIR)/rpm \
 | |
|  $(MAGIC_FRAGMENT_DIR)/rtf \
 | |
|  $(MAGIC_FRAGMENT_DIR)/ruby \
 | |
| Index: contrib/file/src/Makefile.in
 | |
| ===================================================================
 | |
| --- contrib/file/src/Makefile.in	(revision 284174)
 | |
| +++ contrib/file/src/Makefile.in	(working copy)
 | |
| @@ -81,9 +81,9 @@ build_triplet = @build@
 | |
|  host_triplet = @host@
 | |
|  bin_PROGRAMS = file$(EXEEXT)
 | |
|  subdir = src
 | |
| -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am pread.c \
 | |
| -	ctime_r.c getline.c vasprintf.c asprintf.c asctime_r.c \
 | |
| -	fmtcheck.c strlcpy.c getopt_long.c strcasestr.c strlcat.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: contrib/file/src/apprentice.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/apprentice.c	(revision 284174)
 | |
| +++ contrib/file/src/apprentice.c	(working copy)
 | |
| @@ -32,7 +32,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: apprentice.c,v 1.211 2014/06/03 19:01:34 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: apprentice.c,v 1.229 2015/01/01 17:07:34 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -86,6 +86,10 @@
 | |
|  #define ALLOC_CHUNK	(size_t)10
 | |
|  #define ALLOC_INCR	(size_t)200
 | |
|  
 | |
| +#define MAP_TYPE_MMAP	0
 | |
| +#define MAP_TYPE_MALLOC	1
 | |
| +#define MAP_TYPE_USER	2
 | |
| +
 | |
|  struct magic_entry {
 | |
|  	struct magic *mp;	
 | |
|  	uint32_t cont_count;
 | |
| @@ -101,6 +105,7 @@ struct magic_entry_set {
 | |
|  struct magic_map {
 | |
|  	void *p;
 | |
|  	size_t len;
 | |
| +	int type;
 | |
|  	struct magic *magic[MAGIC_SETS];
 | |
|  	uint32_t nmagic[MAGIC_SETS];
 | |
|  };
 | |
| @@ -131,7 +136,10 @@ private uint16_t swap2(uint16_t);
 | |
|  private uint32_t swap4(uint32_t);
 | |
|  private uint64_t swap8(uint64_t);
 | |
|  private char *mkdbname(struct magic_set *, const char *, int);
 | |
| +private struct magic_map *apprentice_buf(struct magic_set *, struct magic *,
 | |
| +    size_t);
 | |
|  private struct magic_map *apprentice_map(struct magic_set *, const char *);
 | |
| +private int check_buffer(struct magic_set *, struct magic_map *, const char *);
 | |
|  private void apprentice_unmap(struct magic_map *);
 | |
|  private int apprentice_compile(struct magic_set *, struct magic_map *,
 | |
|      const char *);
 | |
| @@ -396,10 +404,11 @@ add_mlist(struct mlist *mlp, struct magic_map *map
 | |
|  {
 | |
|  	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];
 | |
|  
 | |
| @@ -416,13 +425,11 @@ add_mlist(struct mlist *mlp, struct magic_map *map
 | |
|  private int
 | |
|  apprentice_1(struct magic_set *ms, const char *fn, int action)
 | |
|  {
 | |
| +	struct magic_map *map;
 | |
|  #ifndef COMPILE_ONLY
 | |
|  	struct mlist *ml;
 | |
| -#endif /* COMPILE_ONLY */
 | |
| -	struct magic_map *map;
 | |
| -#ifndef COMPILE_ONLY
 | |
|  	size_t i;
 | |
| -#endif /* COMPILE_ONLY */
 | |
| +#endif
 | |
|  
 | |
|  	if (magicsize != FILE_MAGICSIZE) {
 | |
|  		file_error(ms, 0, "magic element size %lu != %lu",
 | |
| @@ -451,22 +458,29 @@ apprentice_1(struct magic_set *ms, const char *fn,
 | |
|  	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;
 | |
|  		}
 | |
|  	}
 | |
|  
 | |
|  	if (action == FILE_LIST) {
 | |
|  		for (i = 0; i < MAGIC_SETS; i++) {
 | |
| -			printf("Set %zu:\nBinary patterns:\n", i);
 | |
| +			printf("Set %" SIZE_T_FORMAT "u:\nBinary patterns:\n",
 | |
| +			    i);
 | |
|  			apprentice_list(ms->mlist[i], BINTEST);
 | |
|  			printf("Text patterns:\n");
 | |
|  			apprentice_list(ms->mlist[i], TEXTTEST);
 | |
|  		}
 | |
|  	}
 | |
| +	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 */
 | |
| -	
 | |
| -	return 0;
 | |
|  }
 | |
|  
 | |
|  protected void
 | |
| @@ -510,6 +524,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);
 | |
| @@ -521,17 +540,21 @@ apprentice_unmap(struct magic_map *map)
 | |
|  {
 | |
|  	if (map == NULL)
 | |
|  		return;
 | |
| -	if (map->p != NULL) {
 | |
| +
 | |
| +	switch (map->type) {
 | |
|  #ifdef QUICK
 | |
| -		if (map->len)
 | |
| +	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);
 | |
|  }
 | |
| @@ -550,21 +573,70 @@ 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
 | |
| +/* void **bufs: an array of compiled magic files */
 | |
| +protected int
 | |
| +buffer_apprentice(struct magic_set *ms, struct magic **bufs,
 | |
| +    size_t *sizes, size_t nbufs)
 | |
| +{
 | |
| +	size_t i, j;
 | |
| +	struct mlist *ml;
 | |
| +	struct magic_map *map;
 | |
| +
 | |
| +	if (nbufs == 0)
 | |
| +		return -1;
 | |
| +
 | |
| +	if (ms->mlist[0] != NULL)
 | |
| +		file_reset(ms);
 | |
| +
 | |
| +	init_file_tables();
 | |
| +
 | |
| +	for (i = 0; i < MAGIC_SETS; i++) {
 | |
| +		mlist_free(ms->mlist[i]);
 | |
| +		if ((ms->mlist[i] = mlist_alloc()) == NULL) {
 | |
| +			file_oomem(ms, sizeof(*ms->mlist[i]));
 | |
| +			goto fail;
 | |
| +		}
 | |
| +	}
 | |
| +
 | |
| +	for (i = 0; i < nbufs; i++) {
 | |
| +		map = apprentice_buf(ms, bufs[i], sizes[i]);
 | |
| +		if (map == NULL)
 | |
| +			goto fail;
 | |
| +
 | |
| +		for (j = 0; j < MAGIC_SETS; j++) {
 | |
| +			if (add_mlist(ms->mlist[j], map, j) == -1) {
 | |
| +				file_oomem(ms, sizeof(*ml));
 | |
| +				goto fail;
 | |
| +			}
 | |
| +		}
 | |
| +	}
 | |
| +
 | |
| +	return 0;
 | |
| +fail:
 | |
| +	for (i = 0; i < MAGIC_SETS; i++) {
 | |
| +		mlist_free(ms->mlist[i]);
 | |
| +		ms->mlist[i] = NULL;
 | |
| +	}
 | |
| +	return -1;
 | |
| +}
 | |
| +#endif
 | |
| +
 | |
|  /* const char *fn: list of magic files and directories */
 | |
|  protected int
 | |
|  file_apprentice(struct magic_set *ms, const char *fn, int action)
 | |
| @@ -590,11 +662,9 @@ file_apprentice(struct magic_set *ms, const char *
 | |
|  		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;
 | |
| @@ -1317,7 +1387,7 @@ file_signextend(struct magic_set *ms, struct magic
 | |
|  		 * the sign extension must have happened.
 | |
|  		 */
 | |
|  		case FILE_BYTE:
 | |
| -			v = (char) v;
 | |
| +			v = (signed char) v;
 | |
|  			break;
 | |
|  		case FILE_SHORT:
 | |
|  		case FILE_BESHORT:
 | |
| @@ -1535,6 +1605,145 @@ check_cond(struct magic_set *ms, int cond, uint32_
 | |
|  }
 | |
|  #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
 | |
|   */
 | |
| @@ -1804,118 +2013,27 @@ parse(struct magic_set *ms, struct magic_entry *me
 | |
|  	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)
 | |
| @@ -2069,8 +2187,14 @@ out:
 | |
|  }
 | |
|  
 | |
|  private int
 | |
| +goodchar(unsigned char x, const char *extra)
 | |
| +{
 | |
| +	return (isascii(x) && isalnum(x)) || strchr(extra, x);
 | |
| +}
 | |
| +
 | |
| +private int
 | |
|  parse_extra(struct magic_set *ms, struct magic_entry *me, const char *line,
 | |
| -    off_t off, size_t len, const char *name, int nt)
 | |
| +    off_t off, size_t len, const char *name, const char *extra, int nt)
 | |
|  {
 | |
|  	size_t i;
 | |
|  	const char *l = line;
 | |
| @@ -2091,9 +2215,7 @@ parse_extra(struct magic_set *ms, struct magic_ent
 | |
|  	}
 | |
|  
 | |
|  	EATAB;
 | |
| -	for (i = 0; *l && ((isascii((unsigned char)*l) &&
 | |
| -	    isalnum((unsigned char)*l)) || strchr("-+/.", *l)) &&
 | |
| -	    i < len; buf[i++] = *l++)
 | |
| +	for (i = 0; *l && i < len && goodchar(*l, extra); buf[i++] = *l++)
 | |
|  		continue;
 | |
|  
 | |
|  	if (i == len && *l) {
 | |
| @@ -2103,6 +2225,9 @@ parse_extra(struct magic_set *ms, struct magic_ent
 | |
|  			file_magwarn(ms, "%s type `%s' truncated %"
 | |
|  			    SIZE_T_FORMAT "u", name, line, i);
 | |
|  	} else {
 | |
| +		if (!isspace((unsigned char)*l) && !goodchar(*l, extra))
 | |
| +			file_magwarn(ms, "%s type `%s' has bad char '%c'",
 | |
| +			    name, line, *l);
 | |
|  		if (nt)
 | |
|  			buf[i] = '\0';
 | |
|  	}
 | |
| @@ -2109,8 +2234,9 @@ parse_extra(struct magic_set *ms, struct magic_ent
 | |
|  
 | |
|  	if (i > 0)
 | |
|  		return 0;
 | |
| -	else
 | |
| -		return -1;
 | |
| +
 | |
| +	file_magerror(ms, "Bad magic entry '%s'", line);
 | |
| +	return -1;
 | |
|  }
 | |
|  
 | |
|  /*
 | |
| @@ -2123,7 +2249,7 @@ parse_apple(struct magic_set *ms, struct magic_ent
 | |
|  	struct magic *m = &me->mp[0];
 | |
|  
 | |
|  	return parse_extra(ms, me, line, offsetof(struct magic, apple),
 | |
| -	    sizeof(m->apple), "APPLE", 0);
 | |
| +	    sizeof(m->apple), "APPLE", "!+-./", 0);
 | |
|  }
 | |
|  
 | |
|  /*
 | |
| @@ -2136,7 +2262,7 @@ parse_mime(struct magic_set *ms, struct magic_entr
 | |
|  	struct magic *m = &me->mp[0];
 | |
|  
 | |
|  	return parse_extra(ms, me, line, offsetof(struct magic, mimetype),
 | |
| -	    sizeof(m->mimetype), "MIME", 1);
 | |
| +	    sizeof(m->mimetype), "MIME", "+-/.", 1);
 | |
|  }
 | |
|  
 | |
|  private int
 | |
| @@ -2697,6 +2823,28 @@ eatsize(const char **p)
 | |
|  }
 | |
|  
 | |
|  /*
 | |
| + * handle a buffer containing a compiled file.
 | |
| + */
 | |
| +private struct magic_map *
 | |
| +apprentice_buf(struct magic_set *ms, struct magic *buf, size_t len)
 | |
| +{
 | |
| +	struct magic_map *map;
 | |
| +
 | |
| +	if ((map = CAST(struct magic_map *, calloc(1, sizeof(*map)))) == NULL) {
 | |
| +		file_oomem(ms, sizeof(*map));
 | |
| +		return NULL;
 | |
| +	}
 | |
| +	map->len = len;
 | |
| +	map->p = buf;
 | |
| +	map->type = MAP_TYPE_USER;
 | |
| +	if (check_buffer(ms, map, "buffer") != 0) {
 | |
| +		apprentice_unmap(map);
 | |
| +		return NULL;
 | |
| +	}
 | |
| +	return map;
 | |
| +}
 | |
| +
 | |
| +/*
 | |
|   * handle a compiled file.
 | |
|   */
 | |
|  
 | |
| @@ -2705,12 +2853,8 @@ apprentice_map(struct magic_set *ms, const char *f
 | |
|  {
 | |
|  	int fd;
 | |
|  	struct stat st;
 | |
| -	uint32_t *ptr;
 | |
| -	uint32_t version, entries, nentries;
 | |
| -	int needsbyteswap;
 | |
|  	char *dbname = NULL;
 | |
|  	struct magic_map *map;
 | |
| -	size_t i;
 | |
|  
 | |
|  	fd = -1;
 | |
|  	if ((map = CAST(struct magic_map *, calloc(1, sizeof(*map)))) == NULL) {
 | |
| @@ -2742,6 +2886,7 @@ apprentice_map(struct magic_set *ms, const char *f
 | |
|  		file_error(ms, errno, "cannot map `%s'", dbname);
 | |
|  		goto error;
 | |
|  	}
 | |
| +	map->type = MAP_TYPE_MMAP;
 | |
|  #else
 | |
|  	if ((map->p = CAST(void *, malloc(map->len))) == NULL) {
 | |
|  		file_oomem(ms, map->len);
 | |
| @@ -2751,16 +2896,39 @@ apprentice_map(struct magic_set *ms, const char *f
 | |
|  		file_badread(ms);
 | |
|  		goto error;
 | |
|  	}
 | |
| -	map->len = 0;
 | |
| +	map->type = MAP_TYPE_MALLOC;
 | |
|  #define RET	1
 | |
|  #endif
 | |
|  	(void)close(fd);
 | |
|  	fd = -1;
 | |
| +
 | |
| +	if (check_buffer(ms, map, dbname) != 0)
 | |
| +		goto error;
 | |
| +
 | |
| +	free(dbname);
 | |
| +	return map;
 | |
| +
 | |
| +error:
 | |
| +	if (fd != -1)
 | |
| +		(void)close(fd);
 | |
| +	apprentice_unmap(map);
 | |
| +	free(dbname);
 | |
| +	return NULL;
 | |
| +}
 | |
| +
 | |
| +private int
 | |
| +check_buffer(struct magic_set *ms, struct magic_map *map, const char *dbname)
 | |
| +{
 | |
| +	uint32_t *ptr;
 | |
| +	uint32_t entries, nentries;
 | |
| +	uint32_t version;
 | |
| +	int i, needsbyteswap;
 | |
| +
 | |
|  	ptr = CAST(uint32_t *, map->p);
 | |
|  	if (*ptr != MAGICNO) {
 | |
|  		if (swap4(*ptr) != MAGICNO) {
 | |
|  			file_error(ms, 0, "bad magic in `%s'", dbname);
 | |
| -			goto error;
 | |
| +			return -1;
 | |
|  		}
 | |
|  		needsbyteswap = 1;
 | |
|  	} else
 | |
| @@ -2773,15 +2941,14 @@ apprentice_map(struct magic_set *ms, const char *f
 | |
|  		file_error(ms, 0, "File %s supports only version %d magic "
 | |
|  		    "files. `%s' is version %d", VERSION,
 | |
|  		    VERSIONNO, dbname, version);
 | |
| -		goto error;
 | |
| +		return -1;
 | |
|  	}
 | |
| -	entries = (uint32_t)(st.st_size / sizeof(struct magic));
 | |
| -	if ((off_t)(entries * sizeof(struct magic)) != st.st_size) {
 | |
| -		file_error(ms, 0, "Size of `%s' %" INT64_T_FORMAT "u is not "
 | |
| +	entries = (uint32_t)(map->len / sizeof(struct magic));
 | |
| +	if ((entries * sizeof(struct magic)) != map->len) {
 | |
| +		file_error(ms, 0, "Size of `%s' %" SIZE_T_FORMAT "u is not "
 | |
|  		    "a multiple of %" SIZE_T_FORMAT "u",
 | |
| -		    dbname, (unsigned long long)st.st_size,
 | |
| -		    sizeof(struct magic));
 | |
| -		goto error;
 | |
| +		    dbname, map->len, sizeof(struct magic));
 | |
| +		return -1;
 | |
|  	}
 | |
|  	map->magic[0] = CAST(struct magic *, map->p) + 1;
 | |
|  	nentries = 0;
 | |
| @@ -2797,20 +2964,12 @@ apprentice_map(struct magic_set *ms, const char *f
 | |
|  	if (entries != nentries + 1) {
 | |
|  		file_error(ms, 0, "Inconsistent entries in `%s' %u != %u",
 | |
|  		    dbname, entries, nentries + 1);
 | |
| -		goto error;
 | |
| +		return -1;
 | |
|  	}
 | |
|  	if (needsbyteswap)
 | |
|  		for (i = 0; i < MAGIC_SETS; i++)
 | |
|  			byteswap(map->magic[i], map->nmagic[i]);
 | |
| -	free(dbname);
 | |
| -	return map;
 | |
| -
 | |
| -error:
 | |
| -	if (fd != -1)
 | |
| -		(void)close(fd);
 | |
| -	apprentice_unmap(map);
 | |
| -	free(dbname);
 | |
| -	return NULL;
 | |
| +	return 0;
 | |
|  }
 | |
|  
 | |
|  /*
 | |
| Index: contrib/file/src/ascmagic.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/ascmagic.c	(revision 284174)
 | |
| +++ contrib/file/src/ascmagic.c	(working copy)
 | |
| @@ -35,7 +35,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: ascmagic.c,v 1.88 2014/02/12 23:20:53 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: ascmagic.c,v 1.91 2014/11/28 02:46:39 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -147,7 +147,8 @@ file_ascmagic_with_encoding(struct magic_set *ms,
 | |
|  		    == NULL)
 | |
|  			goto done;
 | |
|  		if ((rv = file_softmagic(ms, utf8_buf,
 | |
| -		    (size_t)(utf8_end - utf8_buf), 0, TEXTTEST, text)) == 0)
 | |
| +		    (size_t)(utf8_end - utf8_buf), 0, NULL,
 | |
| +		    TEXTTEST, text)) == 0)
 | |
|  			rv = -1;
 | |
|  	}
 | |
|  
 | |
| Index: contrib/file/src/cdf.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/cdf.c	(revision 284174)
 | |
| +++ contrib/file/src/cdf.c	(working copy)
 | |
| @@ -35,7 +35,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef lint
 | |
| -FILE_RCSID("@(#)$File: cdf.c,v 1.63 2014/06/09 13:04:37 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: cdf.c,v 1.69 2014/12/04 15:56:46 christos Exp $")
 | |
|  #endif
 | |
|  
 | |
|  #include <assert.h>
 | |
| @@ -73,6 +73,8 @@ 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_GETUINT32(x, y)	cdf_getuint32(x, y)
 | |
|  
 | |
|  
 | |
| @@ -461,6 +463,12 @@ cdf_count_chain(const cdf_sat_t *sat, cdf_secid_t
 | |
|  	    / 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) {
 | |
| @@ -817,13 +825,18 @@ cdf_read_property_info(const cdf_stream_t *sst, co
 | |
|  		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));
 | |
| +		if (q < p) {
 | |
| +			DPRINTF(("Wrapped around %p < %p\n", q, p));
 | |
| +			goto out;
 | |
| +		}
 | |
|  		if (q > e) {
 | |
|  			DPRINTF(("Ran of the end %p > %p\n", q, e));
 | |
|  			goto out;
 | |
| @@ -985,8 +998,56 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, c
 | |
|  }
 | |
|  
 | |
|  
 | |
| +#define extract_catalog_field(f, l) \
 | |
| +    memcpy(&ce[i].f, b + (l), sizeof(ce[i].f)); \
 | |
| +    ce[i].f = CDF_TOLE(ce[i].f)
 | |
|  
 | |
|  int
 | |
| +cdf_unpack_catalog(const cdf_header_t *h, const cdf_stream_t *sst,
 | |
| +    cdf_catalog_t **cat)
 | |
| +{
 | |
| +	size_t ss = sst->sst_dirlen < h->h_min_size_standard_stream ?
 | |
| +	    CDF_SHORT_SEC_SIZE(h) : CDF_SEC_SIZE(h);
 | |
| +	const char *b = CAST(const char *, sst->sst_tab);
 | |
| +	const char *eb = b + ss * sst->sst_len;
 | |
| +	size_t nr, i, k;
 | |
| +	cdf_catalog_entry_t *ce;
 | |
| +	uint16_t reclen;
 | |
| +	const uint16_t *np;
 | |
| +
 | |
| +	for (nr = 0; b < eb; nr++) {
 | |
| +		memcpy(&reclen, b, sizeof(reclen));
 | |
| +		reclen = CDF_TOLE2(reclen);
 | |
| +		if (reclen == 0)
 | |
| +			break;
 | |
| +		b += reclen;
 | |
| +	}
 | |
| +	*cat = CAST(cdf_catalog_t *,
 | |
| +	    malloc(sizeof(cdf_catalog_t) + nr * sizeof(*ce)));
 | |
| +	(*cat)->cat_num = nr;
 | |
| +	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);
 | |
| +		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));
 | |
| +		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[ce[i].ce_namlen] = 0;
 | |
| +		b += reclen;
 | |
| +	}
 | |
| +	return 0;
 | |
| +}
 | |
| +
 | |
| +int
 | |
|  cdf_print_classid(char *buf, size_t buflen, const cdf_classid_t *id)
 | |
|  {
 | |
|  	return snprintf(buf, buflen, "%.8x-%.4x-%.4x-%.2x%.2x-"
 | |
| @@ -1068,6 +1129,15 @@ cdf_print_elapsed_time(char *buf, size_t bufsiz, c
 | |
|  	return len;
 | |
|  }
 | |
|  
 | |
| +char *
 | |
| +cdf_u16tos8(char *buf, size_t len, const uint16_t *p)
 | |
| +{
 | |
| +	size_t i;
 | |
| +	for (i = 0; i < len && p[i]; i++)
 | |
| +		buf[i] = (char)p[i];
 | |
| +	buf[i] = '\0';
 | |
| +	return buf;
 | |
| +}
 | |
|  
 | |
|  #ifdef CDF_DEBUG
 | |
|  void
 | |
| @@ -1093,7 +1163,7 @@ cdf_dump_header(const cdf_header_t *h)
 | |
|  	for (i = 0; i < __arraycount(h->h_master_sat); i++) {
 | |
|  		if (h->h_master_sat[i] == CDF_SECID_FREE)
 | |
|  			break;
 | |
| -		(void)fprintf(stderr, "%35.35s[%.3zu] = %d\n",
 | |
| +		(void)fprintf(stderr, "%35.35s[%.3" SIZE_T_FORMAT "u] = %d\n",
 | |
|  		    "master_sat", i, h->h_master_sat[i]);
 | |
|  	}
 | |
|  }
 | |
| @@ -1288,7 +1358,7 @@ cdf_dump_summary_info(const cdf_header_t *h, const
 | |
|  		return;
 | |
|  	(void)fprintf(stderr, "Endian: %x\n", ssi.si_byte_order);
 | |
|  	(void)fprintf(stderr, "Os Version %d.%d\n", ssi.si_os_version & 0xff,
 | |
| -		ssi.si_os_version >> 8);
 | |
| +	    ssi.si_os_version >> 8);
 | |
|  	(void)fprintf(stderr, "Os %d\n", ssi.si_os);
 | |
|  	cdf_print_classid(buf, sizeof(buf), &ssi.si_class);
 | |
|  	(void)fprintf(stderr, "Class %s\n", buf);
 | |
| @@ -1297,6 +1367,27 @@ cdf_dump_summary_info(const cdf_header_t *h, const
 | |
|  	free(info);
 | |
|  }
 | |
|  
 | |
| +
 | |
| +void
 | |
| +cdf_dump_catalog(const cdf_header_t *h, const cdf_stream_t *sst)
 | |
| +{
 | |
| +	cdf_catalog_t *cat;
 | |
| +	cdf_unpack_catalog(h, sst, &cat);
 | |
| +	const cdf_catalog_entry_t *ce = cat->cat_e;
 | |
| +	struct timespec ts;
 | |
| +	char tbuf[64], sbuf[256];
 | |
| +	size_t i;
 | |
| +
 | |
| +	printf("Catalog:\n");
 | |
| +	for (i = 0; i < cat->cat_num; i++) {
 | |
| +		cdf_timestamp_to_timespec(&ts, ce[i].ce_timestamp);
 | |
| +		printf("\t%d %s %s", ce[i].ce_num,
 | |
| +		    cdf_u16tos8(sbuf, ce[i].ce_namlen, ce[i].ce_name),
 | |
| +		    cdf_ctime(&ts.tv_sec, tbuf));
 | |
| +	}
 | |
| +	free(cat);
 | |
| +}
 | |
| +
 | |
|  #endif
 | |
|  
 | |
|  #ifdef TEST
 | |
| @@ -1309,6 +1400,7 @@ main(int argc, char *argv[])
 | |
|  	cdf_stream_t sst, scn;
 | |
|  	cdf_dir_t dir;
 | |
|  	cdf_info_t info;
 | |
| +	const cdf_directory_t *root;
 | |
|  
 | |
|  	if (argc < 2) {
 | |
|  		(void)fprintf(stderr, "Usage: %s <filename>\n", getprogname());
 | |
| @@ -1342,7 +1434,8 @@ main(int argc, char *argv[])
 | |
|  		if (cdf_read_dir(&info, &h, &sat, &dir) == -1)
 | |
|  			err(1, "Cannot read dir");
 | |
|  
 | |
| -		if (cdf_read_short_stream(&info, &h, &sat, &dir, &sst) == -1)
 | |
| +		if (cdf_read_short_stream(&info, &h, &sat, &dir, &sst, &root)
 | |
| +		    == -1)
 | |
|  			err(1, "Cannot read short stream");
 | |
|  #ifdef CDF_DEBUG
 | |
|  		cdf_dump_stream(&h, &sst);
 | |
| @@ -1355,10 +1448,18 @@ main(int argc, char *argv[])
 | |
|  
 | |
|  		if (cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
 | |
|  		    &scn) == -1)
 | |
| -			err(1, "Cannot read summary info");
 | |
| +			warn("Cannot read summary info");
 | |
|  #ifdef CDF_DEBUG
 | |
| -		cdf_dump_summary_info(&h, &scn);
 | |
| +		else
 | |
| +			cdf_dump_summary_info(&h, &scn);
 | |
|  #endif
 | |
| +		if (cdf_read_catalog(&info, &h, &sat, &ssat, &sst, &dir,
 | |
| +		    &scn) == -1)
 | |
| +			warn("Cannot read catalog");
 | |
| +#ifdef CDF_DEBUG
 | |
| +		else
 | |
| +			cdf_dump_catalog(&h, &scn);
 | |
| +#endif
 | |
|  
 | |
|  		(void)close(info.i_fd);
 | |
|  	}
 | |
| Index: contrib/file/src/cdf.h
 | |
| ===================================================================
 | |
| --- contrib/file/src/cdf.h	(revision 284174)
 | |
| +++ contrib/file/src/cdf.h	(working copy)
 | |
| @@ -267,6 +267,19 @@ typedef struct {
 | |
|  	size_t i_len;
 | |
|  } cdf_info_t;
 | |
|  
 | |
| +
 | |
| +typedef struct {
 | |
| +	uint16_t ce_namlen;
 | |
| +	uint32_t ce_num;
 | |
| +	uint64_t ce_timestamp; 
 | |
| +	uint16_t ce_name[256];
 | |
| +} cdf_catalog_entry_t;
 | |
| +
 | |
| +typedef struct {
 | |
| +	size_t cat_num;
 | |
| +	cdf_catalog_entry_t cat_e[0];
 | |
| +} cdf_catalog_t;
 | |
| +
 | |
|  struct timespec;
 | |
|  int cdf_timestamp_to_timespec(struct timespec *, cdf_timestamp_t);
 | |
|  int cdf_timespec_to_timestamp(cdf_timestamp_t *, const struct timespec *);
 | |
| @@ -301,11 +314,19 @@ int cdf_read_property_info(const cdf_stream_t *, c
 | |
|  int cdf_read_user_stream(const cdf_info_t *, const cdf_header_t *,
 | |
|      const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
 | |
|      const cdf_dir_t *, const char *, cdf_stream_t *);
 | |
| +#define cdf_read_catalog(info, header, sat, ssat, stream, dir, scn) \
 | |
| +    cdf_read_user_stream(info, header, sat, ssat, stream, dir, "Catalog", \
 | |
| +    scn)
 | |
| +#define cdf_read_encrypted_package(info, header, sat, ssat, stream, dir, scn) \
 | |
| +    cdf_read_user_stream(info, header, sat, ssat, stream, dir, \
 | |
| +    "EncryptedPackage", scn)
 | |
|  int cdf_read_summary_info(const cdf_info_t *, const cdf_header_t *,
 | |
|      const cdf_sat_t *, const cdf_sat_t *, const cdf_stream_t *,
 | |
|      const cdf_dir_t *, cdf_stream_t *);
 | |
|  int cdf_unpack_summary_info(const cdf_stream_t *, const cdf_header_t *,
 | |
|      cdf_summary_info_header_t *, cdf_property_info_t **, size_t *);
 | |
| +int cdf_unpack_catalog(const cdf_header_t *, const cdf_stream_t *,
 | |
| +    cdf_catalog_t **);
 | |
|  int cdf_print_classid(char *, size_t, const cdf_classid_t *);
 | |
|  int cdf_print_property_name(char *, size_t, uint32_t);
 | |
|  int cdf_print_elapsed_time(char *, size_t, cdf_timestamp_t);
 | |
| @@ -313,6 +334,7 @@ uint16_t cdf_tole2(uint16_t);
 | |
|  uint32_t cdf_tole4(uint32_t);
 | |
|  uint64_t cdf_tole8(uint64_t);
 | |
|  char *cdf_ctime(const time_t *, char *);
 | |
| +char *cdf_u16tos8(char *, size_t, const uint16_t *);
 | |
|  
 | |
|  #ifdef CDF_DEBUG
 | |
|  void cdf_dump_header(const cdf_header_t *);
 | |
| @@ -323,6 +345,7 @@ void cdf_dump_dir(const cdf_info_t *, const cdf_he
 | |
|      const cdf_sat_t *, const cdf_stream_t *, const cdf_dir_t *);
 | |
|  void cdf_dump_property_info(const cdf_property_info_t *, size_t);
 | |
|  void cdf_dump_summary_info(const cdf_header_t *, const cdf_stream_t *);
 | |
| +void cdf_dump_catalog(const cdf_header_t *, const cdf_stream_t *);
 | |
|  #endif
 | |
|  
 | |
|  
 | |
| Index: contrib/file/src/compress.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/compress.c	(revision 284174)
 | |
| +++ contrib/file/src/compress.c	(working copy)
 | |
| @@ -35,7 +35,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef lint
 | |
| -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 $")
 | |
|  #endif
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -45,7 +45,8 @@
 | |
|  #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
 | |
| @@ -103,10 +104,12 @@ file_zmagic(struct magic_set *ms, int fd, const ch
 | |
|  	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;
 | |
| @@ -133,6 +136,7 @@ file_zmagic(struct magic_set *ms, int fd, const ch
 | |
|  		}
 | |
|  	}
 | |
|  error:
 | |
| +	(void)signal(SIGPIPE, osigpipe);
 | |
|  	free(newbuf);
 | |
|  	ms->flags |= MAGIC_COMPRESS;
 | |
|  	return rv;
 | |
| @@ -377,6 +381,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t
 | |
|      const unsigned char *old, unsigned char **newch, size_t n)
 | |
|  {
 | |
|  	int fdin[2], fdout[2];
 | |
| +	int status;
 | |
|  	ssize_t r;
 | |
|  	pid_t pid;
 | |
|  
 | |
| @@ -459,7 +464,17 @@ uncompressbuf(struct magic_set *ms, int fd, size_t
 | |
|  				/*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;
 | |
| @@ -470,7 +485,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t
 | |
|  			(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) {
 | |
| @@ -479,7 +494,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t
 | |
|  			    strerror(errno));
 | |
|  #endif
 | |
|  			free(*newch);
 | |
| -			n = 0;
 | |
| +			n = NODATA;
 | |
|  			*newch = NULL;
 | |
|  			goto err;
 | |
|  		} else {
 | |
| @@ -491,12 +506,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: contrib/file/src/elfclass.h
 | |
| ===================================================================
 | |
| --- contrib/file/src/elfclass.h	(revision 284174)
 | |
| +++ contrib/file/src/elfclass.h	(working copy)
 | |
| @@ -32,17 +32,18 @@
 | |
|  	swap = (u.c[sizeof(int32_t) - 1] + 1) != elfhdr.e_ident[EI_DATA];
 | |
|  
 | |
|  	type = elf_getu16(swap, elfhdr.e_type);
 | |
| +	notecount = ms->elf_notes_max;
 | |
|  	switch (type) {
 | |
|  #ifdef ELFCORE
 | |
|  	case ET_CORE:
 | |
|  		phnum = elf_getu16(swap, elfhdr.e_phnum);
 | |
| -		if (phnum > MAX_PHNUM)
 | |
| -			return toomany(ms, "program", phnum);
 | |
| +		if (phnum > ms->elf_phnum_max)
 | |
| +			return toomany(ms, "program headers", phnum);
 | |
|  		flags |= FLAGS_IS_CORE;
 | |
|  		if (dophn_core(ms, clazz, swap, fd,
 | |
|  		    (off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
 | |
|  		    (size_t)elf_getu16(swap, elfhdr.e_phentsize),
 | |
| -		    fsize, &flags) == -1)
 | |
| +		    fsize, &flags, ¬ecount) == -1)
 | |
|  			return -1;
 | |
|  		break;
 | |
|  #endif
 | |
| @@ -49,26 +50,27 @@
 | |
|  	case ET_EXEC:
 | |
|  	case ET_DYN:
 | |
|  		phnum = elf_getu16(swap, elfhdr.e_phnum);
 | |
| -		if (phnum > MAX_PHNUM)
 | |
| +		if (phnum > ms->elf_phnum_max)
 | |
|  			return toomany(ms, "program", phnum);
 | |
|  		shnum = elf_getu16(swap, elfhdr.e_shnum);
 | |
| -		if (shnum > MAX_SHNUM)
 | |
| +		if (shnum > ms->elf_shnum_max)
 | |
|  			return toomany(ms, "section", shnum);
 | |
|  		if (dophn_exec(ms, clazz, swap, fd,
 | |
|  		    (off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
 | |
|  		    (size_t)elf_getu16(swap, elfhdr.e_phentsize),
 | |
| -		    fsize, &flags, shnum) == -1)
 | |
| +		    fsize, shnum, &flags, ¬ecount) == -1)
 | |
|  			return -1;
 | |
|  		/*FALLTHROUGH*/
 | |
|  	case ET_REL:
 | |
|  		shnum = elf_getu16(swap, elfhdr.e_shnum);
 | |
| -		if (shnum > MAX_SHNUM)
 | |
| -			return toomany(ms, "section", shnum);
 | |
| +		if (shnum > ms->elf_shnum_max)
 | |
| +			return toomany(ms, "section headers", shnum);
 | |
|  		if (doshn(ms, clazz, swap, fd,
 | |
|  		    (off_t)elf_getu(swap, elfhdr.e_shoff), shnum,
 | |
|  		    (size_t)elf_getu16(swap, elfhdr.e_shentsize),
 | |
| -		    fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
 | |
| -		    (int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
 | |
| +		    fsize, elf_getu16(swap, elfhdr.e_machine),
 | |
| +		    (int)elf_getu16(swap, elfhdr.e_shstrndx),
 | |
| +		    &flags, ¬ecount) == -1)
 | |
|  			return -1;
 | |
|  		break;
 | |
|  
 | |
| @@ -75,4 +77,6 @@
 | |
|  	default:
 | |
|  		break;
 | |
|  	}
 | |
| +	if (notecount == 0)
 | |
| +		return toomany(ms, "notes", ms->elf_notes_max);
 | |
|  	return 1;
 | |
| Index: contrib/file/src/encoding.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/encoding.c	(revision 284174)
 | |
| +++ contrib/file/src/encoding.c	(working copy)
 | |
| @@ -35,7 +35,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: encoding.c,v 1.9 2013/11/19 20:45:50 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: encoding.c,v 1.10 2014/09/11 12:08:52 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -97,7 +97,6 @@ file_encoding(struct magic_set *ms, const unsigned
 | |
|  		*code_mime = "utf-8";
 | |
|  	} else if (file_looks_utf8(buf, nbytes, *ubuf, ulen) > 1) {
 | |
|  		DPRINTF(("utf8 %" SIZE_T_FORMAT "u\n", *ulen));
 | |
| -		*code = "UTF-8 Unicode (with BOM)";
 | |
|  		*code = "UTF-8 Unicode";
 | |
|  		*code_mime = "utf-8";
 | |
|  	} else if ((ucs_type = looks_ucs16(buf, nbytes, *ubuf, ulen)) != 0) {
 | |
| Index: contrib/file/src/file.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/file.c	(revision 284174)
 | |
| +++ contrib/file/src/file.c	(working copy)
 | |
| @@ -32,7 +32,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: file.c,v 1.153 2014/02/11 15:41:04 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: file.c,v 1.160 2014/12/16 23:18:40 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -54,9 +54,6 @@
 | |
|  #ifdef HAVE_UNISTD_H
 | |
|  #include <unistd.h>	/* for read() */
 | |
|  #endif
 | |
| -#ifdef HAVE_LOCALE_H
 | |
| -#include <locale.h>
 | |
| -#endif
 | |
|  #ifdef HAVE_WCHAR_H
 | |
|  #include <wchar.h>
 | |
|  #endif
 | |
| @@ -101,7 +98,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;
 | |
| @@ -119,6 +116,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 		*/
 | |
|  
 | |
|  private void usage(void);
 | |
| @@ -128,6 +137,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);
 | |
|  
 | |
|  
 | |
|  /*
 | |
| @@ -145,7 +156,9 @@ main(int argc, char *argv[])
 | |
|  	const char *magicfile = NULL;		/* where the magic is	*/
 | |
|  
 | |
|  	/* makes islower etc work for other langs */
 | |
| +#ifdef HAVE_SETLOCALE
 | |
|  	(void)setlocale(LC_CTYPE, "");
 | |
| +#endif
 | |
|  
 | |
|  #ifdef __EMX__
 | |
|  	/* sh-like wildcard expansion! Shouldn't hurt at least ... */
 | |
| @@ -243,9 +256,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;
 | |
| @@ -298,6 +315,8 @@ main(int argc, char *argv[])
 | |
|  			    strerror(errno));
 | |
|  			return 1;
 | |
|  		}
 | |
| +
 | |
| +
 | |
|  		switch(action) {
 | |
|  		case FILE_CHECK:
 | |
|  			c = magic_check(magic, magicfile);
 | |
| @@ -321,7 +340,7 @@ main(int argc, char *argv[])
 | |
|  		if (magic == NULL)
 | |
|  			if ((magic = load(magicfile, flags)) == NULL)
 | |
|  				return 1;
 | |
| -		break;
 | |
| +		applyparam(magic);
 | |
|  	}
 | |
|  
 | |
|  	if (optind == argc) {
 | |
| @@ -351,7 +370,42 @@ 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*/
 | |
|  load(const char *magicfile, int flags)
 | |
| Index: contrib/file/src/file.h
 | |
| ===================================================================
 | |
| --- contrib/file/src/file.h	(revision 284174)
 | |
| +++ contrib/file/src/file.h	(working copy)
 | |
| @@ -27,7 +27,7 @@
 | |
|   */
 | |
|  /*
 | |
|   * file.h - definitions for file(1) program
 | |
| - * @(#)$File: file.h,v 1.152 2014/06/03 19:01:34 christos Exp $
 | |
| + * @(#)$File: file.h,v 1.164 2015/01/01 17:07:34 christos Exp $
 | |
|   */
 | |
|  
 | |
|  #ifndef __file_h__
 | |
| @@ -64,7 +64,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>
 | |
| @@ -232,6 +234,7 @@ struct magic {
 | |
|  	 (t) == FILE_LESTRING16 || \
 | |
|  	 (t) == FILE_REGEX || \
 | |
|  	 (t) == FILE_SEARCH || \
 | |
| +	 (t) == FILE_INDIRECT || \
 | |
|  	 (t) == FILE_NAME || \
 | |
|  	 (t) == FILE_USE)
 | |
|  
 | |
| @@ -344,6 +347,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 {
 | |
| @@ -401,6 +406,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 */
 | |
| @@ -440,8 +455,10 @@ protected int file_encoding(struct magic_set *, co
 | |
|      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);
 | |
|  protected int file_magicfind(struct magic_set *, const char *, struct mlist *);
 | |
|  protected uint64_t file_signextend(struct magic_set *, struct magic *,
 | |
|      uint64_t);
 | |
| @@ -464,14 +481,26 @@ protected int file_looks_utf8(const unsigned char
 | |
|      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);
 | |
|  #endif /* __EMX__ */
 | |
|  
 | |
| +#if defined(HAVE_LOCALE_H)
 | |
| +#include <locale.h>
 | |
| +#endif
 | |
| +#if defined(HAVE_XLOCALE_H)
 | |
| +#include <xlocale.h>
 | |
| +#endif
 | |
| +
 | |
|  typedef struct {
 | |
|  	const char *pat;
 | |
| -	char *old_lc_ctype;
 | |
| +#if defined(HAVE_NEWLOCALE) && defined(HAVE_USELOCALE) && defined(HAVE_FREELOCALE)
 | |
| +#define USE_C_LOCALE
 | |
| +	locale_t old_lc_ctype;
 | |
| +	locale_t c_lc_ctype;
 | |
| +#endif
 | |
|  	int rc;
 | |
|  	regex_t rx;
 | |
|  } file_regex_t;
 | |
| Index: contrib/file/src/file_opts.h
 | |
| ===================================================================
 | |
| --- contrib/file/src/file_opts.h	(revision 284174)
 | |
| +++ contrib/file/src/file_opts.h	(working copy)
 | |
| @@ -43,6 +43,12 @@ OPT('0', "print0", 0, "               terminate fi
 | |
|  #if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
 | |
|  OPT('p', "preserve-date", 0, "        preserve access times on files\n")
 | |
|  #endif
 | |
| +OPT('P', "parameter", 0, "            set file engine parameter limits\n"
 | |
| +    "                               indir        15 recursion limit for indirection\n"
 | |
| +    "                               name         30 use limit for name/use magic\n"
 | |
| +    "                               elf_notes   256 max ELF notes processed\n"
 | |
| +    "                               elf_phnum   128 max ELF prog sections processed\n"
 | |
| +    "                               elf_shnum 32768 max ELF sections processed\n")
 | |
|  OPT('r', "raw", 0, "                  don't translate unprintable chars to \\ooo\n")
 | |
|  OPT('s', "special-files", 0, "        treat special (block/char devices) files as\n"
 | |
|      "                             ordinary ones\n")
 | |
| Index: contrib/file/src/fsmagic.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/fsmagic.c	(revision 284174)
 | |
| +++ contrib/file/src/fsmagic.c	(working copy)
 | |
| @@ -32,7 +32,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: fsmagic.c,v 1.73 2014/05/14 23:15:42 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: fsmagic.c,v 1.75 2014/12/04 15:56:46 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -75,10 +75,10 @@ bad_link(struct magic_set *ms, int err, char *buf)
 | |
|  	else if (!mime) {
 | |
|  		if (ms->flags & MAGIC_ERROR) {
 | |
|  			file_error(ms, err,
 | |
| -				   "broken symbolic link to `%s'", buf);
 | |
| +				   "broken symbolic link to %s", buf);
 | |
|  			return -1;
 | |
|  		} 
 | |
| -		if (file_printf(ms, "broken symbolic link to `%s'", buf) == -1)
 | |
| +		if (file_printf(ms, "broken symbolic link to %s", buf) == -1)
 | |
|  			return -1;
 | |
|  	}
 | |
|  	return 1;
 | |
| @@ -129,7 +129,7 @@ file_fsmagic(struct magic_set *ms, const char *fn,
 | |
|  
 | |
|  #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) {
 | |
| @@ -352,7 +352,7 @@ file_fsmagic(struct magic_set *ms, const char *fn,
 | |
|  			if (mime) {
 | |
|  				if (handle_mime(ms, mime, "symlink") == -1)
 | |
|  					return -1;
 | |
| -			} else if (file_printf(ms, "%ssymbolic link to `%s'",
 | |
| +			} else if (file_printf(ms, "%ssymbolic link to %s",
 | |
|  			    COMMA, buf) == -1)
 | |
|  				return -1;
 | |
|  		}
 | |
| Index: contrib/file/src/funcs.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/funcs.c	(revision 284174)
 | |
| +++ contrib/file/src/funcs.c	(working copy)
 | |
| @@ -27,7 +27,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: funcs.c,v 1.72 2014/05/14 23:15:42 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: funcs.c,v 1.79 2014/12/16 20:52:49 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -45,9 +45,6 @@
 | |
|  #if defined(HAVE_LIMITS_H)
 | |
|  #include <limits.h>
 | |
|  #endif
 | |
| -#if defined(HAVE_LOCALE_H)
 | |
| -#include <locale.h>
 | |
| -#endif
 | |
|  
 | |
|  #ifndef SIZE_MAX
 | |
|  #define SIZE_MAX	((size_t)~0)
 | |
| @@ -230,7 +227,7 @@ file_buffer(struct magic_set *ms, int fd, const ch
 | |
|  
 | |
|  	/* 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);
 | |
| @@ -455,13 +452,14 @@ out:
 | |
|  protected int
 | |
|  file_regcomp(file_regex_t *rx, const char *pat, int flags)
 | |
|  {
 | |
| -	rx->old_lc_ctype = setlocale(LC_CTYPE, NULL);
 | |
| +#ifdef USE_C_LOCALE
 | |
| +	rx->c_lc_ctype = newlocale(LC_CTYPE_MASK, "C", 0);
 | |
| +	assert(rx->c_lc_ctype != NULL);
 | |
| +	rx->old_lc_ctype = uselocale(rx->c_lc_ctype);
 | |
|  	assert(rx->old_lc_ctype != NULL);
 | |
| -	rx->old_lc_ctype = strdup(rx->old_lc_ctype);
 | |
| -	assert(rx->old_lc_ctype != NULL);
 | |
| +#endif
 | |
|  	rx->pat = pat;
 | |
|  
 | |
| -	(void)setlocale(LC_CTYPE, "C");
 | |
|  	return rx->rc = regcomp(&rx->rx, pat, flags);
 | |
|  }
 | |
|  
 | |
| @@ -478,8 +476,10 @@ file_regfree(file_regex_t *rx)
 | |
|  {
 | |
|  	if (rx->rc == 0)
 | |
|  		regfree(&rx->rx);
 | |
| -	(void)setlocale(LC_CTYPE, rx->old_lc_ctype);
 | |
| -	free(rx->old_lc_ctype);
 | |
| +#ifdef USE_C_LOCALE
 | |
| +	(void)uselocale(rx->old_lc_ctype);
 | |
| +	freelocale(rx->c_lc_ctype);
 | |
| +#endif
 | |
|  }
 | |
|  
 | |
|  protected void
 | |
| @@ -531,3 +531,28 @@ file_pop_buffer(struct magic_set *ms, file_pushbuf
 | |
|  	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++ = ((*s >> 6) & 7) + '0';
 | |
| +		*ptr++ = ((*s >> 3) & 7) + '0';
 | |
| +		*ptr++ = ((*s >> 0) & 7) + '0';
 | |
| +	}
 | |
| +	*ptr = '\0';
 | |
| +	return buf;
 | |
| +}
 | |
| Index: contrib/file/src/getline.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/getline.c	(revision 284174)
 | |
| +++ contrib/file/src/getline.c	(working copy)
 | |
| @@ -1,4 +1,4 @@
 | |
| -/*	$NetBSD: fgetln.c,v 1.9 2008/04/29 06:53:03 martin Exp $	*/
 | |
| +/*	$NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp $	*/
 | |
|  
 | |
|  /*-
 | |
|   * Copyright (c) 2011 The NetBSD Foundation, Inc.
 | |
| @@ -52,10 +52,14 @@ getdelim(char **buf, size_t *bufsiz, int delimiter
 | |
|  	for (ptr = *buf, eptr = *buf + *bufsiz;;) {
 | |
|  		int c = fgetc(fp);
 | |
|  		if (c == -1) {
 | |
| -			if (feof(fp))
 | |
| -				return ptr == *buf ? -1 : ptr - *buf;
 | |
| -			else
 | |
| -				return -1;
 | |
| +			if (feof(fp)) {
 | |
| +				ssize_t diff = (ssize_t)(ptr - *buf);
 | |
| +				if (diff != 0) {
 | |
| +					*ptr = '\0';
 | |
| +					return diff;
 | |
| +				}
 | |
| +			}
 | |
| +			return -1;
 | |
|  		}
 | |
|  		*ptr++ = c;
 | |
|  		if (c == delimiter) {
 | |
| @@ -76,7 +80,7 @@ getdelim(char **buf, size_t *bufsiz, int delimiter
 | |
|  	}
 | |
|  }
 | |
|  
 | |
| -ssize_t
 | |
| +public ssize_t
 | |
|  getline(char **buf, size_t *bufsiz, FILE *fp)
 | |
|  {
 | |
|  	return getdelim(buf, bufsiz, '\n', fp);
 | |
| @@ -93,7 +97,7 @@ main(int argc, char *argv[])
 | |
|  	size_t n = 0;
 | |
|  
 | |
|  	while ((len = getline(&p, &n, stdin)) != -1)
 | |
| -		(void)printf("%zd %s", len, p);
 | |
| +		(void)printf("%" SIZE_T_FORMAT "d %s", len, p);
 | |
|  	free(p);
 | |
|  	return 0;
 | |
|  }
 | |
| Index: contrib/file/src/magic.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/magic.c	(revision 284174)
 | |
| +++ contrib/file/src/magic.c	(working copy)
 | |
| @@ -33,7 +33,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: magic.c,v 1.84 2014/05/14 23:15:42 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: magic.c,v 1.91 2014/12/16 23:18:40 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -128,6 +128,7 @@ out:
 | |
|  #else
 | |
|  	char *hmagicp;
 | |
|  	char *tmppath = NULL;
 | |
| +	LPTSTR dllpath;
 | |
|  	hmagicpath = NULL;
 | |
|  
 | |
|  #define APPENDPATH() \
 | |
| @@ -173,7 +174,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);
 | |
| @@ -257,7 +258,21 @@ magic_load(struct magic_set *ms, const char *magic
 | |
|  	return file_apprentice(ms, magicfile, FILE_LOAD);
 | |
|  }
 | |
|  
 | |
| +#ifndef COMPILE_ONLY
 | |
| +/*
 | |
| + * Install a set of compiled magic buffers.
 | |
| + */
 | |
|  public int
 | |
| +magic_load_buffers(struct magic_set *ms, void **bufs, size_t *sizes,
 | |
| +    size_t nbufs)
 | |
| +{
 | |
| +	if (ms == NULL)
 | |
| +		return -1;
 | |
| +	return buffer_apprentice(ms, (struct magic **)bufs, sizes, nbufs);
 | |
| +}
 | |
| +#endif
 | |
| +
 | |
| +public int
 | |
|  magic_compile(struct magic_set *ms, const char *magicfile)
 | |
|  {
 | |
|  	if (ms == NULL)
 | |
| @@ -522,3 +537,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 = *(const size_t *)val;
 | |
| +		return 0;
 | |
| +	case MAGIC_PARAM_NAME_MAX:
 | |
| +		ms->name_max = *(const size_t *)val;
 | |
| +		return 0;
 | |
| +	case MAGIC_PARAM_ELF_PHNUM_MAX:
 | |
| +		ms->elf_phnum_max = *(const size_t *)val;
 | |
| +		return 0;
 | |
| +	case MAGIC_PARAM_ELF_SHNUM_MAX:
 | |
| +		ms->elf_shnum_max = *(const size_t *)val;
 | |
| +		return 0;
 | |
| +	case MAGIC_PARAM_ELF_NOTES_MAX:
 | |
| +		ms->elf_notes_max = *(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: contrib/file/src/magic.h
 | |
| ===================================================================
 | |
| --- contrib/file/src/magic.h	(revision 284174)
 | |
| +++ contrib/file/src/magic.h	(working copy)
 | |
| @@ -75,7 +75,7 @@
 | |
|  #define	MAGIC_NO_CHECK_FORTRAN	0x000000 /* Don't check ascii/fortran */
 | |
|  #define	MAGIC_NO_CHECK_TROFF	0x000000 /* Don't check ascii/troff */
 | |
|  
 | |
| -#define MAGIC_VERSION		518	/* This implementation */
 | |
| +#define MAGIC_VERSION		521	/* This implementation */
 | |
|  
 | |
|  
 | |
|  #ifdef __cplusplus
 | |
| @@ -96,11 +96,22 @@ int magic_setflags(magic_t, int);
 | |
|  
 | |
|  int magic_version(void);
 | |
|  int magic_load(magic_t, const char *);
 | |
| +int magic_load_buffers(magic_t, void **, size_t *, size_t);
 | |
| +
 | |
|  int magic_compile(magic_t, const char *);
 | |
|  int magic_check(magic_t, const char *);
 | |
|  int magic_list(magic_t, const char *);
 | |
|  int magic_errno(magic_t);
 | |
|  
 | |
| +#define MAGIC_PARAM_INDIR_MAX		0
 | |
| +#define MAGIC_PARAM_NAME_MAX		1
 | |
| +#define MAGIC_PARAM_ELF_PHNUM_MAX	2
 | |
| +#define MAGIC_PARAM_ELF_SHNUM_MAX	3
 | |
| +#define MAGIC_PARAM_ELF_NOTES_MAX	4
 | |
| +
 | |
| +int magic_setparam(magic_t, int, const void *);
 | |
| +int magic_getparam(magic_t, int, void *);
 | |
| +
 | |
|  #ifdef __cplusplus
 | |
|  };
 | |
|  #endif
 | |
| Index: contrib/file/src/magic.h.in
 | |
| ===================================================================
 | |
| --- contrib/file/src/magic.h.in	(revision 284174)
 | |
| +++ contrib/file/src/magic.h.in	(working copy)
 | |
| @@ -96,11 +96,22 @@ int magic_setflags(magic_t, int);
 | |
|  
 | |
|  int magic_version(void);
 | |
|  int magic_load(magic_t, const char *);
 | |
| +int magic_load_buffers(magic_t, void **, size_t *, size_t);
 | |
| +
 | |
|  int magic_compile(magic_t, const char *);
 | |
|  int magic_check(magic_t, const char *);
 | |
|  int magic_list(magic_t, const char *);
 | |
|  int magic_errno(magic_t);
 | |
|  
 | |
| +#define MAGIC_PARAM_INDIR_MAX		0
 | |
| +#define MAGIC_PARAM_NAME_MAX		1
 | |
| +#define MAGIC_PARAM_ELF_PHNUM_MAX	2
 | |
| +#define MAGIC_PARAM_ELF_SHNUM_MAX	3
 | |
| +#define MAGIC_PARAM_ELF_NOTES_MAX	4
 | |
| +
 | |
| +int magic_setparam(magic_t, int, const void *);
 | |
| +int magic_getparam(magic_t, int, void *);
 | |
| +
 | |
|  #ifdef __cplusplus
 | |
|  };
 | |
|  #endif
 | |
| Index: contrib/file/src/pread.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/pread.c	(revision 284174)
 | |
| +++ contrib/file/src/pread.c	(working copy)
 | |
| @@ -1,6 +1,6 @@
 | |
|  #include "file.h"
 | |
|  #ifndef lint
 | |
| -FILE_RCSID("@(#)$File: pread.c,v 1.2 2013/04/02 16:23:07 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: pread.c,v 1.3 2014/09/15 19:11:25 christos Exp $")
 | |
|  #endif  /* lint */
 | |
|  #include <fcntl.h>
 | |
|  #include <unistd.h>
 | |
| @@ -7,8 +7,17 @@
 | |
|  
 | |
|  ssize_t
 | |
|  pread(int fd, void *buf, size_t len, off_t off) {
 | |
| -	if (lseek(fd, off, SEEK_SET) == (off_t)-1)
 | |
| +	off_t old;
 | |
| +	ssize_t rv;
 | |
| +
 | |
| +	if ((old = lseek(fd, off, SEEK_SET)) == -1)
 | |
|  		return -1;
 | |
|  
 | |
| -	return read(fd, buf, len);
 | |
| +	if ((rv = read(fd, buf, len)) == -1)
 | |
| +		return -1;
 | |
| +
 | |
| +	if (lseek(fd, old, SEEK_SET) == -1)
 | |
| +		return -1;
 | |
| +
 | |
| +	return rv;
 | |
|  }
 | |
| Index: contrib/file/src/readcdf.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/readcdf.c	(revision 284174)
 | |
| +++ contrib/file/src/readcdf.c	(working copy)
 | |
| @@ -26,7 +26,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef lint
 | |
| -FILE_RCSID("@(#)$File: readcdf.c,v 1.44 2014/05/14 23:22:48 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: readcdf.c,v 1.49 2014/12/04 15:56:46 christos Exp $")
 | |
|  #endif
 | |
|  
 | |
|  #include <assert.h>
 | |
| @@ -35,9 +35,6 @@
 | |
|  #include <string.h>
 | |
|  #include <time.h>
 | |
|  #include <ctype.h>
 | |
| -#if defined(HAVE_LOCALE_H)
 | |
| -#include <locale.h>
 | |
| -#endif
 | |
|  
 | |
|  #include "cdf.h"
 | |
|  #include "magic.h"
 | |
| @@ -75,7 +72,7 @@ static const struct cv {
 | |
|  	const char *mime;
 | |
|  } clsid2mime[] = {
 | |
|  	{
 | |
| -		{ 0x00000000000c1084LLU, 0x46000000000000c0LLU  },
 | |
| +		{ 0x00000000000c1084ULL, 0x46000000000000c0ULL  },
 | |
|  		"x-msi",
 | |
|  	},
 | |
|  	{	{ 0,			 0			},
 | |
| @@ -83,7 +80,7 @@ static const struct cv {
 | |
|  	},
 | |
|  }, clsid2desc[] = {
 | |
|  	{
 | |
| -		{ 0x00000000000c1084LLU, 0x46000000000000c0LLU  },
 | |
| +		{ 0x00000000000c1084ULL, 0x46000000000000c0ULL  },
 | |
|  		"MSI Installer",
 | |
|  	},
 | |
|  	{	{ 0,			 0			},
 | |
| @@ -107,20 +104,23 @@ cdf_app_to_mime(const char *vbuf, const struct nv
 | |
|  {
 | |
|  	size_t i;
 | |
|  	const char *rv = NULL;
 | |
| -	char *old_lc_ctype;
 | |
| +#ifdef USE_C_LOCALE
 | |
| +	locale_t old_lc_ctype, c_lc_ctype;
 | |
|  
 | |
| -	old_lc_ctype = setlocale(LC_CTYPE, NULL);
 | |
| +	c_lc_ctype = newlocale(LC_CTYPE_MASK, "C", 0);
 | |
| +	assert(c_lc_ctype != NULL);
 | |
| +	old_lc_ctype = uselocale(c_lc_ctype);
 | |
|  	assert(old_lc_ctype != NULL);
 | |
| -	old_lc_ctype = strdup(old_lc_ctype);
 | |
| -	assert(old_lc_ctype != NULL);
 | |
| -	(void)setlocale(LC_CTYPE, "C");
 | |
| +#endif
 | |
|  	for (i = 0; nv[i].pattern != NULL; i++)
 | |
|  		if (strcasestr(vbuf, nv[i].pattern) != NULL) {
 | |
|  			rv = nv[i].mime;
 | |
|  			break;
 | |
|  		}
 | |
| -	(void)setlocale(LC_CTYPE, old_lc_ctype);
 | |
| -	free(old_lc_ctype);
 | |
| +#ifdef USE_C_LOCALE
 | |
| +	(void)uselocale(old_lc_ctype);
 | |
| +	freelocale(c_lc_ctype);
 | |
| +#endif
 | |
|  	return rv;
 | |
|  }
 | |
|  
 | |
| @@ -241,6 +241,37 @@ cdf_file_property_info(struct magic_set *ms, const
 | |
|  }
 | |
|  
 | |
|  private int
 | |
| +cdf_file_catalog(struct magic_set *ms, const cdf_header_t *h,
 | |
| +    const cdf_stream_t *sst)
 | |
| +{
 | |
| +	cdf_catalog_t *cat;
 | |
| +	size_t i;
 | |
| +	char buf[256];
 | |
| +	cdf_catalog_entry_t *ce;
 | |
| +
 | |
| +        if (NOTMIME(ms)) {
 | |
| +		if (file_printf(ms, "Microsoft Thumbs.db [") == -1)
 | |
| +			return -1;
 | |
| +		if (cdf_unpack_catalog(h, sst, &cat) == -1)
 | |
| +			return -1;
 | |
| +		ce = cat->cat_e;
 | |
| +		/* skip first entry since it has a , or paren */
 | |
| +		for (i = 1; i < cat->cat_num; i++)
 | |
| +			if (file_printf(ms, "%s%s",
 | |
| +			    cdf_u16tos8(buf, ce[i].ce_namlen, ce[i].ce_name),
 | |
| +			    i == cat->cat_num - 1 ? "]" : ", ") == -1) {
 | |
| +				free(cat);
 | |
| +				return -1;
 | |
| +			}
 | |
| +		free(cat);
 | |
| +	} else {
 | |
| +		if (file_printf(ms, "application/CDFV2") == -1)
 | |
| +			return -1;
 | |
| +	}
 | |
| +	return 1;
 | |
| +}
 | |
| +
 | |
| +private int
 | |
|  cdf_file_summary_info(struct magic_set *ms, const cdf_header_t *h,
 | |
|      const cdf_stream_t *sst, const cdf_directory_t *root_storage)
 | |
|  {
 | |
| @@ -285,11 +316,12 @@ cdf_file_summary_info(struct magic_set *ms, const
 | |
|  		if (root_storage) {
 | |
|  			str = cdf_clsid_to_mime(root_storage->d_storage_uuid,
 | |
|  			    clsid2desc);
 | |
| -			if (str)
 | |
| +			if (str) {
 | |
|  				if (file_printf(ms, ", %s", str) == -1)
 | |
|  					return -2;
 | |
|  			}
 | |
|  		}
 | |
| +	}
 | |
|  
 | |
|          m = cdf_file_property_info(ms, info, count, root_storage);
 | |
|          free(info);
 | |
| @@ -302,11 +334,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
 | |
| @@ -323,6 +355,7 @@ file_trycdf(struct magic_set *ms, int fd, const un
 | |
|          int i;
 | |
|          const char *expn = "";
 | |
|          const char *corrupt = "corrupt: ";
 | |
| +        const cdf_directory_t *root_storage;
 | |
|  
 | |
|          info.i_fd = fd;
 | |
|          info.i_buf = buf;
 | |
| @@ -356,7 +389,6 @@ file_trycdf(struct magic_set *ms, int fd, const un
 | |
|                  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";
 | |
| @@ -404,8 +436,24 @@ file_trycdf(struct magic_set *ms, int fd, const un
 | |
|          if ((i = cdf_read_summary_info(&info, &h, &sat, &ssat, &sst, &dir,
 | |
|              &scn)) == -1) {
 | |
|                  if (errno == ESRCH) {
 | |
| -                        corrupt = expn;
 | |
| -                        expn = "No summary info";
 | |
| +			if ((i = cdf_read_catalog(&info, &h, &sat, &ssat, &sst,
 | |
| +			    &dir, &scn)) == -1) {
 | |
| +				corrupt = expn;
 | |
| +				if ((i = cdf_read_encrypted_package(&info, &h,
 | |
| +				    &sat, &ssat, &sst, &dir, &scn)) == -1)
 | |
| +					expn = "No summary info";
 | |
| +				else {
 | |
| +					expn = "Encrypted";
 | |
| +					i = -1;
 | |
| +				}
 | |
| +				goto out4;
 | |
| +			}
 | |
| +#ifdef CDF_DEBUG
 | |
| +			cdf_dump_catalog(&h, &scn);
 | |
| +#endif
 | |
| +			if ((i = cdf_file_catalog(ms, &h, &scn))
 | |
| +			    < 0)
 | |
| +				expn = "Can't expand catalog";
 | |
|                  } else {
 | |
|                          expn = "Cannot read summary info";
 | |
|                  }
 | |
| @@ -464,7 +512,8 @@ out0:
 | |
|  		    if (file_printf(ms, ", %s%s", corrupt, expn) == -1)
 | |
|  			return -1;
 | |
|  	    } else {
 | |
| -		if (file_printf(ms, "application/CDFV2-corrupt") == -1)
 | |
| +		if (file_printf(ms, "application/CDFV2-%s",
 | |
| +		    *corrupt ? "corrupt" : "encrypted") == -1)
 | |
|  		    return -1;
 | |
|  	    }
 | |
|  	    i = 1;
 | |
| Index: contrib/file/src/readelf.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/readelf.c	(revision 284174)
 | |
| +++ contrib/file/src/readelf.c	(working copy)
 | |
| @@ -27,7 +27,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef lint
 | |
| -FILE_RCSID("@(#)$File: readelf.c,v 1.103 2014/05/02 02:25:10 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: readelf.c,v 1.117 2014/12/16 23:29:42 christos Exp $")
 | |
|  #endif
 | |
|  
 | |
|  #ifdef BUILTIN_ELF
 | |
| @@ -43,14 +43,14 @@
 | |
|  
 | |
|  #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)
 | |
|  
 | |
| @@ -60,13 +60,14 @@ private uint16_t getu16(int, uint16_t);
 | |
|  private uint32_t getu32(int, uint32_t);
 | |
|  private uint64_t getu64(int, uint64_t);
 | |
|  
 | |
| -#define MAX_PHNUM	256
 | |
| -#define	MAX_SHNUM	1024
 | |
| +#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 header sections (%u)", name, num
 | |
| +	if (file_printf(ms, ", too many %s (%u)", name, num
 | |
|  	    ) == -1)
 | |
|  		return -1;
 | |
|  	return 0;
 | |
| @@ -292,15 +293,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;
 | |
| @@ -318,13 +323,13 @@ dophn_core(struct magic_set *ms, int clazz, int sw
 | |
|  	 * 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;
 | |
|  		}
 | |
| @@ -346,7 +351,7 @@ dophn_core(struct magic_set *ms, int clazz, int sw
 | |
|  			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;
 | |
|  
 | |
| @@ -476,132 +481,127 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  	}
 | |
|  }
 | |
|  
 | |
| -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
 | |
| +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;
 | |
| -	Elf64_Nhdr nh64;
 | |
| -	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;
 | |
| +	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;
 | |
| +}
 | |
|  
 | |
| -	(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_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",
 | |
| @@ -614,11 +614,12 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  		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)
 | |
| @@ -625,69 +626,20 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  				continue;
 | |
|  			if (file_printf(ms, "%s%s", did++ ? "," : "",
 | |
|  			    pax[i]) == -1)
 | |
| -				return size;
 | |
| +				return 1;
 | |
|  		}
 | |
| +		return 1;
 | |
|  	}
 | |
| +	return 0;
 | |
| +}
 | |
|  
 | |
| -	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 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;
 | |
| -	}
 | |
| -
 | |
| -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
 | |
| @@ -716,20 +668,17 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  		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
 | |
| @@ -737,8 +686,9 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  			 * 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
 | |
| @@ -748,14 +698,14 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  			    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;
 | |
|  			/*
 | |
| @@ -823,7 +773,7 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  				 * 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))
 | |
| @@ -848,9 +798,9 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  					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:
 | |
|  				;
 | |
| @@ -859,6 +809,129 @@ do_note_freebsd_version(struct magic_set *ms, int
 | |
|  		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;
 | |
|  }
 | |
|  
 | |
| @@ -914,7 +987,8 @@ 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;
 | |
| @@ -925,6 +999,7 @@ doshn(struct magic_set *ms, int clazz, int swap, i
 | |
|  	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)
 | |
| @@ -933,7 +1008,7 @@ doshn(struct magic_set *ms, int clazz, int swap, 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, off + size * strtab) < (ssize_t)xsh_sizeof) {
 | |
|  		file_badread(ms);
 | |
|  		return -1;
 | |
|  	}
 | |
| @@ -941,15 +1016,15 @@ doshn(struct magic_set *ms, int clazz, int swap, 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;
 | |
|  		}
 | |
| @@ -964,7 +1039,7 @@ doshn(struct magic_set *ms, int clazz, int swap, i
 | |
|  			stripped = 0;
 | |
|  			break;
 | |
|  		default:
 | |
| -			if (xsh_offset > fsize) {
 | |
| +			if (fsize != SIZE_UNKNOWN && xsh_offset > fsize) {
 | |
|  				/* Perhaps warn here */
 | |
|  				continue;
 | |
|  			}
 | |
| @@ -979,7 +1054,7 @@ doshn(struct magic_set *ms, int clazz, int swap, 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;
 | |
| @@ -990,7 +1065,7 @@ doshn(struct magic_set *ms, int clazz, int swap, 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;
 | |
|  			}
 | |
| @@ -1157,13 +1232,15 @@ doshn(struct magic_set *ms, int clazz, int swap, 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;
 | |
|  	
 | |
| @@ -1174,12 +1251,14 @@ dophn_exec(struct magic_set *ms, int clazz, int sw
 | |
|  	}
 | |
|  
 | |
|    	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) {
 | |
| @@ -1186,11 +1265,29 @@ dophn_exec(struct magic_set *ms, int clazz, int sw
 | |
|  		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;
 | |
|  			}
 | |
| @@ -1199,27 +1296,18 @@ dophn_exec(struct magic_set *ms, int clazz, int sw
 | |
|  
 | |
|  		/* 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)
 | |
| @@ -1226,7 +1314,7 @@ dophn_exec(struct magic_set *ms, int clazz, int sw
 | |
|  					break;
 | |
|  				offset = donote(ms, nbuf, offset,
 | |
|  				    (size_t)bufsize, clazz, swap, align,
 | |
| -				    flags);
 | |
| +				    flags, notecount);
 | |
|  				if (offset == 0)
 | |
|  					break;
 | |
|  			}
 | |
| @@ -1235,9 +1323,13 @@ dophn_exec(struct magic_set *ms, int clazz, int sw
 | |
|  			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;
 | |
|  }
 | |
|  
 | |
| @@ -1257,7 +1349,7 @@ file_tryelf(struct magic_set *ms, int fd, const un
 | |
|  	int flags = 0;
 | |
|  	Elf32_Ehdr elf32hdr;
 | |
|  	Elf64_Ehdr elf64hdr;
 | |
| -	uint16_t type, phnum, shnum;
 | |
| +	uint16_t type, phnum, shnum, notecount;
 | |
|  
 | |
|  	if (ms->flags & (MAGIC_MIME|MAGIC_APPLE))
 | |
|  		return 0;
 | |
| @@ -1283,7 +1375,10 @@ file_tryelf(struct magic_set *ms, int fd, const un
 | |
|    		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: contrib/file/src/softmagic.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/softmagic.c	(revision 284174)
 | |
| +++ contrib/file/src/softmagic.c	(working copy)
 | |
| @@ -32,7 +32,7 @@
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: softmagic.c,v 1.191 2014/06/04 17:36:34 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: softmagic.c,v 1.206 2015/01/01 17:07:34 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include "magic.h"
 | |
| @@ -41,17 +41,13 @@
 | |
|  #include <ctype.h>
 | |
|  #include <stdlib.h>
 | |
|  #include <time.h>
 | |
| -#if defined(HAVE_LOCALE_H)
 | |
| -#include <locale.h>
 | |
| -#endif
 | |
|  
 | |
| -
 | |
|  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,8 +64,6 @@ private void cvt_64(union VALUETYPE *, const struc
 | |
|  
 | |
|  #define OFFSET_OOB(n, o, i)	((n) < (o) || (i) > ((n) - (o)))
 | |
|  
 | |
| -#define MAX_RECURSION_LEVEL	10
 | |
| -
 | |
|  /*
 | |
|   * softmagic - lookup one file in parsed, in-memory copy of database
 | |
|   * Passed the name and FILE * of one file to be typed.
 | |
| @@ -77,14 +71,21 @@ private void cvt_64(union VALUETYPE *, const struc
 | |
|  /*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;
 | |
| @@ -101,8 +102,8 @@ file_fmtcheck(struct magic_set *ms, const struct m
 | |
|  	const char *ptr = fmtcheck(m->desc, def);
 | |
|  	if (ptr == def)
 | |
|  		file_magerror(ms,
 | |
| -		    "%s, %zu: format `%s' does not match with `%s'",
 | |
| -		    file, line, m->desc, def);
 | |
| +		    "%s, %" SIZE_T_FORMAT "u: format `%s' does not match"
 | |
| +		    " with `%s'", file, line, m->desc, def);
 | |
|  	return ptr;
 | |
|  }
 | |
|  #else
 | |
| @@ -139,8 +140,8 @@ file_fmtcheck(struct magic_set *ms, const struct m
 | |
|  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;
 | |
| @@ -177,8 +178,8 @@ match(struct magic_set *ms, struct magic *magic, u
 | |
|  
 | |
|  		/* 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:
 | |
| @@ -238,9 +239,9 @@ match(struct magic_set *ms, struct magic *magic, u
 | |
|  		if (file_check_mem(ms, ++cont_level) == -1)
 | |
|  			return -1;
 | |
|  
 | |
| -		while (++magindex < nmagic &&
 | |
| -		    magic[magindex].cont_level != 0) {
 | |
| -			m = &magic[magindex];
 | |
| +		while (magindex + 1 < nmagic &&
 | |
| +		    magic[magindex + 1].cont_level != 0) {
 | |
| +			m = &magic[++magindex];
 | |
|  			ms->line = m->lineno; /* for messages */
 | |
|  
 | |
|  			if (cont_level < m->cont_level)
 | |
| @@ -266,8 +267,8 @@ match(struct magic_set *ms, struct magic *magic, u
 | |
|  			}
 | |
|  #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:
 | |
| @@ -410,7 +411,7 @@ mprint(struct magic_set *ms, struct magic *m)
 | |
|  	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) {
 | |
| @@ -504,7 +505,9 @@ mprint(struct magic_set *ms, struct magic *m)
 | |
|    	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;
 | |
|  		}
 | |
| @@ -530,7 +533,8 @@ mprint(struct magic_set *ms, struct magic *m)
 | |
|  				*++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)
 | |
| @@ -634,7 +638,8 @@ mprint(struct magic_set *ms, struct magic *m)
 | |
|  			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)
 | |
| @@ -648,7 +653,8 @@ mprint(struct magic_set *ms, struct magic *m)
 | |
|  	}
 | |
|  
 | |
|  	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;
 | |
| @@ -946,14 +952,17 @@ mconvert(struct magic_set *ms, struct magic *m, in
 | |
|  		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++;
 | |
| @@ -1063,7 +1072,7 @@ mconvert(struct magic_set *ms, struct magic *m, in
 | |
|  private void
 | |
|  mdebug(uint32_t offset, const char *str, size_t len)
 | |
|  {
 | |
| -	(void) fprintf(stderr, "mget/%zu @%d: ", len, offset);
 | |
| +	(void) fprintf(stderr, "mget/%" SIZE_T_FORMAT "u @%d: ", len, offset);
 | |
|  	file_showstr(stderr, str, len);
 | |
|  	(void) fputc('\n', stderr);
 | |
|  	(void) fputc('\n', stderr);
 | |
| @@ -1193,8 +1202,8 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, in
 | |
|  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 offset = ms->offset;
 | |
|  	uint32_t lhs;
 | |
| @@ -1204,18 +1213,28 @@ mget(struct magic_set *ms, const unsigned char *s,
 | |
|  	union VALUETYPE *p = &ms->ms_value;
 | |
|  	struct mlist ml;
 | |
|  
 | |
| -	if (recursion_level >= MAX_RECURSION_LEVEL) {
 | |
| -		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;
 | |
| +	}
 | |
| +
 | |
|  	if (mcopy(ms, p, m->type, m->flag & INDIR, s, (uint32_t)(offset + o),
 | |
|  	    (uint32_t)nbytes, m) == -1)
 | |
|  		return -1;
 | |
|  
 | |
|  	if ((ms->flags & MAGIC_DEBUG) != 0) {
 | |
| -		fprintf(stderr, "mget(type=%d, flag=%x, offset=%u, o=%zu, "
 | |
| -		    "nbytes=%zu)\n", m->type, m->flag, offset, o, nbytes);
 | |
| +		fprintf(stderr, "mget(type=%d, flag=%x, offset=%u, o=%"
 | |
| +		    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);
 | |
| @@ -1646,6 +1665,8 @@ mget(struct magic_set *ms, const unsigned char *s,
 | |
|  		break;
 | |
|  
 | |
|  	case FILE_INDIRECT:
 | |
| +		if (m->str_flags & INDIRECT_RELATIVE)
 | |
| +			offset += o;
 | |
|  		if (offset == 0)
 | |
|  			return 0;
 | |
|  
 | |
| @@ -1656,7 +1677,7 @@ mget(struct magic_set *ms, const unsigned char *s,
 | |
|  			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);
 | |
| @@ -1691,13 +1712,13 @@ mget(struct magic_set *ms, const unsigned char *s,
 | |
|  			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;
 | |
| @@ -1952,6 +1973,7 @@ magiccheck(struct magic_set *ms, struct magic *m)
 | |
|  	case FILE_REGEX: {
 | |
|  		int rc;
 | |
|  		file_regex_t rx;
 | |
| +		const char *search;
 | |
|  
 | |
|  		if (ms->search.s == NULL)
 | |
|  			return 0;
 | |
| @@ -1968,19 +1990,31 @@ magiccheck(struct magic_set *ms, struct magic *m)
 | |
|  			size_t slen = ms->search.s_len;
 | |
|  #ifndef REG_STARTEND
 | |
|  #define	REG_STARTEND	0
 | |
| -			char c;
 | |
| -			if (slen != 0)
 | |
| -				slen--;
 | |
| -			c = ms->search.s[slen];
 | |
| -			((char *)(intptr_t)ms->search.s)[slen] = '\0';
 | |
| +			char *copy;
 | |
| +			if (slen != 0) {
 | |
| +			    copy = malloc(slen);
 | |
| +			    if (copy == NULL)  {
 | |
| +				file_error(ms, errno,
 | |
| +				    "can't allocate %" SIZE_T_FORMAT "u bytes",
 | |
| +				    slen);
 | |
| +				return -1;
 | |
| +			    }
 | |
| +			    memcpy(copy, ms->search.s, slen);
 | |
| +			    copy[--slen] = '\0';
 | |
| +			    search = copy;
 | |
| +			} else {
 | |
| +			    search = ms->search.s;
 | |
| +			    copy = NULL;
 | |
| +			}
 | |
|  #else
 | |
| +			search = ms->search.s;
 | |
|  			pmatch[0].rm_so = 0;
 | |
|  			pmatch[0].rm_eo = slen;
 | |
|  #endif
 | |
| -			rc = file_regexec(&rx, (const char *)ms->search.s,
 | |
| +			rc = file_regexec(&rx, (const char *)search,
 | |
|  			    1, pmatch, REG_STARTEND);
 | |
|  #if REG_STARTEND == 0
 | |
| -			((char *)(intptr_t)ms->search.s)[l] = c;
 | |
| +			free(copy);
 | |
|  #endif
 | |
|  			switch (rc) {
 | |
|  			case 0:
 | |
| Index: contrib/file/src/vasprintf.c
 | |
| ===================================================================
 | |
| --- contrib/file/src/vasprintf.c	(revision 284174)
 | |
| +++ contrib/file/src/vasprintf.c	(working copy)
 | |
| @@ -108,7 +108,7 @@ you use strange formats.
 | |
|  #include "file.h"
 | |
|  
 | |
|  #ifndef	lint
 | |
| -FILE_RCSID("@(#)$File: vasprintf.c,v 1.12 2014/05/14 23:09:21 christos Exp $")
 | |
| +FILE_RCSID("@(#)$File: vasprintf.c,v 1.13 2014/12/04 15:56:46 christos Exp $")
 | |
|  #endif	/* lint */
 | |
|  
 | |
|  #include <assert.h>
 | |
| @@ -633,11 +633,15 @@ int vasprintf(char **ptr, const char *format_strin
 | |
|  #ifdef va_copy
 | |
|    va_copy (s.vargs, vargs);
 | |
|  #else
 | |
| -#ifdef __va_copy
 | |
| +# ifdef __va_copy
 | |
|    __va_copy (s.vargs, vargs);
 | |
| -#else
 | |
| +# else
 | |
| +#  ifdef WIN32
 | |
| +  s.vargs = vargs;
 | |
| +#  else
 | |
|    memcpy (&s.vargs, &vargs, sizeof (s.va_args));
 | |
| -#endif /* __va_copy */
 | |
| +#  endif /* WIN32 */
 | |
| +# endif /* __va_copy */
 | |
|  #endif /* va_copy */
 | |
|    s.maxlen = (size_t)INT_MAX;
 | |
|  
 | |
| Index: lib/libmagic/config.h
 | |
| ===================================================================
 | |
| --- lib/libmagic/config.h	(revision 284174)
 | |
| +++ lib/libmagic/config.h	(working copy)
 | |
| @@ -1,5 +1,13 @@
 | |
|  /* $FreeBSD$ */
 | |
|  
 | |
| +/* Get __FreeBSD_version. */
 | |
| +#include <osreldate.h>
 | |
| +
 | |
| +/* Only specific versions of FreeBSD support xlocale */
 | |
| +#if __FreeBSD_version >= 1000002 || (__FreeBSD_version < 1000000 && __FreeBSD_version >= 900506)
 | |
| +#define FREEBSD_XLOCALE_SUPPORT 1
 | |
| +#endif
 | |
| +
 | |
|  /* config.h.  Generated from config.h.in by configure.  */
 | |
|  /* config.h.in.  Generated from configure.ac by autoheader.  */
 | |
|  
 | |
| @@ -47,6 +55,11 @@
 | |
|  /* Define to 1 if you have the `fork' function. */
 | |
|  #define HAVE_FORK 1
 | |
|  
 | |
| +/* Define to 1 if you have the `freelocale' function. */
 | |
| +#ifdef FREEBSD_XLOCALE_SUPPORT
 | |
| +#define HAVE_FREELOCALE 1
 | |
| +#endif
 | |
| +
 | |
|  /* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
 | |
|  #define HAVE_FSEEKO 1
 | |
|  
 | |
| @@ -98,9 +111,17 @@
 | |
|  /* Define to 1 if you have a working `mmap' system call. */
 | |
|  #define HAVE_MMAP 1
 | |
|  
 | |
| +/* Define to 1 if you have the `newlocale' function. */
 | |
| +#ifdef FREEBSD_XLOCALE_SUPPORT
 | |
| +#define HAVE_NEWLOCALE 1
 | |
| +#endif
 | |
| +
 | |
|  /* 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
 | |
|  
 | |
| @@ -185,6 +206,11 @@
 | |
|  /* Define to 1 if you have the <unistd.h> header file. */
 | |
|  #define HAVE_UNISTD_H 1
 | |
|  
 | |
| +/* Define to 1 if you have the `uselocale' function. */
 | |
| +#ifdef FREEBSD_XLOCALE_SUPPORT
 | |
| +#define HAVE_USELOCALE 1
 | |
| +#endif
 | |
| +
 | |
|  /* Define to 1 if you have the `utime' function. */
 | |
|  #define HAVE_UTIME 1
 | |
|  
 | |
| @@ -222,6 +248,11 @@
 | |
|  /* Define to 1 if `vfork' works. */
 | |
|  #define HAVE_WORKING_VFORK 1
 | |
|  
 | |
| +/* Define to 1 if you have the <xlocale.h> header file. */
 | |
| +#ifdef FREEBSD_XLOCALE_SUPPORT
 | |
| +#define HAVE_XLOCALE_H 1
 | |
| +#endif
 | |
| +
 | |
|  /* Define to 1 if you have the <zlib.h> header file. */
 | |
|  #define HAVE_ZLIB_H 1
 | |
|  
 | |
| @@ -247,7 +278,7 @@
 | |
|  #define PACKAGE_NAME "file"
 | |
|  
 | |
|  /* Define to the full name and version of this package. */
 | |
| -#define PACKAGE_STRING "file 5.19"
 | |
| +#define PACKAGE_STRING "file 5.22"
 | |
|  
 | |
|  /* Define to the one symbol short name of this package. */
 | |
|  #define PACKAGE_TARNAME "file"
 | |
| @@ -256,7 +287,7 @@
 | |
|  #define PACKAGE_URL ""
 | |
|  
 | |
|  /* Define to the version of this package. */
 | |
| -#define PACKAGE_VERSION "5.19"
 | |
| +#define PACKAGE_VERSION "5.22"
 | |
|  
 | |
|  /* Define to 1 if you have the ANSI C header files. */
 | |
|  #define STDC_HEADERS 1
 | |
| @@ -287,7 +318,7 @@
 | |
|  
 | |
|  
 | |
|  /* Version number of package */
 | |
| -#define VERSION "5.19"
 | |
| +#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). */
 |