MFV r362254: file 5.39.

MFC after:	2 weeks
This commit is contained in:
Xin LI 2020-06-17 07:41:28 +00:00
commit 2726a70148
69 changed files with 3119 additions and 889 deletions

View File

@ -1,3 +1,83 @@
2020-06-14 20:02 Christos Zoulas <christos@zoulas.com>
* release 5.39
2020-06-07 20:00 Christos Zoulas <christos@zoulas.com>
* Remove unused subtype_mime (Steve Grubb)
* Remove unused check in okstat (Steve Grubb)
* Fix mime-type in elf binaries by making sure $x is set
* Fix indirect negative offsets broken by OFFNEGATIVE
* Fix GUID equality check
* PR/165: Handle empty array and strings in JSON
* PR/162: Add --exclude-quiet
2020-06-06 15:33 Christos Zoulas <christos@zoulas.com>
* Fix memory leak in ascmagic (Steve Grubb)
2020-06-04 00:21 Christos Zoulas <christos@zoulas.com>
* Fix string comparison length with ignore whitespace
2020-05-31 00:11 Christos Zoulas <christos@zoulas.com>
* Fix mingwin 64 compilation
2020-05-30 23:56 Christos Zoulas <christos@zoulas.com>
* PR/159: whitelist getpid needed for file_pipe2file()
2020-05-09 18:57 Christos Zoulas <christos@zoulas.com>
* Indicate negative offsets with a flag OFFNEGATIVE
so that -0 works.
* Introduce "offset" magic type that can be used to
detect the file size, and bail on short files.
* document DER better in the magic man page.
2020-03-11 21:53 Christos Zoulas <christos@zoulas.com>
* fix memory leaks (SonarQube)
2020-03-08 21:33 Christos Zoulas <christos@zoulas.com>
* fix memory leaks (SonarQube)
* rewrite confusing loops (SonarQube)
* fix bogus test (SonarQube)
* pass a sized buffer to file_fmttime() (SonarQube)
* fix memory leaks (SonarQube)
2020-02-20 15:50 Christos Zoulas <christos@zoulas.com>
* Don't allow * in printf formats, or the code itself (Christoph Biedl)
* Introduce a printf output size checker to avoid DoS attacks
2020-02-17 17:22 Christos Zoulas <christos@zoulas.com>
* Avoid memory leak on error (oss-fuzz)
* Check length of string on DER before derefercing and add new types
* Add missing DER string (oss-fuzz)
2020-02-16 20:45 Christos Zoulas <christos@zoulas.com>
* Add missing DER types, and debugging
2020-02-13 13:10 Christos Zoulas <christos@zoulas.com>
* PR/140: Avoid abort with hand-crafted magic file (gockelhahn)
* PR/139 Avoid DoS in printf with hand-crafted magic file (gockelhahn)
* PR/138: Avoid crash with hand-crafted magic file (gockelhahn)
2020-02-12 17:30 Christos Zoulas <christos@zoulas.com>
* PR/136: Fix static build by adding a libmagic.pc (Fabrice Fontaine)
2019-12-24 14:16 Christos Zoulas <christos@zoulas.com>
* add guid support
2019-12-16 21:11 Christos Zoulas <christos@zoulas.com> 2019-12-16 21:11 Christos Zoulas <christos@zoulas.com>
* release 5.38 * release 5.38

View File

@ -3,3 +3,8 @@ ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = MAINT EXTRA_DIST = MAINT
SUBDIRS = src magic tests doc python SUBDIRS = src magic tests doc python
# This variable must have 'exec' in its name, in order to be installed
# by 'install-exec' target (instead of default 'install-data')
pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libmagic.pc

View File

@ -13,6 +13,7 @@
# PARTICULAR PURPOSE. # PARTICULAR PURPOSE.
@SET_MAKE@ @SET_MAKE@
VPATH = @srcdir@ VPATH = @srcdir@
am__is_gnu_make = { \ am__is_gnu_make = { \
if test -z '$(MAKELEVEL)'; then \ if test -z '$(MAKELEVEL)'; then \
@ -100,7 +101,7 @@ am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno config.status.lineno configure.lineno config.status.lineno
mkinstalldirs = $(install_sh) -d mkinstalldirs = $(install_sh) -d
CONFIG_HEADER = config.h CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = CONFIG_CLEAN_FILES = libmagic.pc
CONFIG_CLEAN_VPATH_FILES = CONFIG_CLEAN_VPATH_FILES =
AM_V_P = $(am__v_P_@AM_V@) AM_V_P = $(am__v_P_@AM_V@)
am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
@ -129,6 +130,35 @@ am__can_run_installinfo = \
n|no|NO) false;; \ n|no|NO) false;; \
*) (install-info --version) >/dev/null 2>&1;; \ *) (install-info --version) >/dev/null 2>&1;; \
esac esac
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
am__install_max = 40
am__nobase_strip_setup = \
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
am__nobase_strip = \
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
am__nobase_list = $(am__nobase_strip_setup); \
for p in $$list; do echo "$$p $$p"; done | \
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
if (++n[$$2] == $(am__install_max)) \
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
END { for (dir in files) print dir, files[dir] }'
am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
test -z "$$files" \
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(pkgconfigexecdir)"
DATA = $(pkgconfigexec_DATA)
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive distclean-recursive maintainer-clean-recursive
am__recursive_targets = \ am__recursive_targets = \
@ -159,9 +189,10 @@ ETAGS = etags
CTAGS = ctags CTAGS = ctags
CSCOPE = cscope CSCOPE = cscope
DIST_SUBDIRS = $(SUBDIRS) DIST_SUBDIRS = $(SUBDIRS)
am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in AUTHORS \ am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \
COPYING ChangeLog INSTALL NEWS README TODO compile \ $(srcdir)/libmagic.pc.in AUTHORS COPYING ChangeLog INSTALL \
config.guess config.sub install-sh ltmain.sh missing NEWS README TODO compile config.guess config.sub install-sh \
ltmain.sh missing
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION) distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir) top_distdir = $(distdir)
@ -328,6 +359,11 @@ top_srcdir = @top_srcdir@
ACLOCAL_AMFLAGS = -I m4 ACLOCAL_AMFLAGS = -I m4
EXTRA_DIST = MAINT EXTRA_DIST = MAINT
SUBDIRS = src magic tests doc python SUBDIRS = src magic tests doc python
# This variable must have 'exec' in its name, in order to be installed
# by 'install-exec' target (instead of default 'install-data')
pkgconfigexecdir = $(libdir)/pkgconfig
pkgconfigexec_DATA = libmagic.pc
all: config.h all: config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive $(MAKE) $(AM_MAKEFLAGS) all-recursive
@ -380,6 +416,8 @@ $(srcdir)/config.h.in: $(am__configure_deps)
distclean-hdr: distclean-hdr:
-rm -f config.h stamp-h1 -rm -f config.h stamp-h1
libmagic.pc: $(top_builddir)/config.status $(srcdir)/libmagic.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $@
mostlyclean-libtool: mostlyclean-libtool:
-rm -f *.lo -rm -f *.lo
@ -389,6 +427,27 @@ clean-libtool:
distclean-libtool: distclean-libtool:
-rm -f libtool config.lt -rm -f libtool config.lt
install-pkgconfigexecDATA: $(pkgconfigexec_DATA)
@$(NORMAL_INSTALL)
@list='$(pkgconfigexec_DATA)'; test -n "$(pkgconfigexecdir)" || list=; \
if test -n "$$list"; then \
echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigexecdir)'"; \
$(MKDIR_P) "$(DESTDIR)$(pkgconfigexecdir)" || exit 1; \
fi; \
for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
echo "$$d$$p"; \
done | $(am__base_list) | \
while read files; do \
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigexecdir)'"; \
$(INSTALL_DATA) $$files "$(DESTDIR)$(pkgconfigexecdir)" || exit $$?; \
done
uninstall-pkgconfigexecDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconfigexec_DATA)'; test -n "$(pkgconfigexecdir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
dir='$(DESTDIR)$(pkgconfigexecdir)'; $(am__uninstall_files_from_dir)
# This directory's subdirectories are mostly independent; you can cd # This directory's subdirectories are mostly independent; you can cd
# into them and run 'make' without going through this Makefile. # into them and run 'make' without going through this Makefile.
@ -689,9 +748,12 @@ distcleancheck: distclean
exit 1; } >&2 exit 1; } >&2
check-am: all-am check-am: all-am
check: check-recursive check: check-recursive
all-am: Makefile config.h all-am: Makefile $(DATA) config.h
installdirs: installdirs-recursive installdirs: installdirs-recursive
installdirs-am: installdirs-am:
for dir in "$(DESTDIR)$(pkgconfigexecdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-recursive install: install-recursive
install-exec: install-exec-recursive install-exec: install-exec-recursive
install-data: install-data-recursive install-data: install-data-recursive
@ -750,7 +812,7 @@ install-dvi: install-dvi-recursive
install-dvi-am: install-dvi-am:
install-exec-am: install-exec-am: install-pkgconfigexecDATA
install-html: install-html-recursive install-html: install-html-recursive
@ -790,7 +852,7 @@ ps: ps-recursive
ps-am: ps-am:
uninstall-am: uninstall-am: uninstall-pkgconfigexecDATA
.MAKE: $(am__recursive_targets) all install-am install-strip .MAKE: $(am__recursive_targets) all install-am install-strip
@ -804,12 +866,13 @@ uninstall-am:
info-am install install-am install-data install-data-am \ info-am install install-am install-data install-data-am \
install-dvi install-dvi-am install-exec install-exec-am \ install-dvi install-dvi-am install-exec install-exec-am \
install-html install-html-am install-info install-info-am \ install-html install-html-am install-info install-info-am \
install-man install-pdf install-pdf-am install-ps \ install-man install-pdf install-pdf-am \
install-ps-am install-strip installcheck installcheck-am \ install-pkgconfigexecDATA install-ps install-ps-am \
installdirs installdirs-am maintainer-clean \ install-strip installcheck installcheck-am installdirs \
maintainer-clean-generic mostlyclean mostlyclean-generic \ installdirs-am maintainer-clean maintainer-clean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
uninstall-am ps ps-am tags tags-am uninstall uninstall-am \
uninstall-pkgconfigexecDATA
.PRECIOUS: Makefile .PRECIOUS: Makefile

View File

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for file 5.38. # Generated by GNU Autoconf 2.69 for file 5.39.
# #
# Report bugs to <christos@astron.com>. # Report bugs to <christos@astron.com>.
# #
@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package. # Identity of this package.
PACKAGE_NAME='file' PACKAGE_NAME='file'
PACKAGE_TARNAME='file' PACKAGE_TARNAME='file'
PACKAGE_VERSION='5.38' PACKAGE_VERSION='5.39'
PACKAGE_STRING='file 5.38' PACKAGE_STRING='file 5.39'
PACKAGE_BUGREPORT='christos@astron.com' PACKAGE_BUGREPORT='christos@astron.com'
PACKAGE_URL='' PACKAGE_URL=''
@ -1334,7 +1334,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # 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. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures file 5.38 to adapt to many kinds of systems. \`configure' configures file 5.39 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1404,7 +1404,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of file 5.38:";; short | recursive ) echo "Configuration of file 5.39:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1524,7 +1524,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
file configure 5.38 file configure 5.39
generated by GNU Autoconf 2.69 generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc. Copyright (C) 2012 Free Software Foundation, Inc.
@ -2180,7 +2180,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by file $as_me 5.38, which was It was created by file $as_me 5.39, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@ $ $0 $@
@ -3046,7 +3046,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='file' PACKAGE='file'
VERSION='5.38' VERSION='5.39'
cat >>confdefs.h <<_ACEOF cat >>confdefs.h <<_ACEOF
@ -15167,7 +15167,7 @@ $as_echo "#define XZLIBSUPPORT 1" >>confdefs.h
fi fi
ac_config_files="$ac_config_files Makefile src/Makefile magic/Makefile tests/Makefile doc/Makefile python/Makefile" ac_config_files="$ac_config_files Makefile src/Makefile magic/Makefile tests/Makefile doc/Makefile python/Makefile libmagic.pc"
cat >confcache <<\_ACEOF cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure # This file is a shell script that caches the results of configure
@ -15712,7 +15712,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by file $as_me 5.38, which was This file was extended by file $as_me 5.39, which was
generated by GNU Autoconf 2.69. Invocation command line was generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -15778,7 +15778,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\ ac_cs_version="\\
file config.status 5.38 file config.status 5.39
configured by $0, generated by GNU Autoconf 2.69, configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\" with options \\"\$ac_cs_config\\"
@ -16199,6 +16199,7 @@ do
"tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
"doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;;
"python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;; "python/Makefile") CONFIG_FILES="$CONFIG_FILES python/Makefile" ;;
"libmagic.pc") CONFIG_FILES="$CONFIG_FILES libmagic.pc" ;;
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
esac esac

View File

@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script. dnl Process this file with autoconf to produce a configure script.
AC_INIT([file],[5.38],[christos@astron.com]) AC_INIT([file],[5.39],[christos@astron.com])
AM_INIT_AUTOMAKE([subdir-objects foreign]) AM_INIT_AUTOMAKE([subdir-objects foreign])
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@ -217,5 +217,5 @@ if test "$ac_cv_header_lzma_h$ac_cv_lib_lzma_lzma_stream_decoder" = "yesyes"; t
AC_DEFINE([XZLIBSUPPORT], 1, [Enable xzlib compression support]) AC_DEFINE([XZLIBSUPPORT], 1, [Enable xzlib compression support])
fi fi
AC_CONFIG_FILES([Makefile src/Makefile magic/Makefile tests/Makefile doc/Makefile python/Makefile]) AC_CONFIG_FILES([Makefile src/Makefile magic/Makefile tests/Makefile doc/Makefile python/Makefile libmagic.pc])
AC_OUTPUT AC_OUTPUT

View File

@ -1,5 +1,5 @@
.\" $File: file.man,v 1.138 2019/10/15 18:00:40 christos Exp $ .\" $File: file.man,v 1.140 2020/06/07 17:41:07 christos Exp $
.Dd July 13, 2019 .Dd June 7, 2020
.Dt FILE __CSECTION__ .Dt FILE __CSECTION__
.Os .Os
.Sh NAME .Sh NAME
@ -10,6 +10,7 @@
.Bk -words .Bk -words
.Op Fl bcdEhiklLNnprsSvzZ0 .Op Fl bcdEhiklLNnprsSvzZ0
.Op Fl Fl apple .Op Fl Fl apple
.Op Fl Fl exclude-quiet
.Op Fl Fl extension .Op Fl Fl extension
.Op Fl Fl mime-encoding .Op Fl Fl mime-encoding
.Op Fl Fl mime-type .Op Fl Fl mime-type
@ -229,6 +230,14 @@ the soft magic method.
A synonym for A synonym for
.Sq ascii . .Sq ascii .
.El .El
.It Fl Fl exclude-quiet
Like
.Fl Fl exclude
but ignore tests that
.Nm
does not know about.
This is intended for compatilibity with older versions of
.Nm .
.It Fl Fl extension .It Fl Fl extension
Print a slash-separated list of valid extensions for the file type found. Print a slash-separated list of valid extensions for the file type found.
.It Fl F , Fl Fl separator Ar separator .It Fl F , Fl Fl separator Ar separator
@ -326,13 +335,13 @@ never read them.
Set various parameter limits. Set various parameter limits.
.Bl -column "elf_phnum" "Default" "XXXXXXXXXXXXXXXXXXXXXXXXXXX" -offset indent .Bl -column "elf_phnum" "Default" "XXXXXXXXXXXXXXXXXXXXXXXXXXX" -offset indent
.It Sy "Name" Ta Sy "Default" Ta Sy "Explanation" .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
.It Li regex Ta 8192 Ta length limit for regex searches
.It Li bytes Ta 1048576 Ta max number of bytes to read from file .It Li bytes Ta 1048576 Ta max number of bytes to read from file
.It Li elf_notes Ta 256 Ta max ELF notes processed
.It Li elf_phnum Ta 2048 Ta max ELF program sections processed
.It Li elf_shnum Ta 32768 Ta max ELF sections processed
.It Li indir Ta 50 Ta recursion limit for indirect magic
.It Li name Ta 50 Ta use count limit for name/use magic
.It Li regex Ta 8192 Ta length limit for regex searches
.El .El
.It Fl r , Fl Fl raw .It Fl r , Fl Fl raw
Don't translate unprintable characters to \eooo. Don't translate unprintable characters to \eooo.

View File

@ -1,5 +1,5 @@
.\" $File: magic.man,v 1.97 2019/11/15 21:03:14 christos Exp $ .\" $File: magic.man,v 1.98 2020/05/09 18:55:23 christos Exp $
.Dd January 21, 2019 .Dd May 9, 2020
.Dt MAGIC __FSECTION__ .Dt MAGIC __FSECTION__
.Os .Os
.\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems. .\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems.
@ -300,6 +300,62 @@ This test is always true and clears the match flag for that continuation level.
It is intended to be used with the It is intended to be used with the
.Dv default .Dv default
test. test.
.It Dv der
Parse the file as a DER Certificate file.
The test field is used as a der type that needs to be matched.
The DER types are:
.Dv eoc ,
.Dv bool ,
.Dv int ,
.Dv bit_str ,
.Dv octet_str ,
.Dv null ,
.Dv obj_id ,
.Dv obj_desc ,
.Dv ext ,
.Dv real ,
.Dv enum ,
.Dv embed ,
.Dv utf8_str ,
.Dv rel_oid ,
.Dv time ,
.Dv res2 ,
.Dv seq ,
.Dv set ,
.Dv num_str ,
.Dv prt_str ,
.Dv t61_str ,
.Dv vid_str ,
.Dv ia5_str ,
.Dv utc_time ,
.Dv gen_time ,
.Dv gr_str ,
.Dv vis_str ,
.Dv gen_str ,
.Dv univ_str ,
.Dv char_str ,
.Dv bmp_str ,
.Dv date ,
.Dv tod ,
.Dv datetime ,
.Dv duration ,
.Dv oid-iri ,
.Dv rel-oid-iri .
These types can be followed by an optional numeric size, which indicates
the field width in bytes.
.It Dv guid
A Globally Unique Identifier, parsed and printed as
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
It's format is a string.
.It Dv offset
This is a quad value indicating the current offset of the file.
It can be used to determine the size of the file or the magic buffer.
For example the magic entries:
.Bd -literal -offset indent
-0 offset x this file is %lld bytes
-0 offset <=100 must be more than 100 \e
bytes and is only %lld
.Ed
.El .El
.Pp .Pp
For compatibility with the Single For compatibility with the Single

View File

@ -0,0 +1,10 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@
Name: libmagic
Description: Magic number recognition library
Version: @VERSION@
Libs: -L${libdir} -lmagic
Libs.private: @LIBS@

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: animation,v 1.74 2019/10/29 01:06:20 christos Exp $ # $File: animation,v 1.77 2020/04/26 15:23:43 christos Exp $
# animation: file(1) magic for animation/movie formats # animation: file(1) magic for animation/movie formats
# #
# animation formats # animation formats
@ -159,7 +159,7 @@
>8 string mqt \b, Sony / Mobile QuickTime (.MQV) US Pat 7,477,830 >8 string mqt \b, Sony / Mobile QuickTime (.MQV) US Pat 7,477,830
!:mime video/quicktime !:mime video/quicktime
>8 string MSNV \b, MPEG-4 (.MP4) for SonyPSP >8 string MSNV \b, MPEG-4 (.MP4) for SonyPSP
!:mime audio/mp4 !:mime video/mp4
>8 string NDAS \b, MP4 v2 [ISO 14496-14] Nero Digital AAC Audio >8 string NDAS \b, MP4 v2 [ISO 14496-14] Nero Digital AAC Audio
!:mime audio/mp4 !:mime audio/mp4
>8 string NDSC \b, MPEG-4 (.MP4) Nero Cinema Profile >8 string NDSC \b, MPEG-4 (.MP4) Nero Cinema Profile
@ -855,10 +855,6 @@
>3 byte &0x80 (PAL) >3 byte &0x80 (PAL)
>3 byte ^0x80 (NTSC) >3 byte ^0x80 (NTSC)
# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>
0 belong 0x3026b275 Microsoft ASF
!:mime video/x-ms-asf
# MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/> # MNG Video Format, <URL:http://www.libpng.org/pub/mng/spec/>
0 string \x8aMNG MNG video data, 0 string \x8aMNG MNG video data,
!:mime video/x-mng !:mime video/x-mng

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: archive,v 1.133 2019/11/15 21:03:14 christos Exp $ # $File: archive,v 1.138 2020/06/07 23:29:26 christos Exp $
# archive: file(1) magic for archive formats (see also "msdos" for self- # archive: file(1) magic for archive formats (see also "msdos" for self-
# extracting compressed archives) # extracting compressed archives)
# #
@ -236,7 +236,8 @@
!:ext deb/udeb !:ext deb/udeb
>14 string -binary Debian binary package >14 string -binary Debian binary package
!:mime application/vnd.debian.binary-package !:mime application/vnd.debian.binary-package
!:ext deb/udeb # For ipk packager see also https://en.wikipedia.org/wiki/Opkg
!:ext deb/udeb/ipk
# This should not happen # This should not happen
>14 default x Unknown Debian package >14 default x Unknown Debian package
# NL terminated version; for most Debian cases this is 2.0 or 2.1 for splitted # NL terminated version; for most Debian cases this is 2.0 or 2.1 for splitted
@ -250,7 +251,16 @@
>>0 search/0x93e4f data.tar. \b, data compression >>0 search/0x93e4f data.tar. \b, data compression
# the above line only works if FILE_BYTES_MAX in ../../src/file.h is raised # the above line only works if FILE_BYTES_MAX in ../../src/file.h is raised
# for example like libreoffice-dev-doc_1%3a5.2.7-1+rpi1+deb9u3_all.deb # for example like libreoffice-dev-doc_1%3a5.2.7-1+rpi1+deb9u3_all.deb
>>>&0 string x %.4s >>>&0 string x %.2s
# skip space (0x20 BSD) and slash (0x2f System V) character marking end of name
>>>&2 ubyte !0x20
>>>>&-1 ubyte !0x2f
# display 3rd character of file name extension like 2 of bz2 or m of lzma
>>>>>&-1 ubyte x \b%c
>>>>>>&0 ubyte !0x20
>>>>>>>&-1 ubyte !0x2f
# display 4th character of file name extension like a of lzma
>>>>>>>>&-1 ubyte x \b%c
# splitted debian package case # splitted debian package case
>68 string =2.1\n >68 string =2.1\n
# dpkg-1.18.25/dpkg-split/info.c # dpkg-1.18.25/dpkg-split/info.c
@ -1124,71 +1134,120 @@
# OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7) # OpenOffice formats (for OpenOffice 1.x / StarOffice 6/7)
# (mimetype contains "application/vnd.sun.xml.<SUBTYPE>") # (mimetype contains "application/vnd.sun.xml.<SUBTYPE>")
# URL: https://en.wikipedia.org/wiki/OpenOffice.org_XML
# reference: http://fileformats.archiveteam.org/wiki/OpenOffice.org_XML
>>50 string vnd.sun.xml. OpenOffice.org 1.x >>50 string vnd.sun.xml. OpenOffice.org 1.x
>>>62 string writer Writer >>>62 string writer Writer
>>>>68 byte !0x2e document >>>>68 byte !0x2e document
!:mime application/vnd.sun.xml.writer
!:ext sxw
>>>>68 string .template template >>>>68 string .template template
!:mime application/vnd.sun.xml.writer.template
!:ext stw
>>>>68 string .web Web template
!:mime application/vnd.sun.xml.writer.web
!:ext stw
>>>>68 string .global global document >>>>68 string .global global document
!:mime application/vnd.sun.xml.writer.global
!:ext sxg
>>>62 string calc Calc >>>62 string calc Calc
>>>>66 byte !0x2e spreadsheet >>>>66 byte !0x2e spreadsheet
!:mime application/vnd.sun.xml.calc
!:ext sxc
>>>>66 string .template template >>>>66 string .template template
!:mime application/vnd.sun.xml.calc.template
!:ext stc
>>>62 string draw Draw >>>62 string draw Draw
>>>>66 byte !0x2e document >>>>66 byte !0x2e document
!:mime application/vnd.sun.xml.draw
!:ext sxd
>>>>66 string .template template >>>>66 string .template template
!:mime application/vnd.sun.xml.draw.template
!:ext std
>>>62 string impress Impress >>>62 string impress Impress
>>>>69 byte !0x2e presentation >>>>69 byte !0x2e presentation
!:mime application/vnd.sun.xml.impress
!:ext sxi
>>>>69 string .template template >>>>69 string .template template
!:mime application/vnd.sun.xml.impress.template
!:ext sti
>>>62 string math Math document >>>62 string math Math document
!:mime application/vnd.sun.xml.math
!:ext sxm
>>>62 string base Database file >>>62 string base Database file
!:mime application/vnd.sun.xml.base
!:ext sdb
# OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8) # OpenDocument formats (for OpenOffice 2.x / StarOffice >= 8)
# URL: http://fileformats.archiveteam.org/wiki/OpenDocument
# https://lists.oasis-open.org/archives/office/200505/msg00006.html # https://lists.oasis-open.org/archives/office/200505/msg00006.html
# (mimetype contains "application/vnd.oasis.opendocument.<SUBTYPE>") # (mimetype contains "application/vnd.oasis.opendocument.<SUBTYPE>")
>>50 string vnd.oasis.opendocument. OpenDocument >>50 string vnd.oasis.opendocument. OpenDocument
>>>73 string text >>>73 string text
>>>>77 byte !0x2d Text >>>>77 byte !0x2d Text
!:mime application/vnd.oasis.opendocument.text !:mime application/vnd.oasis.opendocument.text
!:ext odt
>>>>77 string -template Text Template >>>>77 string -template Text Template
!:mime application/vnd.oasis.opendocument.text-template !:mime application/vnd.oasis.opendocument.text-template
!:ext ott
>>>>77 string -web HTML Document Template >>>>77 string -web HTML Document Template
!:mime application/vnd.oasis.opendocument.text-web !:mime application/vnd.oasis.opendocument.text-web
!:ext oth
>>>>77 string -master Master Document >>>>77 string -master Master Document
!:mime application/vnd.oasis.opendocument.text-master !:mime application/vnd.oasis.opendocument.text-master
!:ext odm
>>>73 string graphics >>>73 string graphics
>>>>81 byte !0x2d Drawing >>>>81 byte !0x2d Drawing
!:mime application/vnd.oasis.opendocument.graphics !:mime application/vnd.oasis.opendocument.graphics
>>>>81 string -template Template !:ext odg
>>>>81 string -template Drawing Template
!:mime application/vnd.oasis.opendocument.graphics-template !:mime application/vnd.oasis.opendocument.graphics-template
!:ext otg
>>>73 string presentation >>>73 string presentation
>>>>85 byte !0x2d Presentation >>>>85 byte !0x2d Presentation
!:mime application/vnd.oasis.opendocument.presentation !:mime application/vnd.oasis.opendocument.presentation
>>>>85 string -template Template !:ext odp
>>>>85 string -template Presentation Template
!:mime application/vnd.oasis.opendocument.presentation-template !:mime application/vnd.oasis.opendocument.presentation-template
!:ext otp
>>>73 string spreadsheet >>>73 string spreadsheet
>>>>84 byte !0x2d Spreadsheet >>>>84 byte !0x2d Spreadsheet
!:mime application/vnd.oasis.opendocument.spreadsheet !:mime application/vnd.oasis.opendocument.spreadsheet
>>>>84 string -template Template !:ext ods
>>>>84 string -template Spreadsheet Template
!:mime application/vnd.oasis.opendocument.spreadsheet-template !:mime application/vnd.oasis.opendocument.spreadsheet-template
!:ext ots
>>>73 string chart >>>73 string chart
>>>>78 byte !0x2d Chart >>>>78 byte !0x2d Chart
!:mime application/vnd.oasis.opendocument.chart !:mime application/vnd.oasis.opendocument.chart
>>>>78 string -template Template !:ext odc
>>>>78 string -template Chart Template
!:mime application/vnd.oasis.opendocument.chart-template !:mime application/vnd.oasis.opendocument.chart-template
!:ext otc
>>>73 string formula >>>73 string formula
>>>>80 byte !0x2d Formula >>>>80 byte !0x2d Formula
!:mime application/vnd.oasis.opendocument.formula !:mime application/vnd.oasis.opendocument.formula
>>>>80 string -template Template !:ext odf
>>>>80 string -template Formula Template
!:mime application/vnd.oasis.opendocument.formula-template !:mime application/vnd.oasis.opendocument.formula-template
!:ext otf
# https://www.loc.gov/preservation/digital/formats/fdd/fdd000441.shtml
>>>73 string database Database >>>73 string database Database
!:mime application/vnd.oasis.opendocument.database !:mime application/vnd.oasis.opendocument.database
!:ext odb
# Valid for LibreOffice Base 6.0.1.1 at least # Valid for LibreOffice Base 6.0.1.1 at least
>>>73 string base Database >>>73 string base Database
!:mime application/vnd.oasis.opendocument.base # https://bugs.documentfoundation.org/show_bug.cgi?id=45854
!:mime application/vnd.oasis.opendocument.database
#!:mime application/vnd.oasis.opendocument.base
!:ext odb
>>>73 string image >>>73 string image
>>>>78 byte !0x2d Image >>>>78 byte !0x2d Image
!:mime application/vnd.oasis.opendocument.image !:mime application/vnd.oasis.opendocument.image
>>>>78 string -template Template !:ext odi
>>>>78 string -template Image Template
!:mime application/vnd.oasis.opendocument.image-template !:mime application/vnd.oasis.opendocument.image-template
!:ext oti
# EPUB (OEBPS) books using OCF (OEBPS Container Format) # EPUB (OEBPS) books using OCF (OEBPS Container Format)
# https://www.idpf.org/ocf/ocf1.0/download/ocf10.htm, section 4. # https://www.idpf.org/ocf/ocf1.0/download/ocf10.htm, section 4.
@ -1206,12 +1265,33 @@
>>>62 string draw.template+zip Draw template, version 14-16 >>>62 string draw.template+zip Draw template, version 14-16
!:mime application/x-vnd.corel.draw.template+zip !:mime application/x-vnd.corel.draw.template+zip
!:ext cdrt !:ext cdrt
>>>62 string zcf.draw.document+zip Draw drawing, version 17-21 >>>62 string zcf.draw.document+zip Draw drawing, version 17-22
!:mime application/x-vnd.corel.zcf.draw.document+zip !:mime application/x-vnd.corel.zcf.draw.document+zip
!:ext cdr !:ext cdr
>>>62 string zcf.draw.template+zip Draw template, version 17-21 >>>62 string zcf.draw.template+zip Draw template, version 17-22
!:mime application/x-vnd.corel.zcf.draw.template+zip !:mime application/x-vnd.corel.zcf.draw.template+zip
!:ext cdt/cdrt !:ext cdt/cdrt
# URL: http://product.corel.com/help/CorelDRAW/540240626/Main/EN/Doc/CorelDRAW-Other-file-formats.html
>>>62 string zcf.pattern+zip Draw pattern, version 22
!:mime application/x-vnd.corel.zcf.pattern+zip
!:ext pat
# URL: https://en.wikipedia.org/wiki/Corel_Designer
# Reference: http://fileformats.archiveteam.org/wiki/Corel_Designer
# Note: called by TrID "Corel DESIGN graphics"
>>>62 string designer.document+zip DESIGNER graphics, version 14-16
!:mime application/x-vnd.corel.designer.document+zip
!:ext des
>>>62 string zcf.designer.document+zip DESIGNER graphics, version 17-21
!:mime application/x-vnd.corel.zcf.designer.document+zip
!:ext des
# URL: http://product.corel.com/help/CorelDRAW/540223850/Main/EN/Documentation/
# CorelDRAW-Corel-Symbol-Library-CSL.html
>>>62 string symbol.library+zip Symbol Library, version 6-16.3
!:mime application/x-vnd.corel.symbol.library+zip
!:ext csl
>>>62 string zcf.symbol.library+zip Symbol Library, version 17-22
!:mime application/x-vnd.corel.zcf.symbol.library+zip
!:ext csl
# Catch other ZIP-with-mimetype formats # Catch other ZIP-with-mimetype formats
# In a ZIP file, the bytes immediately after a member's contents are # In a ZIP file, the bytes immediately after a member's contents are
@ -1239,16 +1319,19 @@
>>>>38 search/64 .app/ iOS App >>>>38 search/64 .app/ iOS App
!:mime application/x-ios-app !:mime application/x-ios-app
>30 search/100/b application/epub+zip EPUB document
!:mime application/epub+zip
# Generic zip archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu) # Generic zip archives (Greg Roelofs, c/o zip-bugs@wkuvx1.wku.edu)
# Next line excludes specialized formats: # Next line excludes specialized formats:
>(26.s+30) leshort !0xcafe >(26.s+30) leshort !0xcafe
>>26 string !\x8\0\0\0mimetype Zip archive data >>30 search/100/b !application/epub+zip
>>>26 string !\x8\0\0\0mimetype Zip archive data
!:mime application/zip !:mime application/zip
>>>4 beshort x \b, at least >>>>4 beshort x \b, at least
>>>4 use zipversion >>>>4 use zipversion
>>>4 beshort x to extract >>>>4 beshort x to extract
>>>0x161 string WINZIP \b, WinZIP self-extracting >>>>0x161 string WINZIP \b, WinZIP self-extracting
# StarView Metafile # StarView Metafile
# From Pierre Ducroquet <pinaraf@pinaraf.info> # From Pierre Ducroquet <pinaraf@pinaraf.info>

View File

@ -0,0 +1,132 @@
#------------------------------------------------------------------------------
# $File: asf,v 1.1 2019/12/26 02:07:53 christos Exp $
# asf: file(1) magic for Microsoft Advanced Systems Format (ASF) files
# http://www.staroceans.org/e-book/ASF_Specification.pdf
0 name asf-name
# ASF_Data_Object
#>0 guid 75B22636-668E-11CF-A6D9-00AA0062CE6C
#>16 lequad >0
#>>(16.q) use asf-object
# ASF_Simple_Index_Object
>0 guid 33000890-E5B1-11CF-89F4-00A0C90349CB
>0 guid D6E229D3-35DA-11D1-9034-00A0C90349BE ASF_Index_Object
>0 guid FEB103F8-12AD-4C64-840F-2A1D2F7AD48C ASF_Media_Object_Index_Object
>0 guid 3CB73FD0-0C4A-4803-953D-EDF7B6228F0C ASF_Timecode_Index_Object
# ASF_File_Properties_Object
>0 guid 8CABDCA1-A947-11CF-8EE4-00C00C205365
# ASF_Stream_Properties_Object
>0 guid B7DC0791-A9B7-11CF-8EE6-00C00C205365
#>>56 lequad x Time Offset %lld
#>>64 lelong x Type-Specicic Data Length %d
#>>68 lelong x Error Correction Data Length %d
#>>72 leshort x Flags 0x%x
#>>74 lelong x Reserved %x
# ASF_Audio_Media
>>24 guid F8699E40-5B4D-11CF-A8FD-00805F5C442B \b, Audio Media (
>>>78 leshort x \bCodec Id %d
>>>80 leshort x \b, Number of channels %d
>>>82 lelong x \b, Samples Per Second %d
>>>86 lelong x \b, Average Number of Bytes Per Second %d
>>>90 lelong x \b, Block Alignment %d
>>>94 leshort x \b, Bits Per Sample %d
# ASF_Video_Media
>>24 guid BC19EFC0-5B4D-11CF-A8FD-00805F5C442B \b, Video Media (
>>>78 lelong x \bEncoded Image Width %d
>>>82 lelong x \b, Encoded Image Height %d
#>>>85 leshort x \b, Format Data Size %x
>>>93 lelong x \b, Image Width %d
>>>97 lelong x \b, Image Height %d
#>>>101 leshort x \b, Reserved 0x%x
>>>103 leshort x \b, Bits Per Pixel Count %d
#>>>105 lelong x \b, Compression ID %d
#>>>109 lelong x \b, Image Size %d
#>>>113 lelong x \b, Horizontal Pixels Per Meter %d
#>>>117 lelong x \b, Vertical Pixels Per Meter %d
#>>>121 lelong x \b, Colors Used Count %d
#>>>125 lelong x \b, Important Colors Count %d
>>0 lelong x \b, Error correction type
>>40 use asf-name
>>0 lelong x \b)
#ASF_Header_Extension_Object
>0 guid 5FBF03B5-A92E-11CF-8EE3-00C00C205365
# ASF_Codec_List_Object
>0 guid 86D15240-311D-11D0-A3A4-00A0C90348F6
>0 guid 1EFB1A30-0B62-11D0-A39B-00A0C90348F6 ASF_Script_Command_Object
>0 guid F487CD01-A951-11CF-8EE6-00C00C205365 ASF_Marker_Object
>0 guid D6E229DC-35DA-11D1-9034-00A0C90349BE ASF_Bitrate_Mutual_Exclusion_Object
>0 guid 75B22635-668E-11CF-A6D9-00AA0062CE6C ASF_Error_Correction_Object
# ASF_Content_Description_Object
>0 guid 75B22633-668E-11CF-A6D9-00AA0062CE6C
#>>24 leshort title length %d
#>>26 leshort author length %d
#>>28 leshort copyright length %d
#>>30 leshort descriptor length %d
#>>32 leshort rating length %d
>0 guid D2D0A440-E307-11D2-97F0-00A0C95EA850 ASF_Extended_Content_Description_Object
>0 guid 2211B3FA-BD23-11D2-B4B7-00A0C955FC6E ASF_Content_Branding_Object
>0 guid 7BF875CE-468D-11D1-8D82-006097C9A2B2 ASF_Stream_Bitrate_Properties_Object
>0 guid 2211B3FB-BD23-11D2-B4B7-00A0C955FC6E ASF_Content_Encryption_Object
>0 guid 298AE614-2622-4C17-B935-DAE07EE9289C ASF_Extended_Content_Encryption_Object
>0 guid 2211B3FC-BD23-11D2-B4B7-00A0C955FC6E ASF_Digital_Signature_Object
# ASF_Padding_Object
>0 guid 1806D474-CADF-4509-A4BA-9AABCB96AAE8
>0 guid 14E6A5CB-C672-4332-8399-A96952065B5A ASF_Extended_Stream_Properties_Object
>0 guid A08649CF-4775-4670-8A16-6E35357566CD ASF_Advanced_Mutual_Exclusion_Object
>0 guid D1465A40-5A79-4338-B71B-E36B8FD6C249 ASF_Group_Mutual_Exclusion_Object
>0 guid D4FED15B-88D3-454F-81F0-ED5C45999E24 ASF_Stream_Prioritization_Object
>0 guid A69609E6-517B-11D2-B6AF-00C04FD908E9 ASF_Bandwidth_Sharing_Object
>0 guid 7C4346A9-EFE0-4BFC-B229-393EDE415C85 ASF_Language_List_Object
>0 guid C5F8CBEA-5BAF-4877-8467-AA8C44FA4CCA ASF_Metadata_Object
>0 guid 44231C94-9498-49D1-A141-1D134E457054 ASF_Metadata_Library_Object
>0 guid D6E229DF-35DA-11D1-9034-00A0C90349BE ASF_Index_Parameters_Object
>0 guid 6B203BAD-3F11-48E4-ACA8-D7613DE2CFA7 ASF_Media_Object_Index_Parameters_Object
>0 guid F55E496D-9797-4B5D-8C8B-604DFE9BFB24 ASF_Timecode_Index_Parameters_Object
>0 guid 26F18B5D-4584-47EC-9F5F-0E651F0452C9 ASF_Compatibility_Object
>0 guid 43058533-6981-49E6-9B74-AD12CB86D58C ASF_Advanced_Content_Encryption_Object
>0 guid 59DACFC0-59E6-11D0-A3AC-00A0C90348F6 ASF_Command_Media
>0 guid B61BE100-5B4E-11CF-A8FD-00805F5C44 ASF_JFIF_Media
>0 guid 35907DE0-E415-11CF-A917-00805F5C442B ASF_Degradable_JPEG_Media
>0 guid 91BD222C-F21C-497A-8B6D-5AA86BFC0185 ASF_File_Transfer_Media
>0 guid 3AFB65E2-47EF-40F2-AC2C-70A90D71D343 ASF_Binary_Media
>0 guid 776257D4-C627-41CB-8F81-7AC7FF1C40CC ASF_Web_Stream_Media_Subtype
>0 guid DA1E6B13-8359-4050-B398-388E965BF00C ASF_Web_Stream_Format
>0 guid 20FB5700-5B55-11CF-A8FD-00805F5C442B ASF_No_Error_Correction
>0 guid BFC3CD50-618F-11CF-8BB2-00AA00B4E220 ASF_Audio_Spread
>0 guid ABD3D211-A9BA-11cf-8EE6-00C00C205365 ASF_Reserved_1
>0 guid 7A079BB6-DAA4-4e12-A5CA-91D38DC11A8D ASF_Content_Encryption_System_Windows_Media_DRM
# _Network_Devices
>0 guid 86D15241-311D-11D0-A3A4-00A0C90348F6 ASF_Reserved_2
>0 guid 4B1ACBE3-100B-11D0-A39B-00A0C90348F6 ASF_Reserved_3
>0 guid 4CFEDB20-75F6-11CF-9C0F-00A0C90349CB ASF_Reserved_4
>0 guid D6E22A00-35DA-11D1-9034-00A0C90349BE ASF_Mutex_Language
>0 guid D6E22A01-35DA-11D1-9034-00A0C90349BE ASF_Mutex_Bitrate
>0 guid D6E22A02-35DA-11D1-9034-00A0C90349BE ASF_Mutex_Unknown
>0 guid AF6060AA-5197-11D2-B6AF-00C04FD908E9 ASF_Bandwidth_Sharing_Exclusive
>0 guid AF6060AB-5197-11D2-B6AF-00C04FD908E9 ASF_Bandwidth_Sharing_Partial
>0 guid 399595EC-8667-4E2D-8FDB-98814CE76C1E ASF_Payload_Extension_System_Timecode
>0 guid E165EC0E-19ED-45D7-B4A7-25CBD1E28E9B ASF_Payload_Extension_System_File_Name
>0 guid D590DC20-07BC-436C-9CF7-F3BBFBF1A4DC ASF_Payload_Extension_System_Content_Type
>0 guid 1B1EE554-F9EA-4BC8-821A-376B74E4C4B8 ASF_Payload_Extension_System_Pixel_Aspect_Ratio
>0 guid C6BD9450-867F-4907-83A3-C77921B733AD ASF_Payload_Extension_System_Sample_Duration
>0 guid 6698B84E-0AFA-4330-AEB2-1C0A98D7A44D ASF_Payload_Extension_System_Encryption_Sample_ID
>0 guid 00E1AF06-7BEC-11D1-A582-00C04FC29CFB ASF_Payload_Extension_System_Degradable_JPEG
0 name asf-object
>0 use asf-name
#>>16 lequad >0 (size %lld) [
>>16 lequad >0
>>>(16.q) use asf-object
#>>16 lequad 0 ]
# Microsoft Advanced Streaming Format (ASF) <mpruett@sgi.com>
0 guid 75B22630-668E-11CF-A6D9-00AA0062CE6C Microsoft ASF
!:mime video/x-ms-asf
#>16 lequad >0 (size %lld
#>>24 lelong x \b, %d header objects)
>16 lequad >0
>>30 use asf-object
>>(16.q) use asf-object

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: cad,v 1.20 2019/08/10 13:34:17 christos Exp $ # $File: cad,v 1.23 2020/05/30 23:58:07 christos Exp $
# autocad: file(1) magic for cad files # autocad: file(1) magic for cad files
# #
@ -229,7 +229,11 @@
!:mime image/vnd.dwg !:mime image/vnd.dwg
0 string AC1024 DWG AutoDesk AutoCAD 2010/2011/2012 0 string AC1024 DWG AutoDesk AutoCAD 2010/2011/2012
!:mime image/vnd.dwg !:mime image/vnd.dwg
0 string AC1027 DWG AutoDesk AutoCAD 2013/2014 0 string AC1027 DWG AutoDesk AutoCAD 2013-2017
!:mime image/vnd.dwg
# From GNU LibreDWG
0 string AC1032 DWG AutoDesk AutoCAD 2018/2019
!:mime image/vnd.dwg !:mime image/vnd.dwg
# KOMPAS 2D drawing from ASCON # KOMPAS 2D drawing from ASCON
@ -315,3 +319,6 @@
0 string \xff\xfe\xff\x0e\x53\x00\x6b\x00\x65\x00\x74\x00\x63\x00\x68\x00\x55\x00\x70\x00\x20\x00\x4d\x00\x6f\x00\x64\x00\x65\x00\x6c\x00 SketchUp Model 0 string \xff\xfe\xff\x0e\x53\x00\x6b\x00\x65\x00\x74\x00\x63\x00\x68\x00\x55\x00\x70\x00\x20\x00\x4d\x00\x6f\x00\x64\x00\x65\x00\x6c\x00 SketchUp Model
!:mime application/vnd.sketchup.skp !:mime application/vnd.sketchup.skp
!:ext skp !:ext skp
4 regex/b P[0-9][0-9]\\.[0-9][0-9][0-9][0-9]\\.[0-9][0-9][0-9][0-9]\\.[0-9] NAXOS CAD System file from version %s
!:strength +40

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: commands,v 1.61 2019/10/30 03:16:43 christos Exp $ # $File: commands,v 1.63 2020/06/06 15:36:30 christos Exp $
# commands: file(1) magic for various shells and interpreters # commands: file(1) magic for various shells and interpreters
# #
#0 string/w : shell archive or script for antique kernel text #0 string/w : shell archive or script for antique kernel text
@ -84,6 +84,30 @@
0 string/wt #!\ /usr/bin/env\ bash Bourne-Again shell script text executable 0 string/wt #!\ /usr/bin/env\ bash Bourne-Again shell script text executable
!:mime text/x-shellscript !:mime text/x-shellscript
# Fish shell magic
# From: Benjamin Lowry <ben@ben.gmbh>
0 string/wt #!\ /usr/local/bin/fish fish shell script text executable
!:mime text/x-shellscript
0 string/wt #!\ /usr/bin/fish fish shell script text executable
!:mime text/x-shellscript
0 string/wt #!\ /usr/bin/env\ fish fish shell script text executable
!:mime text/x-shellscript
0 search/1/wt #!\ /usr/bin/tclsh Tcl/Tk script text executable
!:mime text/x-tcl
0 search/1/wt #!\ /usr/bin/texlua LuaTex script text executable
!:mime text/x-luatex
0 search/1/wt #!\ /usr/bin/luatex LuaTex script text executable
!:mime text/x-luatex
0 search/1/wt #!\ /usr/bin/stap Systemtap script text executable
!:mime text/x-systemtap
# PHP scripts # PHP scripts
# Ulf Harnhammar <ulfh@update.uu.se> # Ulf Harnhammar <ulfh@update.uu.se>
0 search/1/c =<?php PHP script text 0 search/1/c =<?php PHP script text

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: compress,v 1.77 2019/10/08 20:25:13 christos Exp $ # $File: compress,v 1.79 2020/05/30 23:53:04 christos Exp $
# compress: file(1) magic for pure-compression formats (no archives) # compress: file(1) magic for pure-compression formats (no archives)
# #
# compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc. # compress, gzip, pack, compact, huf, squeeze, crunch, freeze, yabba, etc.
@ -61,7 +61,9 @@
!:mime application/gzip !:mime application/gzip
>>>0 use gzip-info >>>0 use gzip-info
# size of the original (uncompressed) input data modulo 2^32 # size of the original (uncompressed) input data modulo 2^32
>>-0 offset >48
>>>-4 ulelong x \b, original size modulo 2^32 %u >>>-4 ulelong x \b, original size modulo 2^32 %u
>>-0 offset <48 \b, truncated
# gzipped TAR or VirtualBox extension package # gzipped TAR or VirtualBox extension package
#!:mime application/x-compressed-tar #!:mime application/x-compressed-tar
#!:mime application/x-virtualbox-vbox-extpack #!:mime application/x-virtualbox-vbox-extpack
@ -84,7 +86,9 @@
!:ext gz/tgz/tpz/zabw/svgz !:ext gz/tgz/tpz/zabw/svgz
>>0 use gzip-info >>0 use gzip-info
# size of the original (uncompressed) input data modulo 2^32 # size of the original (uncompressed) input data modulo 2^32
>>-4 ulelong x \b, original size modulo 2^32 %u >>-0 offset >48
>>>-4 ulelong x \b, original size modulo 2^32 %u
>>-0 offset <48 \b, truncated
# display information of gzip compressed files # display information of gzip compressed files
0 name gzip-info 0 name gzip-info
#>2 byte x THIS iS GZIP #>2 byte x THIS iS GZIP
@ -392,3 +396,8 @@
0 string bvx1 lzfse compressed, uncompressed tables 0 string bvx1 lzfse compressed, uncompressed tables
0 string bvx2 lzfse compressed, compressed tables 0 string bvx2 lzfse compressed, compressed tables
0 string bvxn lzfse encoded, lzvn compressed 0 string bvxn lzfse encoded, lzvn compressed
# pcxLib.exe compression program
# http://www.shikadi.net/moddingwiki/PCX_Library
0 string/b pcxLib
>0x0A string/b Copyright\020(c)\020Genus\020Microprogramming,\020Inc. pcxLib compressed

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: console,v 1.49 2019/05/27 01:33:32 christos Exp $ # $File: console,v 1.55 2020/04/19 17:30:55 christos Exp $
# Console game magic # Console game magic
# Toby Deshane <hac@shoelace.digivill.net> # Toby Deshane <hac@shoelace.digivill.net>
@ -628,10 +628,12 @@
0 string CON\x20 Microsoft Xbox 360 package (console-signed) 0 string CON\x20 Microsoft Xbox 360 package (console-signed)
>0 use xbox-360-package >0 use xbox-360-package
0 string PIRS Microsoft Xbox 360 package (non-Xbox Live) 0 string PIRS
>0 use xbox-360-package >0 belong 0 Microsoft Xbox 360 package (non-Xbox Live)
0 string LIVE Microsoft Xbox 360 package (Xbox Live) >>0 use xbox-360-package
>0 use xbox-360-package 0 string LIVE
>0x104 belong 0 Microsoft Xbox 360 package (Xbox Live)
>>0 use xbox-360-package
# Atari Lynx cartridge dump (EXE/BLL header) # Atari Lynx cartridge dump (EXE/BLL header)
# From: "Stefan A. Haubenthal" <polluks@web.de> # From: "Stefan A. Haubenthal" <polluks@web.de>
@ -667,6 +669,30 @@
# IPS Patch Files from: From: Thomas Klausner <tk@giga.or.at> # IPS Patch Files from: From: Thomas Klausner <tk@giga.or.at>
# see https://zerosoft.zophar.net/ips.php # see https://zerosoft.zophar.net/ips.php
0 string PATCH IPS patch file 0 string PATCH IPS patch file
!:ext ips
# BPS Patch Files - from: David Korth <gerbilsoft@gerbilsoft.com>
# Reference: https://www.romhacking.net/documents/746/
0 string BPS1 BPS patch file
!:ext bps
# APS Patch Files - from: David Korth <gerbilsoft@gerbilsoft.com>
# Reference: https://github.com/btimofeev/UniPatcher/wiki/APS-(N64)
0 string APS10 APS patch file
!:ext aps
>5 byte 0 \b, simple patch
>5 byte 1 \b, N64-specific patch for
>>58 byte x N%c
>>59 byte x \b%c
>>60 byte x \b%c
>7 byte !0x20
# FIXME: /T specifier isn't working with a fixed-length string.
>>7 string x \b: "%.50s"
# UPS Patch Files - from: David Korth <gerbilsoft@gerbilsoft.com>
# Reference: http://fileformats.archiveteam.org/wiki/UPS_(binary_patch_format)
0 string UPS1 UPS patch file
!:ext ups
# Playstations Patch Files from: From: Thomas Klausner <tk@giga.or.at> # Playstations Patch Files from: From: Thomas Klausner <tk@giga.or.at>
0 string PPF30 Playstation Patch File version 3.0 0 string PPF30 Playstation Patch File version 3.0
@ -767,6 +793,8 @@
>0x07 byte x \b, Rev.%02u) >0x07 byte x \b, Rev.%02u)
>0x18 belong 0x5D1C9EA3 >0x18 belong 0x5D1C9EA3
>>0x60 beshort 0x0101 \b (Unencrypted) >>0x60 beshort 0x0101 \b (Unencrypted)
>0x200 string NKIT \b (NKit compressed)
# Type: Nintendo GameCube disc image # Type: Nintendo GameCube disc image
# From: David Korth <gerbilsoft@gerbilsoft.com> # From: David Korth <gerbilsoft@gerbilsoft.com>
@ -1015,3 +1043,61 @@
>>>>>>0x5B byte 0x02 >>>>>>0x5B byte 0x02
>>>>>>>0x54 belong x Nintendo amiibo NFC dump - amiibo ID: %08X- >>>>>>>0x54 belong x Nintendo amiibo NFC dump - amiibo ID: %08X-
>>>>>>>0x58 belong x \b%08X >>>>>>>0x58 belong x \b%08X
#------------------------------------------------------------------------------
# Type: Nintendo Switch XCI (Game Cartridge Image)
# From: Benjamin Lowry <ben@ben.gmbh>
# Reference: https://switchbrew.org/wiki/Gamecard_Format
0x100 string HEAD
>0x10D byte 0xFA Nintendo Switch cartridge image (XCI), 1GB
>0x10D byte 0xF8 Nintendo Switch cartridge image (XCI), 2GB
>0x10D byte 0xF0 Nintendo Switch cartridge image (XCI), 4GB
>0x10D byte 0xE0 Nintendo Switch cartridge image (XCI), 8GB
>0x10D byte 0xE1 Nintendo Switch cartridge image (XCI), 16GB
>0x10D byte 0xE2 Nintendo Switch cartridge image (XCI), 32GB
#------------------------------------------------------------------------------
# Type: Nintendo Switch Executable
# From: Benjamin Lowry <ben@ben.gmbh>
# Reference: https://switchbrew.org/wiki/NSO
0x00 string NSO0 Nintendo Switch executable (NSO)
#------------------------------------------------------------------------------
# Type: Nintendo Switch PFS0
# From: Benjamin Lowry <ben@ben.gmbh>
# Reference: https://switchbrew.org/wiki/NCA_Format#PFS0
0x00 string PFS0 Nintendo Switch partition filesystem (PFS0)
>0x04 ulelong x \b, %d files
#------------------------------------------------------------------------------
# amiibo: file(1) magic for Nintendo Badge Arcade files.
# From: David Korth <gerbilsoft@gerbilsoft.com>
# References:
# - https://github.com/GerbilSoft/rom-properties/issues/92
# - https://github.com/CaitSith2/BadgeArcadeTool
# - https://github.com/TheMachinumps/Advanced-badge-editor
# PRBS: Individual badge and/or mega badge.
0 string PRBS
>0x44 byte >0x20 Nintendo Badge Arcade
>>0xB8 ulelong <2
>>>0xBC ulelong <2 badge:
>>>0xBC ulelong >1 Mega Badge
>>>>0xB8 ulelong x (%ux
>>>>0xBC ulelong x \b%u):
>>0xB8 ulelong >1 Mega Badge
>>>0xB8 ulelong x (%ux
>>>0xBC ulelong x \b%u):
>0x44 string x "%s"
>0x3C ulelong x \b, badge ID: %u
>0x74 byte >0x20
>>0x74 string x \b, set: "%s"
>0xA8 ulelong !0xFFFFFFFF
>>0xA8 ulelong x \b, launch title ID: %08X
>>0xA4 ulelong x \b-%08X
# CABS: Badge set.
0 string CABS
>0x2C byte >0x20 Nintendo Badge Arcade badge set:
>>0x2C string x "%.48s"
>>0x24 ulelong x \b, set ID: %u

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: database,v 1.56 2019/06/14 20:12:00 christos Exp $ # $File: database,v 1.59 2020/03/25 01:49:58 christos Exp $
# database: file(1) magic for various databases # database: file(1) magic for various databases
# #
# extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk) # extracted from header/code files by Graeme Wilford (eep2gw@ee.surrey.ac.uk)
@ -359,16 +359,22 @@
>>>>>>>>>>>>0 use foxpro-memo-print >>>>>>>>>>>>0 use foxpro-memo-print
# dBASE III DBT , garbage # dBASE III DBT , garbage
# skip WORD1XW.DOC with improbably high free block index # skip WORD1XW.DOC with improbably high free block index
>>>>>>>>>0 lelong <2205083 >>>>>>>>>0 ulelong <0x400000
# skip WinStore.App.exe by looking for printable 2nd character of 1st memo item
>>>>>>>>>>513 ubyte >037
# unusual dBASE III DBT like adressen.dbt # unusual dBASE III DBT like adressen.dbt
>>>>>>>>>>0 use dbase3-memo-print >>>>>>>>>>>0 use dbase3-memo-print
# dBASE III DBT like angest.dbt, or garbage PCX DBF # dBASE III DBT like angest.dbt, or garbage PCX DBF
>>>>>>>>8 ubelong !0 >>>>>>>>8 ubelong !0
# skip PCX and some DBF by test for for reserved NULL bytes # skip PCX and some DBF by test for for reserved NULL bytes
>>>>>>>>>510 ubeshort 0 >>>>>>>>>510 ubeshort 0
# skip AI070GEP.EPS with improbably high free block index # skip bad symples with improbably high free block index above 2 GiB file limit
>>>>>>>>>>0 lelong <458766 >>>>>>>>>>0 ulelong <0x400000
>>>>>>>>>>>0 use dbase3-memo-print # skip AI070GEP.EPS by printable 1st character of 1st memo item
>>>>>>>>>>>512 ubyte >037
# skip gluon-ffhat-1.0-tp-link-tl-wr1043n-nd-v2-sysupgrade.bin by printable 2nd character
>>>>>>>>>>>>513 ubyte >037
>>>>>>>>>>>>>0 use dbase3-memo-print
# dBASE IV DBT with positive block size # dBASE IV DBT with positive block size
>>>>>>>20 uleshort >0 >>>>>>>20 uleshort >0
# dBASE IV DBT with valid block length like 512, 1024 # dBASE IV DBT with valid block length like 512, 1024
@ -490,9 +496,9 @@
#>>52 ulelong 3 \b, CleanShutdown #>>52 ulelong 3 \b, CleanShutdown
>>52 ulelong 4 \b, BeingConverted >>52 ulelong 4 \b, BeingConverted
>>52 ulelong 5 \b, ForceDetach >>52 ulelong 5 \b, ForceDetach
# Windows NT major version when the databases indexes were updated. # Windows NT major version when the databases indexes were updated.
>>216 ulelong x \b, Windows version %d >>216 ulelong x \b, Windows version %d
# Windows NT minor version # Windows NT minor version
>>220 ulelong x \b.%d >>220 ulelong x \b.%d
# From: Joerg Jenderek # From: Joerg Jenderek
@ -645,3 +651,14 @@
# From: David Korth <gerbilsoft@gerbilsoft.com> # From: David Korth <gerbilsoft@gerbilsoft.com>
0 string //\ <!--\ <mdb:mork:z\ v=" Mozilla Mork database 0 string //\ <!--\ <mdb:mork:z\ v=" Mozilla Mork database
>23 string x \b, version %.3s >23 string x \b, version %.3s
# URL: https://en.wikipedia.org/wiki/Management_Information_Format
# Reference: https://www.dmtf.org/sites/default/files/standards/documents/DSP0005.pdf
# From: Joerg Jenderek
# Note: only tested with monitor asset reports of Dell Display Manager
# skip start like Language=fr|CA|iso8859-1
0 search/27/C Start\040Component DMI Management Information Format
#!:mime text/plain
!:mime text/x-dmtf-mif
!:ext mif

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: der,v 1.2 2017/03/17 21:35:28 christos Exp $ # $File: der,v 1.3 2020/02/16 20:45:21 christos Exp $
# der: file(1) magic for DER encoded files # der: file(1) magic for DER encoded files
# #
@ -114,3 +114,25 @@
>>>&0 der utc_time=x \b, utcTime=%s >>>&0 der utc_time=x \b, utcTime=%s
>>>&0 der utc_time=x \b, utcTime=%s >>>&0 der utc_time=x \b, utcTime=%s
>>&0 use certinfo >>&0 use certinfo
0 der seq
>&0 der seq
>>&0 der eoc Certificate
>>>&0 der int1=02 \b, Version=3
>>&0 der int9=x \b, Serial=%s
>>&0 der seq
>>>&0 der obj_id9=2a864886f70d01010b
>>>&0 der null
>>&0 der seq
>>>&0 der set
>>>>&0 der seq
>>>>>&0 der obj_id3=550403
>>>>>&0 der utf8_str=x \b, Issuer=%s
>>&0 der seq
>>>&0 der utc_time=x \b, not-valid-before=%s
>>>&0 der utc_time=x \b, not-valid-after=%s
>>&0 der seq
>>>&0 der set
>>>>&0 der seq
>>>>>&0 der obj_id3=550403
>>>>>&0 der utf8_str=x \b, Subject=%s

View File

@ -0,0 +1,33 @@
#------------------------------------------------------------------------------
# $File: dif,v 1.1 2020/04/09 19:14:01 christos Exp $
# dif: file(1) magic for DIF text files
#------------------------------------------------------------------------------
# From: Joerg Jenderek
# URL: http://en.wikipedia.org/wiki/Data_Interchange_Format
# http://fileformats.archiveteam.org/wiki/Data_Interchange_Format
# Note: called by TrID "Data Interchange Format",
# by DROID x-fmt/368 "VisiCalc Database"
0 string TABLE
# skip text starting with TABLE by looking for numeric version on 2nd line
>6 search/2 0,
# skip DROID x-fmt-41-signature-id-380.dif by looking for key word TUPLES at the beginning
>>27 search/128 TUPLES Data Interchange Format
# https://www.pcmatic.com/company/libraries/fileextension/detail.asp?ext=dif.html
#!:mime application/x-dif-spreadsheet Gnumeric
# https://github.com/LibreOffice/online/blob/master/discovery.xml
#!:mime application/x-dif-document LibreOffice
# https://www.wikidata.org/wiki/Wikidata:WikiProject_Informatics/File_formats/Lists/File_formats
!:mime application/x-dif
# https://extension.nirsoft.net/dif
#!:mime application/vnd.ms-excel
#!:mime text/plain
!:ext dif
# look for double quote 0x22 on 3rd line
>>>10 search/3 "
# skip if next character also double quote
>>>>&0 ubyte !0x22 \b, generator or table name
# comment like EXCEL, pwm enclosed in double quotes
>>>>>&-2 string x %s

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: elf,v 1.79 2019/12/16 04:24:01 christos Exp $ # $File: elf,v 1.80 2020/02/12 22:17:33 christos Exp $
# elf: file(1) magic for ELF executables # elf: file(1) magic for ELF executables
# #
# We have to check the byte order flag to see what byte order all the # We have to check the byte order flag to see what byte order all the
@ -50,8 +50,9 @@
!:mime application/x-object !:mime application/x-object
>16 leshort 2 executable, >16 leshort 2 executable,
!:mime application/x-executable !:mime application/x-executable
>16 leshort 3 shared object, >16 leshort 3 ${x?pie executable:shared object},
!:mime application/x-sharedlib
!:mime application/x-${x?pie-executable:sharedlib}
>16 leshort 4 core file, >16 leshort 4 core file,
!:mime application/x-coredump !:mime application/x-coredump
# OS-specific # OS-specific

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: filesystems,v 1.131 2019/11/15 23:49:38 christos Exp $ # $File: filesystems,v 1.133 2020/05/17 19:32:00 christos Exp $
# filesystems: file(1) magic for different filesystems # filesystems: file(1) magic for different filesystems
# #
0 name partid 0 name partid
@ -1994,7 +1994,7 @@
# to display CD-ROM (70=81-11) after MBR (113=40+72+1), partition-table (71=50+21) and before Apple Driver Map (51) # 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 #!: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) # to display CD-ROM (114=81+33) before MBR (113=40+72+1), partition-table (71=50+21) and Apple Driver Map (51)
!:strength +34 !:strength +35
>0 use cdrom >0 use cdrom
# URL: https://en.wikipedia.org/wiki/NRG_(file_format) # URL: https://en.wikipedia.org/wiki/NRG_(file_format)
@ -2182,7 +2182,7 @@
>0 use squashfs >0 use squashfs
0 string hsqs Squashfs filesystem, little endian, 0 string hsqs Squashfs filesystem, little endian,
>0 use ^squashfs >0 use \^squashfs
# AFS Dump Magic # AFS Dump Magic
# From: Ty Sarna <tsarna@sarna.org> # From: Ty Sarna <tsarna@sarna.org>

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: games,v 1.18 2019/11/10 19:19:58 christos Exp $ # $File: games,v 1.20 2020/02/01 16:32:33 christos Exp $
# games: file(1) for games # games: file(1) for games
# Fabio Bonelli <fabiobonelli@libero.it> # Fabio Bonelli <fabiobonelli@libero.it>
@ -303,3 +303,13 @@
0 string ESVG 0 string ESVG
>4 lelong 0x00160000 >4 lelong 0x00160000
>10 string TOC\020 Empire Deluxe for DOS saved game >10 string TOC\020 Empire Deluxe for DOS saved game
# Sid Meier's Civilization V/VI
# From: Benjamin Lowry <ben@ben.gmbh>
0 string CIV5
>4 byte 0x08 Sid Meier's Civilization V saved game,
>>12 regex [0-9a-z.]+ saved by game version %s
>4 byte 0x01 Sid Meier's Civilization V replay data,
>>12 regex [0-9a-z.]+ saved by game version %s
0 string CIV6 Sid Meier's Civilization VI saved game

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: gnu,v 1.21 2019/04/19 00:42:27 christos Exp $ # $File: gnu,v 1.22 2020/04/09 19:11:58 christos Exp $
# gnu: file(1) magic for various GNU tools # gnu: file(1) magic for various GNU tools
# #
# GNU nlsutils message catalog file format # GNU nlsutils message catalog file format
@ -158,11 +158,6 @@
>>>20 bedate x \b, last-maintained %s >>>20 bedate x \b, last-maintained %s
# Gnumeric spreadsheet
# This entry is only semi-helpful, as Gnumeric compresses its files, so
# they will ordinarily reported as "compressed", but at least -z helps
39 string =<gmr:Workbook Gnumeric spreadsheet
# From: James Youngman <jay@gnu.org> # From: James Youngman <jay@gnu.org>
# gnu find magic # gnu find magic
0 string \0LOCATE GNU findutils locate database data 0 string \0LOCATE GNU findutils locate database data

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: images,v 1.171 2019/11/23 16:19:47 christos Exp $ # $File: images,v 1.181 2020/05/30 23:49:03 christos Exp $
# images: file(1) magic for image formats (see also "iff", and "c-lang" for # images: file(1) magic for image formats (see also "iff", and "c-lang" for
# XPM bitmaps) # XPM bitmaps)
# #
@ -27,6 +27,8 @@
# and Image Type 1 2 3 9 10 11 32 33 # and Image Type 1 2 3 9 10 11 32 33
# and Color Map Entry Size 0 15 16 24 32 # and Color Map Entry Size 0 15 16 24 32
0 ubequad&0x00FeC400000000C0 0 0 ubequad&0x00FeC400000000C0 0
# Conflict with MPEG sequences.
!:strength -40
# Prevent conflicts with CRI ADX. # Prevent conflicts with CRI ADX.
>(2.S-2) belong !0x28632943 >(2.S-2) belong !0x28632943
# skip more garbage like *.iso by looking for positive image type # skip more garbage like *.iso by looking for positive image type
@ -523,6 +525,17 @@
# ImageMagick-7.0.9-2/Magick++/demo/smile_anim.miff # ImageMagick-7.0.9-2/Magick++/demo/smile_anim.miff
>>>0 ubyte !0x7b >>>0 ubyte !0x7b
>>>>0 string >\0 '%-.14s' >>>>0 string >\0 '%-.14s'
# URL: https://imagemagick.org/
# Reference: https://imagemagick.org/script/magick-vector-graphics.php
# From: Joerg Jenderek
# Note: all white-spaces between commands are ignored
0 string push
# skip some white spaces
>5 search/3 graphic-context ImageMagick Vector Graphic
# TODO: look for dangerous commands like CVE-2016-3715
#!:mime text/plain
!:mime image/x-mvg
!:ext mvg
# Artisan # Artisan
0 long 1123028772 Artisan image data 0 long 1123028772 Artisan image data
@ -1372,6 +1385,8 @@
# From: Tom Hilinski <tom.hilinski@comcast.net> # From: Tom Hilinski <tom.hilinski@comcast.net>
# https://www.unidata.ucar.edu/packages/netcdf/ # https://www.unidata.ucar.edu/packages/netcdf/
0 string CDF\001 NetCDF Data Format data 0 string CDF\001 NetCDF Data Format data
# 64-bit offset netcdf Classic https://www.unidata.ucar.edu/software/netcdf/docs/file_format_specifications
0 string CDF\002 NetCDF Data Format data (64-bit offset)
#----------------------------------------------------------------------- #-----------------------------------------------------------------------
# Hierarchical Data Format, used to facilitate scientific data exchange # Hierarchical Data Format, used to facilitate scientific data exchange
@ -1882,8 +1897,7 @@
# Type: Khronos KTX texture. # Type: Khronos KTX texture.
# From: David Korth <gerbilsoft@gerbilsoft.com> # From: David Korth <gerbilsoft@gerbilsoft.com>
# References: # Reference: https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
# - https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/
# glEnum decoding. # glEnum decoding.
# NOTE: Only the most common formats are listed here. # NOTE: Only the most common formats are listed here.
@ -1900,6 +1914,10 @@
>0 lelong 0x83A3 \b, RGBA4_S3TC >0 lelong 0x83A3 \b, RGBA4_S3TC
>0 lelong 0x83A4 \b, RGBA_DXT5_S3TC >0 lelong 0x83A4 \b, RGBA_DXT5_S3TC
>0 lelong 0x83A5 \b, RGBA4_DXT5_S3TC >0 lelong 0x83A5 \b, RGBA4_DXT5_S3TC
>0 lelong 0x83F0 \b, COMPRESSED_RGB_S3TC_DXT1_EXT
>0 lelong 0x83F1 \b, COMPRESSED_RGBA_S3TC_DXT1_EXT
>0 lelong 0x83F2 \b, COMPRESSED_RGBA_S3TC_DXT3_EXT
>0 lelong 0x83F3 \b, COMPRESSED_RGBA_S3TC_DXT5_EXT
>0 lelong 0x8D64 \b, ETC1_RGB8_OES >0 lelong 0x8D64 \b, ETC1_RGB8_OES
>0 lelong 0x9270 \b, COMPRESSED_R11_EAC >0 lelong 0x9270 \b, COMPRESSED_R11_EAC
>0 lelong 0x9271 \b, COMPRESSED_SIGNED_R11_EAC >0 lelong 0x9271 \b, COMPRESSED_SIGNED_R11_EAC
@ -1959,6 +1977,281 @@
>12 belong 0x04030201 (big-endian) >12 belong 0x04030201 (big-endian)
>>16 use \^khronos-ktx-endian-header >>16 use \^khronos-ktx-endian-header
# Type: Khronos KTX2 texture.
# From: David Korth <gerbilsoft@gerbilsoft.com>
# Based on draft19.
# Reference: http://github.khronos.org/KTX-Specification/
# Supercompression enum.
0 name khronos-ktx2-supercompression
>0 lelong 1 Basis Universal
>0 lelong 2 Zstandard
# Vulkan format identifier.
# NOTE: Formats prohibited from KTX2 are commented out.
0 name khronos-ktx2-vkFormat
>0 lelong 0 UNDEFINED
>0 lelong 1 R4G4_UNORM_PACK8
>0 lelong 2 R4G4B4A4_UNORM_PACK16
>0 lelong 3 B4G4R4A4_UNORM_PACK16
>0 lelong 4 R5G6B5_UNORM_PACK16
>0 lelong 5 B5G6R5_UNORM_PACK16
>0 lelong 6 R5G5B5A1_UNORM_PACK16
>0 lelong 7 B5G5R5A1_UNORM_PACK16
>0 lelong 8 A1R5G5B5_UNORM_PACK16
>0 lelong 9 R8_UNORM
>0 lelong 10 R8_SNORM
#>0 lelong 11 R8_USCALED
#>0 lelong 12 R8_SSCALED
>0 lelong 13 R8_UINT
>0 lelong 14 R8_SINT
>0 lelong 15 R8_SRGB
>0 lelong 16 R8G8_UNORM
>0 lelong 17 R8G8_SNORM
#>0 lelong 18 R8G8_USCALED
#>0 lelong 19 R8G8_SSCALED
>0 lelong 20 R8G8_UINT
>0 lelong 21 R8G8_SINT
>0 lelong 22 R8G8_SRGB
>0 lelong 23 R8G8B8_UNORM
>0 lelong 24 R8G8B8_SNORM
#>0 lelong 25 R8G8B8_USCALED
#>0 lelong 26 R8G8B8_SSCALED
>0 lelong 27 R8G8B8_UINT
>0 lelong 28 R8G8B8_SINT
>0 lelong 29 R8G8B8_SRGB
>0 lelong 30 B8G8R8_UNORM
>0 lelong 31 B8G8R8_SNORM
#>0 lelong 32 B8G8R8_USCALED
#>0 lelong 33 B8G8R8_SSCALED
>0 lelong 34 B8G8R8_UINT
>0 lelong 35 B8G8R8_SINT
>0 lelong 36 B8G8R8_SRGB
>0 lelong 37 R8G8B8A8_UNORM
>0 lelong 38 R8G8B8A8_SNORM
#>0 lelong 39 R8G8B8A8_USCALED
#>0 lelong 40 R8G8B8A8_SSCALED
>0 lelong 41 R8G8B8A8_UINT
>0 lelong 42 R8G8B8A8_SINT
>0 lelong 43 R8G8B8A8_SRGB
>0 lelong 44 B8G8R8A8_UNORM
>0 lelong 45 B8G8R8A8_SNORM
#>0 lelong 46 B8G8R8A8_USCALED
#>0 lelong 47 B8G8R8A8_SSCALED
>0 lelong 48 B8G8R8A8_UINT
>0 lelong 49 B8G8R8A8_SINT
>0 lelong 50 B8G8R8A8_SRGB
#>0 lelong 51 A8B8G8R8_UNORM_PACK32
#>0 lelong 52 A8B8G8R8_SNORM_PACK32
#>0 lelong 53 A8B8G8R8_USCALED_PACK32
#>0 lelong 54 A8B8G8R8_SSCALED_PACK32
#>0 lelong 55 A8B8G8R8_UINT_PACK32
#>0 lelong 56 A8B8G8R8_SINT_PACK32
#>0 lelong 57 A8B8G8R8_SRGB_PACK32
>0 lelong 58 A2R10G10B10_UNORM_PACK32
>0 lelong 59 A2R10G10B10_SNORM_PACK32
#>0 lelong 60 A2R10G10B10_USCALED_PACK32
#>0 lelong 61 A2R10G10B10_SSCALED_PACK32
>0 lelong 62 A2R10G10B10_UINT_PACK32
>0 lelong 63 A2R10G10B10_SINT_PACK32
>0 lelong 64 A2B10G10R10_UNORM_PACK32
>0 lelong 65 A2B10G10R10_SNORM_PACK32
#>0 lelong 66 A2B10G10R10_USCALED_PACK32
#>0 lelong 67 A2B10G10R10_SSCALED_PACK32
>0 lelong 68 A2B10G10R10_UINT_PACK32
>0 lelong 69 A2B10G10R10_SINT_PACK32
>0 lelong 70 R16_UNORM
>0 lelong 71 R16_SNORM
#>0 lelong 72 R16_USCALED
#>0 lelong 73 R16_SSCALED
>0 lelong 74 R16_UINT
>0 lelong 75 R16_SINT
>0 lelong 76 R16_SFLOAT
>0 lelong 77 R16G16_UNORM
>0 lelong 78 R16G16_SNORM
#>0 lelong 79 R16G16_USCALED
#>0 lelong 80 R16G16_SSCALED
>0 lelong 81 R16G16_UINT
>0 lelong 82 R16G16_SINT
>0 lelong 83 R16G16_SFLOAT
>0 lelong 84 R16G16B16_UNORM
>0 lelong 85 R16G16B16_SNORM
#>0 lelong 86 R16G16B16_USCALED
#>0 lelong 87 R16G16B16_SSCALED
>0 lelong 88 R16G16B16_UINT
>0 lelong 89 R16G16B16_SINT
>0 lelong 90 R16G16B16_SFLOAT
>0 lelong 91 R16G16B16A16_UNORM
>0 lelong 92 R16G16B16A16_SNORM
#>0 lelong 93 R16G16B16A16_USCALED
#>0 lelong 94 R16G16B16A16_SSCALED
>0 lelong 95 R16G16B16A16_UINT
>0 lelong 96 R16G16B16A16_SINT
>0 lelong 97 R16G16B16A16_SFLOAT
>0 lelong 98 R32_UINT
>0 lelong 99 R32_SINT
>0 lelong 100 R32_SFLOAT
>0 lelong 101 R32G32_UINT
>0 lelong 102 R32G32_SINT
>0 lelong 103 R32G32_SFLOAT
>0 lelong 104 R32G32B32_UINT
>0 lelong 105 R32G32B32_SINT
>0 lelong 106 R32G32B32_SFLOAT
>0 lelong 107 R32G32B32A32_UINT
>0 lelong 108 R32G32B32A32_SINT
>0 lelong 109 R32G32B32A32_SFLOAT
>0 lelong 110 R64_UINT
>0 lelong 111 R64_SINT
>0 lelong 112 R64_SFLOAT
>0 lelong 113 R64G64_UINT
>0 lelong 114 R64G64_SINT
>0 lelong 115 R64G64_SFLOAT
>0 lelong 116 R64G64B64_UINT
>0 lelong 117 R64G64B64_SINT
>0 lelong 118 R64G64B64_SFLOAT
>0 lelong 119 R64G64B64A64_UINT
>0 lelong 120 R64G64B64A64_SINT
>0 lelong 121 R64G64B64A64_SFLOAT
>0 lelong 122 B10G11R11_UFLOAT_PACK32
>0 lelong 123 E5B9G9R9_UFLOAT_PACK32
>0 lelong 124 D16_UNORM
>0 lelong 125 X8_D24_UNORM_PACK32
>0 lelong 126 D32_SFLOAT
>0 lelong 127 S8_UINT
>0 lelong 128 D16_UNORM_S8_UINT
>0 lelong 129 D24_UNORM_S8_UINT
>0 lelong 130 D32_SFLOAT_S8_UINT
>0 lelong 131 BC1_RGB_UNORM_BLOCK
>0 lelong 132 BC1_RGB_SRGB_BLOCK
>0 lelong 133 BC1_RGBA_UNORM_BLOCK
>0 lelong 134 BC1_RGBA_SRGB_BLOCK
>0 lelong 135 BC2_UNORM_BLOCK
>0 lelong 136 BC2_SRGB_BLOCK
>0 lelong 137 BC3_UNORM_BLOCK
>0 lelong 138 BC3_SRGB_BLOCK
>0 lelong 139 BC4_UNORM_BLOCK
>0 lelong 140 BC4_SNORM_BLOCK
>0 lelong 141 BC5_UNORM_BLOCK
>0 lelong 142 BC5_SNORM_BLOCK
>0 lelong 143 BC6H_UFLOAT_BLOCK
>0 lelong 144 BC6H_SFLOAT_BLOCK
>0 lelong 145 BC7_UNORM_BLOCK
>0 lelong 146 BC7_SRGB_BLOCK
>0 lelong 147 ETC2_R8G8B8_UNORM_BLOCK
>0 lelong 148 ETC2_R8G8B8_SRGB_BLOCK
>0 lelong 149 ETC2_R8G8B8A1_UNORM_BLOCK
>0 lelong 150 ETC2_R8G8B8A1_SRGB_BLOCK
>0 lelong 151 ETC2_R8G8B8A8_UNORM_BLOCK
>0 lelong 152 ETC2_R8G8B8A8_SRGB_BLOCK
>0 lelong 153 EAC_R11_UNORM_BLOCK
>0 lelong 154 EAC_R11_SNORM_BLOCK
>0 lelong 155 EAC_R11G11_UNORM_BLOCK
>0 lelong 156 EAC_R11G11_SNORM_BLOCK
>0 lelong 157 ASTC_4x4_UNORM_BLOCK
>0 lelong 158 ASTC_4x4_SRGB_BLOCK
>0 lelong 159 ASTC_5x4_UNORM_BLOCK
>0 lelong 160 ASTC_5x4_SRGB_BLOCK
>0 lelong 161 ASTC_5x5_UNORM_BLOCK
>0 lelong 162 ASTC_5x5_SRGB_BLOCK
>0 lelong 163 ASTC_6x5_UNORM_BLOCK
>0 lelong 164 ASTC_6x5_SRGB_BLOCK
>0 lelong 165 ASTC_6x6_UNORM_BLOCK
>0 lelong 166 ASTC_6x6_SRGB_BLOCK
>0 lelong 167 ASTC_8x5_UNORM_BLOCK
>0 lelong 168 ASTC_8x5_SRGB_BLOCK
>0 lelong 169 ASTC_8x6_UNORM_BLOCK
>0 lelong 170 ASTC_8x6_SRGB_BLOCK
>0 lelong 171 ASTC_8x8_UNORM_BLOCK
>0 lelong 172 ASTC_8x8_SRGB_BLOCK
>0 lelong 173 ASTC_10x5_UNORM_BLOCK
>0 lelong 174 ASTC_10x5_SRGB_BLOCK
>0 lelong 175 ASTC_10x6_UNORM_BLOCK
>0 lelong 176 ASTC_10x6_SRGB_BLOCK
>0 lelong 177 ASTC_10x8_UNORM_BLOCK
>0 lelong 178 ASTC_10x8_SRGB_BLOCK
>0 lelong 179 ASTC_10x10_UNORM_BLOCK
>0 lelong 180 ASTC_10x10_SRGB_BLOCK
>0 lelong 181 ASTC_12x10_UNORM_BLOCK
>0 lelong 182 ASTC_12x10_SRGB_BLOCK
>0 lelong 183 ASTC_12x12_UNORM_BLOCK
>0 lelong 184 ASTC_12x12_SRGB_BLOCK
>0 lelong 1000156000 G8B8G8R8_422_UNORM
>0 lelong 1000156001 B8G8R8G8_422_UNORM
>0 lelong 1000156002 G8_B8_R8_3PLANE_420_UNORM
>0 lelong 1000156003 G8_B8R8_2PLANE_420_UNORM
>0 lelong 1000156004 G8_B8_R8_3PLANE_422_UNORM
>0 lelong 1000156005 G8_B8R8_2PLANE_422_UNORM
>0 lelong 1000156006 G8_B8_R8_3PLANE_444_UNORM
>0 lelong 1000156007 R10X6_UNORM_PACK16
>0 lelong 1000156008 R10X6G10X6_UNORM_2PACK16
>0 lelong 1000156009 R10X6G10X6B10X6A10X6_UNORM_4PACK16
>0 lelong 1000156010 G10X6B10X6G10X6R10X6_422_UNORM_4PACK16
>0 lelong 1000156011 B10X6G10X6R10X6G10X6_422_UNORM_4PACK16
>0 lelong 1000156012 G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16
>0 lelong 1000156013 G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16
>0 lelong 1000156014 G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16
>0 lelong 1000156015 G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16
>0 lelong 1000156016 G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16
>0 lelong 1000156017 R12X4_UNORM_PACK16
>0 lelong 1000156018 R12X4G12X4_UNORM_2PACK16
>0 lelong 1000156019 R12X4G12X4B12X4A12X4_UNORM_4PACK16
>0 lelong 1000156020 G12X4B12X4G12X4R12X4_422_UNORM_4PACK16
>0 lelong 1000156021 B12X4G12X4R12X4G12X4_422_UNORM_4PACK16
>0 lelong 1000156022 G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16
>0 lelong 1000156023 G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16
>0 lelong 1000156024 G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16
>0 lelong 1000156025 G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16
>0 lelong 1000156026 G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16
>0 lelong 1000156027 G16B16G16R16_422_UNORM
>0 lelong 1000156028 B16G16R16G16_422_UNORM
>0 lelong 1000156029 G16_B16_R16_3PLANE_420_UNORM
>0 lelong 1000156030 G16_B16R16_2PLANE_420_UNORM
>0 lelong 1000156031 G16_B16_R16_3PLANE_422_UNORM
>0 lelong 1000156032 G16_B16R16_2PLANE_422_UNORM
>0 lelong 1000156033 G16_B16_R16_3PLANE_444_UNORM
>0 lelong 1000054000 PVRTC1_2BPP_UNORM_BLOCK_IMG
>0 lelong 1000054001 PVRTC1_4BPP_UNORM_BLOCK_IMG
>0 lelong 1000054002 PVRTC2_2BPP_UNORM_BLOCK_IMG
>0 lelong 1000054003 PVRTC2_4BPP_UNORM_BLOCK_IMG
>0 lelong 1000054004 PVRTC1_2BPP_SRGB_BLOCK_IMG
>0 lelong 1000054005 PVRTC1_4BPP_SRGB_BLOCK_IMG
>0 lelong 1000054006 PVRTC2_2BPP_SRGB_BLOCK_IMG
>0 lelong 1000054007 PVRTC2_4BPP_SRGB_BLOCK_IMG
>0 lelong 1000066000 ASTC_4x4_SFLOAT_BLOCK_EXT
>0 lelong 1000066001 ASTC_5x4_SFLOAT_BLOCK_EXT
>0 lelong 1000066002 ASTC_5x5_SFLOAT_BLOCK_EXT
>0 lelong 1000066003 ASTC_6x5_SFLOAT_BLOCK_EXT
>0 lelong 1000066004 ASTC_6x6_SFLOAT_BLOCK_EXT
>0 lelong 1000066005 ASTC_8x5_SFLOAT_BLOCK_EXT
>0 lelong 1000066006 ASTC_8x6_SFLOAT_BLOCK_EXT
>0 lelong 1000066007 ASTC_8x8_SFLOAT_BLOCK_EXT
>0 lelong 1000066008 ASTC_10x5_SFLOAT_BLOCK_EXT
>0 lelong 1000066009 ASTC_10x6_SFLOAT_BLOCK_EXT
>0 lelong 1000066010 ASTC_10x8_SFLOAT_BLOCK_EXT
>0 lelong 1000066011 ASTC_10x10_SFLOAT_BLOCK_EXT
>0 lelong 1000066012 ASTC_12x10_SFLOAT_BLOCK_EXT
>0 lelong 1000066013 ASTC_12x12_SFLOAT_BLOCK_EXT
# Main KTX2 header.
0 string \xABKTX\ 20\xBB\r\n\x1A\n Khronos KTX2 texture
>20 lelong x \b, %u
>24 lelong >1 x %u
>28 lelong >1 x %u
>32 lelong >1 \b, %u layers
>36 lelong >1 \b, %u faces
>40 lelong >1 \b, %u mipmaps
>44 lelong >0 \b,
>>44 use khronos-ktx2-supercompression
>12 lelong >0 \b,
>>12 use khronos-ktx2-vkFormat
# Type: Valve VTF texture. # Type: Valve VTF texture.
# From: David Korth <gerbilsoft@gerbilsoft.com> # From: David Korth <gerbilsoft@gerbilsoft.com>
# References: # References:
@ -2076,73 +2369,96 @@
# PVR3 pixel formats. # PVR3 pixel formats.
0 name pvr3-pixel-format 0 name pvr3-pixel-format
>4 ulelong 0 >0 ulelong 0 PVRTC 2bpp RGB
>>0 ulelong 0 PVRTC 2bpp RGB >0 ulelong 1 PVRTC 2bpp RGBA
>>0 ulelong 1 PVRTC 2bpp RGBA >0 ulelong 2 PVRTC 4bpp RGB
>>0 ulelong 2 PVRTC 4bpp RGB >0 ulelong 3 PVRTC 4bpp RGBA
>>0 ulelong 3 PVRTC 4bpp RGBA >0 ulelong 4 PVRTC-II 2bpp
>>0 ulelong 4 PVRTC-II 2bpp >0 ulelong 5 PVRTC-II 4bpp
>>0 ulelong 5 PVRTC-II 4bpp >0 ulelong 6 ETC1
>>0 ulelong 6 ETC1 >0 ulelong 7 DXT1
>>0 ulelong 7 DXT1 >0 ulelong 8 DXT2
>>0 ulelong 8 DXT2 >0 ulelong 9 DXT3
>>0 ulelong 9 DXT3 >0 ulelong 10 DXT4
>>0 ulelong 10 DXT4 >0 ulelong 11 DXT5
>>0 ulelong 11 DXT5 >0 ulelong 12 BC4
>>0 ulelong 12 BC4 >0 ulelong 13 BC5
>>0 ulelong 13 BC5 >0 ulelong 14 BC6
>>0 ulelong 14 BC6 >0 ulelong 15 BC7
>>0 ulelong 15 BC7 >0 ulelong 16 UYVY
>>0 ulelong 16 UYVY >0 ulelong 17 YUY2
>>0 ulelong 17 YUY2 >0 ulelong 18 BW1bpp
>>0 ulelong 18 BW1bpp >0 ulelong 19 R9G9B9E5 Shared Exponent
>>0 ulelong 19 R9G9B9E5 Shared Exponent >0 ulelong 20 RGBG8888
>>0 ulelong 20 RGBG8888 >0 ulelong 21 GRGB8888
>>0 ulelong 21 GRGB8888 >0 ulelong 22 ETC2 RGB
>>0 ulelong 22 ETC2 RGB >0 ulelong 23 ETC2 RGBA
>>0 ulelong 23 ETC2 RGBA >0 ulelong 24 ETC2 RGB A1
>>0 ulelong 24 ETC2 RGB A1 >0 ulelong 25 EAC R11
>>0 ulelong 25 EAC R11 >0 ulelong 26 EAC RG11
>>0 ulelong 26 EAC RG11 >0 ulelong 27 ASTC_4x4
>>0 ulelong 27 ASTC_4x4 >0 ulelong 28 ASTC_5x4
>>0 ulelong 28 ASTC_5x4 >0 ulelong 29 ASTC_5x5
>>0 ulelong 29 ASTC_5x5 >0 ulelong 30 ASTC_6x5
>>0 ulelong 30 ASTC_6x5 >0 ulelong 31 ASTC_6x6
>>0 ulelong 31 ASTC_6x6 >0 ulelong 32 ASTC_8x5
>>0 ulelong 32 ASTC_8x5 >0 ulelong 33 ASTC_8x6
>>0 ulelong 33 ASTC_8x6 >0 ulelong 34 ASTC_8x8
>>0 ulelong 34 ASTC_8x8 >0 ulelong 35 ASTC_10x5
>>0 ulelong 35 ASTC_10x5 >0 ulelong 36 ASTC_10x6
>>0 ulelong 36 ASTC_10x6 >0 ulelong 37 ASTC_10x8
>>0 ulelong 37 ASTC_10x8 >0 ulelong 38 ASTC_10x10
>>0 ulelong 38 ASTC_10x10 >0 ulelong 39 ASTC_12x10
>>0 ulelong 39 ASTC_12x10 >0 ulelong 40 ASTC_12x12
>>0 ulelong 40 ASTC_12x12 >0 ulelong 41 ASTC_3x3x3
>>0 ulelong 41 ASTC_3x3x3 >0 ulelong 42 ASTC_4x3x3
>>0 ulelong 42 ASTC_4x3x3 >0 ulelong 43 ASTC_4x4x3
>>0 ulelong 43 ASTC_4x4x3 >0 ulelong 44 ASTC_4x4x4
>>0 ulelong 44 ASTC_4x4x4 >0 ulelong 45 ASTC_5x4x4
>>0 ulelong 45 ASTC_5x4x4 >0 ulelong 46 ASTC_5x5x4
>>0 ulelong 46 ASTC_5x5x4 >0 ulelong 47 ASTC_5x5x5
>>0 ulelong 47 ASTC_5x5x5 >0 ulelong 48 ASTC_6x5x5
>>0 ulelong 48 ASTC_6x5x5 >0 ulelong 49 ASTC_6x6x5
>>0 ulelong 49 ASTC_6x6x5 >0 ulelong 50 ASTC_6x6x6
>>0 ulelong 50 ASTC_6x6x6
>4 ulelong !0
>>0 byte !0 %c
>>1 byte !0 \b%c
>>2 byte !0 \b%c
>>3 byte !0 \b%c
0 string PVR\x03 PVR 3.0 texture: 0 string PVR\x03 PowerVR 3.0 texture:
>0x18 ulelong x %u x >0x18 ulelong x %u x
>0x1C ulelong x %u >0x1C ulelong x %u
>0x20 ulelong >1 x %u >0x20 ulelong >1 x %u
>0x08 byte x \b, >0x08 byte x \b,
>0x08 use pvr3-pixel-format >0x0C ulelong 0
>>0x08 use pvr3-pixel-format
>0x0C ulelong !0
>>0x08 byte !0 %c
>>>0x0C byte !0 \b%u
>>0x09 byte !0 \b%c
>>>0x0D byte !0 \b%u
>>0x0A byte !0 \b%c
>>>0x0E byte !0 \b%u
>>0x0B byte !0 \b%c
>>>0x0F byte !0 \b%u
>0x10 ulelong 1 \b, sRGB >0x10 ulelong 1 \b, sRGB
>0x04 ulelong&0x02 0x02 \b, premultiplied alpha >0x04 ulelong&0x02 0x02 \b, premultiplied alpha
0 string \x03RVP PowerVR 3.0 texture: BE,
>0x18 ubelong x %u x
>0x1C ubelong x %u
>0x20 ubelong >1 x %u
>0x08 byte x \b,
>0x0C ubelong 0
>>0x08 use pvr3-pixel-format
>0x0C ubelong !0
>>0x0B byte !0 %c
>>>0x0F byte !0 \b%u
>>0x0A byte !0 \b%c
>>>0x0E byte !0 \b%u
>>0x09 byte !0 \b%c
>>>0x0D byte !0 \b%u
>>0x08 byte !0 \b%c
>>>0x0C byte !0 \b%u
>0x10 ubelong 1 \b, sRGB
>0x04 ubelong&0x02 0x02 \b, premultiplied alpha
# Type: Microsoft Xbox XPR0 texture. # Type: Microsoft Xbox XPR0 texture.
# From: David Korth <gerbilsoft@gerbilsoft.com> # From: David Korth <gerbilsoft@gerbilsoft.com>
# References: # References:
@ -2232,3 +2548,22 @@
# https://github.com/dropbox/lepton # https://github.com/dropbox/lepton
0 belong&0xfffff0ff 0xcf84005a Lepton image file 0 belong&0xfffff0ff 0xcf84005a Lepton image file
>2 byte x (version %d) >2 byte x (version %d)
# Apple QuickTake camera raw images
# https://en.wikipedia.org/wiki/Apple_QuickTake
# dcraw can decode them
0 name quicktake
>4 belong 8
>>544 beshort x \b, %dx
>>546 beshort x \b%d
>4 belong 4
>>546 beshort x \b, %dx
>>544 beshort x \b%d
0 string qktk Apple QuickTake 100 Raw Image
>0 use quicktake
0 string qktn
>4 byte 0 Apple QuickTake 150 Raw Image
>4 byte >0 Apple QuickTake 200 Raw Image
>0 use quicktake

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: intel,v 1.17 2018/08/01 10:34:03 christos Exp $ # $File: intel,v 1.18 2020/04/18 16:19:03 christos Exp $
# intel: file(1) magic for x86 Unix # intel: file(1) magic for x86 Unix
# #
# Various flavors of x86 UNIX executable/object (other than Xenix, which # Various flavors of x86 UNIX executable/object (other than Xenix, which
@ -67,3 +67,60 @@
# From Dr. Jesus <j@hug.gs> # From Dr. Jesus <j@hug.gs>
0 lelong 0x0ff0a55a Intel serial flash for ICH/PCH ROM <= 5 or 3400 series A-step 0 lelong 0x0ff0a55a Intel serial flash for ICH/PCH ROM <= 5 or 3400 series A-step
16 lelong 0x0ff0a55a Intel serial flash for PCH ROM 16 lelong 0x0ff0a55a Intel serial flash for PCH ROM
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/Advanced_Configuration_and_Power_Interface
# Reference: https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf
# Note: generated for example by `cat /sys/firmware/acpi/tables/DSDT MyDSDT.aml`
0 string DSDT
>0 use acpi-table
# not tested or other file format
0 string APIC
>0 use acpi-table
#0 string ASF!
#>0 use acpi-table
0 string FACP
>0 use acpi-table
#0 string FACS
#>0 use acpi-table
0 string MCFG
>0 use acpi-table
0 string SLIC
>0 use acpi-table
0 string SSDT
>0 use acpi-table
0 name acpi-table
# skip ASCII text starting with DSDT by looking for valid "low" revision
>8 ubyte <17 ACPI Machine Language file
# assume that ACPI tables size are lower than 16 MiB
#>4 ulelong <0x01000000
# DSDT for Differentiated System Description Table
>>0 string x '%.4s'
#!:mime application/octet-stream
!:mime application/x-intel-aml
!:ext aml
# the manufacture model ID like: VBOXBIOS BXDSDT
>>16 string >\0 %.8s
# OEM revision of DSDT for supplied OEM Table ID like: 0 1 2 20090511
>>>24 ulelong x %x
# OEM ID like: INTEL VBOX (VirtualBox) BXDSDT (qemu) MEDION or \030\001\0\0 for s3pt.aml
>>10 ubyte >040 by %c
>>>11 ubyte >040 \b%c
>>>>12 ubyte >040 \b%c
>>>>>13 ubyte >040 \b%c
>>>>>>14 ubyte >040 \b%c
>>>>>>>15 ubyte >040 \b%c
# This field also sets the global integer width for the AML interpreter.
# Values less than two will cause the interpreter to use 32-bit.
# Values of two and greater will cause the interpreter to use full 64-bit.
# 16 for asf!.aml, 67 fo rsdp.aml
>>8 ubyte x \b, revision %u
# length, in bytes, of the entire DSDT (including the header)
>>4 ulelong x \b, %u bytes
# entire table must sum to zero
#>>9 ubyte x \b, checksum 0x%x
# vendor ID for the ASL Compiler like: INTL MSFT ...
>>28 string >\0 \b, created by %.4s
# revision number of the ASL Compiler like: 20051117 20140724 20190703 20200110 ...
>>>32 ulelong x %x

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: kicad,v 1.1 2018/10/01 18:39:21 christos Exp $ # $File: kicad,v 1.2 2020/05/06 14:03:28 christos Exp $
# kicad: file(1) magic for KiCad files # kicad: file(1) magic for KiCad files
# #
# See # See
@ -9,26 +9,42 @@
# #
# KiCad Schematic Document # KiCad Schematic Document
0 string (kicad_sch
>10 byte 0x20 KiCad Schematic Document
!:ext kicad_sch/kicad_sch-bak
>>11 string (version
>>>19 byte 0x20
>>>>20 regex [0-9.]+ (Version %s)
# KiCad Schematic Document (Legacy)
0 string EESchema 0 string EESchema
>8 byte 0x20 >8 byte 0x20
>>9 string Schematic >>9 string Schematic
>>>18 byte 0x20 KiCad Schematic Document >>>18 byte 0x20 KiCad Schematic Document (Legacy)
!:ext sch/bak !:ext sch/bak
>>>>24 string Version >>>>24 string Version
>>>>>31 byte 0x20 >>>>>31 byte 0x20
>>>>>>32 string x (Version %s) >>>>>>32 string x (Version %s)
# KiCad Symbol Library # KiCad Symbol Library
0 string (kicad_symbol_lib
>17 byte 0x20 KiCad Symbol Library
!:ext kicad_sym
>>18 string (version
>>>26 byte 0x20
>>>>27 regex [0-9.]+ (Version %s)
# KiCad Symbol Library (Legacy)
0 string EESchema-LIBRARY 0 string EESchema-LIBRARY
>16 byte 0x20 KiCad Symbol Library >16 byte 0x20 KiCad Symbol Library (Legacy)
!:ext lib !:ext lib
>>17 string Version >>17 string Version
>>>24 byte 0x20 >>>24 byte 0x20
>>>>25 string x (Version %s) >>>>25 string x (Version %s)
# KiCad Symbol Library Documentation # KiCad Symbol Library Documentation (Legacy)
0 string EESchema-DOCLIB 0 string EESchema-DOCLIB
>15 byte 0x20 KiCad Symbol Library Documentation >15 byte 0x20 KiCad Symbol Library Documentation (Legacy)
!:ext dcm !:ext dcm
>>17 string Version >>17 string Version
>>>24 byte 0x20 >>>24 byte 0x20
@ -40,7 +56,7 @@
!:ext kicad_pcb/kicad_pcb-bak !:ext kicad_pcb/kicad_pcb-bak
>>11 string (version >>11 string (version
>>>19 byte 0x20 >>>19 byte 0x20
>>>>20 byte x (Version %c) >>>>20 regex [0-9.]+ (Version %s)
# KiCad Footprint # KiCad Footprint
0 string (module 0 string (module

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: linux,v 1.68 2019/09/11 21:20:56 christos Exp $ # $File: linux,v 1.72 2020/06/07 21:56:13 christos Exp $
# linux: file(1) magic for Linux files # linux: file(1) magic for Linux files
# #
# Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com> # Values for Linux/i386 binaries, from Daniel Quinlan <quinlan@yggdrasil.com>
@ -70,41 +70,69 @@
>24 lelong x %d >24 lelong x %d
>28 lelong x \bx%d >28 lelong x \bx%d
# Linux swap file, from Daniel Quinlan <quinlan@yggdrasil.com> # Linux swap and hibernate files
4086 string SWAP-SPACE Linux/i386 swap file # Linux kernel: include/linux/swap.h
# From: Jeff Bailey <jbailey@ubuntu.com> # util-linux: libblkid/src/superblocks/swap.c
# Linux swap file with swsusp1 image, from Jeff Bailey <jbailey@ubuntu.com>
4076 string SWAPSPACE2S1SUSPEND Linux/i386 swap file (new style) with SWSUSP1 image # format v0, unsupported since 2002
# From: James Hunt <james.hunt@ubuntu.com> 0xff6 string SWAP-SPACE Linux old swap file, 4k page size
4076 string SWAPSPACE2LINHIB0001 Linux/i386 swap file (new style) (compressed hibernate) 0x1ff6 string SWAP-SPACE Linux old swap file, 8k page size
# according to man page of mkswap (8) March 1999 0x3ff6 string SWAP-SPACE Linux old swap file, 16k page size
# volume label and UUID Russell Coker 0x7ff6 string SWAP-SPACE Linux old swap file, 32k page size
# https://etbe.coker.com.au/2008/07/08/label-vs-uuid-vs-device/ 0xfff6 string SWAP-SPACE Linux old swap file, 64k page size
4086 string SWAPSPACE2 Linux/i386 swap file (new style),
>0x400 long x version %d (4K pages), # format v1, supported since 1998
>0x404 long x size %d pages, 0 name linux-swap
>1052 string \0 no label, >0x400 lelong 1 little endian, version %u,
>1052 string >\0 LABEL=%s, >>0x404 lelong x size %u pages,
>0x40c belong x UUID=%08x >>0x408 lelong x %u bad pages,
>0x410 beshort x \b-%04x >0x400 belong 1 big endian, version %u,
>0x412 beshort x \b-%04x >>0x404 belong x size %u pages,
>0x414 beshort x \b-%04x >>0x408 belong x %u bad pages,
>0x416 belong x \b-%08x >0x41c string \0 no label,
>0x41a beshort x \b%04x >0x41c string >\0 LABEL=%s,
# From Daniel Novotny <dnovotny@redhat.com> >0x40c belong x UUID=%08x
# swap file for PowerPC >0x410 beshort x \b-%04x
65526 string SWAPSPACE2 Linux/ppc swap file >0x412 beshort x \b-%04x
>0x400 long x version %d, >0x414 beshort x \b-%04x
>0x404 long x size %d pages, >0x416 belong x \b-%08x
>1052 string \0 no label, >0x41a beshort x \b%04x
>1052 string >\0 LABEL=%s,
>0x40c belong x UUID=%08x 0xff6 string SWAPSPACE2 Linux swap file, 4k page size,
>0x410 beshort x \b-%04x >0 use linux-swap
>0x412 beshort x \b-%04x 0x1ff6 string SWAPSPACE2 Linux swap file, 8k page size,
>0x414 beshort x \b-%04x >0 use linux-swap
>0x416 belong x \b-%08x 0x3ff6 string SWAPSPACE2 Linux swap file, 16k page size,
>0x41a beshort x \b%04x >0 use linux-swap
16374 string SWAPSPACE2 Linux/ia64 swap file 0x7ff6 string SWAPSPACE2 Linux swap file, 32k page size,
>0 use linux-swap
0xfff6 string SWAPSPACE2 Linux swap file, 64k page size,
>0 use linux-swap
0 name linux-hibernate
>0 string S1SUSPEND \b, with SWSUSP1 image
>0 string S2SUSPEND \b, with SWSUSP2 image
>0 string ULSUSPEND \b, with uswsusp image
>0 string LINHIB0001 \b, with compressed hibernate image
>0 string \xed\xc3\x02\xe9\x98\x56\xe5\x0c \b, with tuxonice image
>0 default x \b, with unknown hibernate image
0xfec string SWAPSPACE2 Linux swap file, 4k page size,
>0 use linux-swap
>0xff6 use linux-hibernate
0x1fec string SWAPSPACE2 Linux swap file, 8k page size,
>0 use linux-swap
>0x1ff6 use linux-hibernate
0x3fec string SWAPSPACE2 Linux swap file, 16k page size,
>0 use linux-swap
>0x3ff6 use linux-hibernate
0x7fec string SWAPSPACE2 Linux swap file, 32k page size,
>0 use linux-swap
>0x7ff6 use linux-hibernate
0xffec string SWAPSPACE2 Linux swap file, 64k page size,
>0 use linux-swap
>0xfff6 use linux-hibernate
# #
# Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu> # Linux kernel boot images, from Albert Cahalan <acahalan@cs.uml.edu>
# and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de> # and others such as Axel Kohlmeyer <akohlmey@rincewind.chemie.uni-ulm.de>
@ -206,13 +234,29 @@
>>&0 string \x80\x00\x20\x00\x00\x00\x00\x00 Z990 32bit kernel >>&0 string \x80\x00\x20\x00\x00\x00\x00\x00 Z990 32bit kernel
>>&0 string \x80\x00\x00\x00\x00\x00\x00\x00 Z900 32bit kernel >>&0 string \x80\x00\x00\x00\x00\x00\x00\x00 Z900 32bit kernel
############################################################################
# Linux ARM compressed kernel image # Linux ARM compressed kernel image
# From: Kevin Cernekee <cernekee@gmail.com> # From: Kevin Cernekee <cernekee@gmail.com>
# Update: Joerg Jenderek # Update: Joerg Jenderek
36 lelong 0x016f2818 Linux kernel ARM boot executable zImage (little-endian) 0x24 lelong 0x016f2818 Linux kernel ARM boot executable zImage
# There are three posible situations: LE, BE with LE bootloader and pure BE.
# In order to aid telling these apart a new endian flag was added. In order
# to support kernels before the flag and BE with LE bootloader was added we'll
# do a negative check against the BE variant of the flag when we see a LE magic.
>0x30 belong !0x04030201 (little-endian)
>0x30 belong 0x04030201 (big-endian)
# raspian "kernel7.img", Vu+ Ultimo4K "kernel_auto.bin" # raspian "kernel7.img", Vu+ Ultimo4K "kernel_auto.bin"
!:ext img/bin !:ext img/bin
36 belong 0x016f2818 Linux kernel ARM boot executable zImage (big-endian) 0x24 belong 0x016f2818 Linux kernel ARM boot executable zImage (big-endian)
############################################################################
# Linux AARCH64 kernel image
0x38 lelong 0x644d5241 Linux kernel ARM64 boot executable Image
>0x18 lelong ^1 \b, little-endian
>0x18 lelong &1 \b, big-endian
>0x18 lelong &2 \b, 4K pages
>0x18 lelong &4 \b, 16K pages
>0x18 lelong &6 \b, 32K pages
############################################################################ ############################################################################
# Linux 8086 executable # Linux 8086 executable
@ -267,11 +311,11 @@
# #
# LVM1 # LVM1
# #
0x0 string HM\001 LVM1 (Linux Logical Volume Manager), version 1 0x0 string/b HM\001 LVM1 (Linux Logical Volume Manager), version 1
>0x12c string >\0 , System ID: %s >0x12c string/b >\0 , System ID: %s
0x0 string HM\002 LVM1 (Linux Logical Volume Manager), version 2 0x0 string/b HM\002 LVM1 (Linux Logical Volume Manager), version 2
>0x12c string >\0 , System ID: %s >0x12c string/b >\0 , System ID: %s
# LVM2 # LVM2
# #
@ -279,56 +323,31 @@
# of the disk... (from _find_labeller in lib/label/label.c of LVM2) # of the disk... (from _find_labeller in lib/label/label.c of LVM2)
# #
# 0x200 seems to be the common case # 0x200 seems to be the common case
0 name lvm2
# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
>0x0 string >\x2f \b, UUID: %.6s
>0x6 string >\x2f \b-%.4s
>0xa string >\x2f \b-%.4s
>0xe string >\x2f \b-%.4s
>0x12 string >\x2f \b-%.4s
>0x16 string >\x2f \b-%.4s
>0x1a string >\x2f \b-%.6s
>0x20 lequad x \b, size: %lld
0x218 string LVM2\ 001 LVM2 PV (Linux Logical Volume Manager)
# read the offset to add to the start of the header, and the header # read the offset to add to the start of the header, and the header
# start in 0x200 # start in 0x200
>&(&-12.l-0x21) byte x 0x218 string/b LVM2\ 001 LVM2 PV (Linux Logical Volume Manager)
# display UUID in LVM format + display all 32 bytes (instead of max string length: 31) >&(&-12.l-0x20) use lvm2
>>&0x0 string >\x2f \b, UUID: %.6s
>>&0x6 string >\x2f \b-%.4s
>>&0xa string >\x2f \b-%.4s
>>&0xe string >\x2f \b-%.4s
>>&0x12 string >\x2f \b-%.4s
>>&0x16 string >\x2f \b-%.4s
>>&0x1a string >\x2f \b-%.6s
>>&0x20 lequad x \b, size: %lld
0x018 string LVM2\ 001 LVM2 PV (Linux Logical Volume Manager) 0x018 string/b LVM2\ 001 LVM2 PV (Linux Logical Volume Manager)
>&(&-12.l-0x21) byte x >&(&-12.l-0x20) use lvm2
# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
>>&0x0 string >\x2f \b, UUID: %.6s
>>&0x6 string >\x2f \b-%.4s
>>&0xa string >\x2f \b-%.4s
>>&0xe string >\x2f \b-%.4s
>>&0x12 string >\x2f \b-%.4s
>>&0x16 string >\x2f \b-%.4s
>>&0x1a string >\x2f \b-%.6s
>>&0x20 lequad x \b, size: %lld
0x418 string LVM2\ 001 LVM2 PV (Linux Logical Volume Manager) 0x418 string/b LVM2\ 001 LVM2 PV (Linux Logical Volume Manager)
>&(&-12.l-0x21) byte x >&(&-12.l-0x20) use lvm2
# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
>>&0x0 string >\x2f \b, UUID: %.6s
>>&0x6 string >\x2f \b-%.4s
>>&0xa string >\x2f \b-%.4s
>>&0xe string >\x2f \b-%.4s
>>&0x12 string >\x2f \b-%.4s
>>&0x16 string >\x2f \b-%.4s
>>&0x1a string >\x2f \b-%.6s
>>&0x20 lequad x \b, size: %lld
0x618 string LVM2\ 001 LVM2 PV (Linux Logical Volume Manager) 0x618 string/b LVM2\ 001 LVM2 PV (Linux Logical Volume Manager)
>&(&-12.l-0x21) byte x >&(&-12.l-0x20) use lvm2
# display UUID in LVM format + display all 32 bytes (instead of max string length: 31)
>>&0x0 string >\x2f \b, UUID: %.6s
>>&0x6 string >\x2f \b-%.4s
>>&0xa string >\x2f \b-%.4s
>>&0xe string >\x2f \b-%.4s
>>&0x12 string >\x2f \b-%.4s
>>&0x16 string >\x2f \b-%.4s
>>&0x1a string >\x2f \b-%.6s
>>&0x20 lequad x \b, size: %lld
# LVM snapshot # LVM snapshot
# from Jason Farrel # from Jason Farrel

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: msdos,v 1.134 2019/10/18 15:16:18 christos Exp $ # $File: msdos,v 1.137 2020/03/20 17:20:19 christos Exp $
# msdos: file(1) magic for MS-DOS files # msdos: file(1) magic for MS-DOS files
# #
@ -123,6 +123,7 @@
>>(0x3c.l+4) leshort 0x1d3 Matsushita AM33 >>(0x3c.l+4) leshort 0x1d3 Matsushita AM33
>>(0x3c.l+4) leshort 0x1f0 PowerPC >>(0x3c.l+4) leshort 0x1f0 PowerPC
>>(0x3c.l+4) leshort 0x1f1 PowerPC with FPU >>(0x3c.l+4) leshort 0x1f1 PowerPC with FPU
>>(0x3c.l+4) leshort 0x1f2 PowerPC (big-endian)
>>(0x3c.l+4) leshort 0x200 Intel Itanium >>(0x3c.l+4) leshort 0x200 Intel Itanium
>>(0x3c.l+4) leshort 0x266 MIPS16 >>(0x3c.l+4) leshort 0x266 MIPS16
>>(0x3c.l+4) leshort 0x268 Motorola 68000 >>(0x3c.l+4) leshort 0x268 Motorola 68000
@ -1215,6 +1216,14 @@
!:mime application/vnd.ms-powerpoint !:mime application/vnd.ms-powerpoint
#!:mime application/mspowerpoint #!:mime application/mspowerpoint
!:ext ppz !:ext ppz
# URL: https://en.wikipedia.org/wiki/Windows_Desktop_Gadgets
# Reference: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/sidebar/
# http://win10gadgets.com/download/273/ All_CPU_Meter1.zip/All_CPU_Meter_V4.7.3.gadget
>0x2c search/968/c gadget.xml \b, Windows Desktop Gadget
#!:mime application/vnd.ms-cab-compressed
# http://extension.nirsoft.net/gadget
!:mime application/x-windows-gadget
!:ext gadget
# http://www.incredimail.com/ # http://www.incredimail.com/
# IncrediMail CAB contains an initialisation file "content.ini" like in im2.ims # IncrediMail CAB contains an initialisation file "content.ini" like in im2.ims
>0x2c search/3369/c content.ini\0 \b, IncrediMail >0x2c search/3369/c content.ini\0 \b, IncrediMail
@ -1235,7 +1244,7 @@
# http://file-extension.net/seeker/file_extension_ime # http://file-extension.net/seeker/file_extension_ime
>>>0x2c default x emoticons or sound >>>0x2c default x emoticons or sound
!:ext ime/imw !:ext ime/imw
# no Diagnostic and IncrediMail # no Diagnostic, Packed and Go, Windows Desktop Gadget, IncrediMail
>0x2c default x >0x2c default x
# look for 1st member name # look for 1st member name
>>(16.l+16) ubyte x >>(16.l+16) ubyte x
@ -1243,6 +1252,11 @@
>>>&-1 string/c _accrpt_.snp \b, Access report snapshot >>>&-1 string/c _accrpt_.snp \b, Access report snapshot
!:mime application/msaccess !:mime application/msaccess
!:ext snp !:ext snp
# https://en.wikipedia.org/wiki/Microsoft_InfoPath
>>>&-1 string manifest.xsf \b, InfoPath Form Template
!:mime application/vnd.ms-cab-compressed
#!:mime application/vnd.ms-infopath
!:ext xsn
# https://www.cabextract.org.uk/wince_cab_format/ # https://www.cabextract.org.uk/wince_cab_format/
# extension of DOS 8+3 name with ".000" of 1st archive member name implies Windows CE installer # extension of DOS 8+3 name with ".000" of 1st archive member name implies Windows CE installer
>>>&7 string =.000 \b, WinCE install >>>&7 string =.000 \b, WinCE install
@ -1306,7 +1320,6 @@
!:mime application/vnd.ms-cab-compressed !:mime application/vnd.ms-cab-compressed
!:ext cab !:ext cab
# TODO: additional extensions like # TODO: additional extensions like
# .xsn InfoPath Dynamic Form
# .xtp InfoPath Template Part # .xtp InfoPath Template Part
# .lvf Logitech Video Effects Face Accessory # .lvf Logitech Video Effects Face Accessory
>8 ulelong x \b, %u bytes >8 ulelong x \b, %u bytes

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: ole2compounddocs,v 1.7 2019/08/02 18:08:18 christos Exp $ # $File: ole2compounddocs,v 1.8 2020/03/28 23:10:30 christos Exp $
# Microsoft OLE 2 Compound Documents : file(1) magic for Microsoft Structured # Microsoft OLE 2 Compound Documents : file(1) magic for Microsoft Structured
# storage (https://en.wikipedia.org/wiki/Compound_File_Binary_Format) # storage (https://en.wikipedia.org/wiki/Compound_File_Binary_Format)
# Additional tests for OLE 2 Compound Documents should be under this recipe. # Additional tests for OLE 2 Compound Documents should be under this recipe.
@ -27,6 +27,25 @@
>>>0x18 uleshort x \b.%u >>>0x18 uleshort x \b.%u
# SecID of first sector of the directory stream is often 1 but high like 3144h # SecID of first sector of the directory stream is often 1 but high like 3144h
>>>48 ulelong x \b, SecID 0x%x >>>48 ulelong x \b, SecID 0x%x
# Sector Shift Exponent in short-stream container stream: 6~64 bytes
>>>32 uleshort !6 \b, exponent of short stream %u
# total number of sectors used for the FAT
>>>44 ulelong >1 \b, %u FAT sectors
# SecID of first sector of the short-sector allocation table (Mini FAT)
# or -2 (End Of ChainSecID) if not extant
>>>60 ulelong !0xffFFffFE \b, Mini FAT start sector 0x%x
# total number of sectors used for the short-sector allocation table
>>>64 ulelong !1 \b, %u Mini FAT sector
# plural s
>>>>64 ulelong >1 \bs
# SecID of first sector of the master sector allocation table (DIFAT)
# or -2 (End Of Chain SecID) if no additional sectors used
>>>68 ulelong !0xffFFffFE \b, DIFAT start sector 0x%x
# total number of sectors used for the master sector allocation table (DIFAT)
>>>72 ulelong >0 \b, %u DIFAT sectors
# First part of the master sector allocation table (DIFAT) containing 109 SecIDs
#>>>76 ubequad x \b, DIFAT=0x%16.16llx
#>>>84 ubequad x \b%16.16llx...
# pointer to root entry only works with standard configuration for SecID ~< 800h # pointer to root entry only works with standard configuration for SecID ~< 800h
# Red-Carpet-presentation-1.0-1.sdd sg10.sdv 2000_GA_Annual_Review_Data.xls # Red-Carpet-presentation-1.0-1.sdd sg10.sdv 2000_GA_Annual_Review_Data.xls
# "ORLEN Factbook 2017.xls" XnView_metadata.doc # "ORLEN Factbook 2017.xls" XnView_metadata.doc
@ -51,7 +70,7 @@
#>66 ubyte x \b, type %x #>66 ubyte x \b, type %x
# node colour of the entry: 00H ~ Red 01H ~ Black # node colour of the entry: 00H ~ Red 01H ~ Black
#>67 ubyte x \b, color %x #>67 ubyte x \b, color %x
# the DirIDs of the child nodes. Should both be 1 in the root storage entry # the DirIDs of the child nodes. Should both be -1 in the root storage entry
#>68 bequad !0xffffffffffffffff \b, DirIDs %llx #>68 bequad !0xffffffffffffffff \b, DirIDs %llx
# second directory entry name like VisioDocument Control000 # second directory entry name like VisioDocument Control000
#>128 lestring16 x \b, 2nd %.20s #>128 lestring16 x \b, 2nd %.20s
@ -207,6 +226,29 @@
#!:mime application/x-ole-storage #!:mime application/x-ole-storage
!:mime application/x-star-sdv !:mime application/x-star-sdv
!:ext sdv !:ext sdv
# URL: https://en.wikipedia.org/wiki/SoftMaker_Office
# second directory entry name Current User
>>>>128 lestring16 Current\ User : SoftMaker
# third directory entry name SMNativeObjData
>>>>>256 lestring16 SMNativeObjData
# 5th directory entry nane PowerPoint
>>>>>>512 lestring16 PowerPoint PowerPoint presentation or template
!:mime application/vnd.ms-powerpoint
!:ext ppt/pps/pot
# 4th directory entry name PowerPoint
>>>>>384 lestring16 PowerPoint Presentations or template
# http://extension.nirsoft.net/prv
!:mime application/vnd.softmaker.presentations
!:ext prd/prv
# third directory entry name like Current User
>>>>256 lestring16 Current\ User : SoftMaker
# 5th directory entry name PowerPoint
>>>>>512 lestring16 PowerPoint Presentations or template
# http://extension.nirsoft.net/prd
!:mime application/vnd.softmaker.presentations
!:ext prd/prv
# 2nd directory entry name Pictures
>>>>>>128 lestring16 Pictures with pictures
# remaining null clsid # remaining null clsid
>>>>128 default x : UNKNOWN >>>>128 default x : UNKNOWN
!:mime application/x-ole-storage !:mime application/x-ole-storage
@ -463,6 +505,12 @@
!:mime image/vnd.fpx !:mime image/vnd.fpx
!:apple ????FPix !:apple ????FPix
!:ext fpx !:ext fpx
# URL: https://en.wikipedia.org/wiki/SoftMaker_Office
>>88 ubequad 0x95f600a0cc3cca14 : PlanMaker
>>>80 ubequad 0x9174088a6452d411 document or template
!:mime application/vnd.softmaker.planmaker
# pmv for template https://www.file-extensions.org/pmv-file-extension
!:ext pmd/pmv
# remaining non null clsid # remaining non null clsid
>>88 default x : UNKNOWN >>88 default x : UNKNOWN
!:mime application/x-ole-storage !:mime application/x-ole-storage

View File

@ -1,11 +1,11 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: parix,v 1.4 2009/09/19 16:28:11 christos Exp $ # $File: parix,v 1.5 2020/03/08 22:18:32 christos Exp $
# #
# Parix COFF executables # Parix COFF executables
# From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de> # From: Ignatios Souvatzis <ignatios@cs.uni-bonn.de>
# #
0 beshort&0xfff 0xACE PARIX 0 beshort&0xefff 0x8ACE PARIX
>0 byte&0xf0 0x80 T800 >0 byte&0xf0 0x80 T800
>0 byte&0xf0 0x90 T9000 >0 byte&0xf0 0x90 T9000
>19 byte&0x02 0x02 executable >19 byte&0x02 0x02 executable

View File

@ -1,5 +1,5 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: pascal,v 1.2 2014/07/14 14:21:33 rrt Exp $ # $File: pascal,v 1.3 2020/06/07 18:10:26 christos Exp $
# pascal: file(1) magic for Pascal source # pascal: file(1) magic for Pascal source
# #
0 search/8192 (input, Pascal source text 0 search/8192 (input, Pascal source text
@ -8,3 +8,7 @@
#!:mime text/x-pascal #!:mime text/x-pascal
#0 regex \^record Pascal source text #0 regex \^record Pascal source text
#!:mime text/x-pascal #!:mime text/x-pascal
# Free Pascal
0 string PPU Pascal unit
>3 string x \b, version %s

View File

@ -1,26 +1,32 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: pdf,v 1.11 2019/09/12 15:53:49 christos Exp $ # $File: pdf,v 1.12 2020/01/30 01:48:44 christos Exp $
# pdf: file(1) magic for Portable Document Format # pdf: file(1) magic for Portable Document Format
# #
0 name pdf
>8 search/512 /Filter/FlateDecode/ (password protected)
0 string %PDF- PDF document 0 string %PDF- PDF document
!:mime application/pdf !:mime application/pdf
!:strength +60 !:strength +60
>5 byte x \b, version %c >5 byte x \b, version %c
>7 byte x \b.%c >7 byte x \b.%c
>0 use pdf
0 string \012%PDF- PDF document 0 string \012%PDF- PDF document
!:mime application/pdf !:mime application/pdf
!:strength +60 !:strength +60
>6 byte x \b, version %c >6 byte x \b, version %c
>8 byte x \b.%c >8 byte x \b.%c
>0 use pdf
0 string \xef\xbb\xbf%PDF- PDF document (UTF-8) 0 string \xef\xbb\xbf%PDF- PDF document (UTF-8)
!:mime application/pdf !:mime application/pdf
!:strength +60 !:strength +60
>6 byte x \b, version %c >6 byte x \b, version %c
>8 byte x \b.%c >8 byte x \b.%c
>0 use pdf
# From: Nick Schmalenberger <nick@schmalenberger.us> # From: Nick Schmalenberger <nick@schmalenberger.us>
# Forms Data Format # Forms Data Format
@ -35,3 +41,4 @@
!:strength +60 !:strength +60
>&0 byte x \b, version %c >&0 byte x \b, version %c
>&2 byte x \b.%c >&2 byte x \b.%c
>0 use pdf

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: pgp,v 1.17 2019/04/19 00:42:27 christos Exp $ # $File: pgp,v 1.21 2020/03/20 17:11:05 christos Exp $
# pgp: file(1) magic for Pretty Good Privacy # pgp: file(1) magic for Pretty Good Privacy
# see https://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html # see https://lists.gnupg.org/pipermail/gnupg-devel/1999-September/016052.html
# #
@ -58,16 +58,36 @@
#>15 string SIGNED\040MESSAGE- signed message #>15 string SIGNED\040MESSAGE- signed message
#>15 string PGP\040SIGNATURE- signature #>15 string PGP\040SIGNATURE- signature
# Update: Joerg Jenderek
# URL: http://en.wikipedia.org/wiki/Pretty_Good_Privacy
# Reference: https://reposcope.com/mimetype/application/pgp-keys
2 string ---BEGIN\040PGP\040PRIVATE\040KEY\040BLOCK- PGP private key block
#!:mime text/PGP
!:mime application/pgp-keys
!:ext asc
2 string ---BEGIN\040PGP\040PUBLIC\040KEY\040BLOCK- PGP public key block 2 string ---BEGIN\040PGP\040PUBLIC\040KEY\040BLOCK- PGP public key block
!:mime application/pgp-keys !:mime application/pgp-keys
!:ext asc
>10 search/100 \n\n >10 search/100 \n\n
>>&0 use pgp >>&0 use pgp
0 string -----BEGIN\040PGP\040MESSAGE- PGP message 0 string -----BEGIN\040PGP\040MESSAGE- PGP message
!:mime application/pgp # https://reposcope.com/mimetype/application/pgp-encrypted
#!:mime application/pgp
!:mime application/pgp-encrypted
!:ext asc
#!:ext asc/pgp/gpg
>10 search/100 \n\n >10 search/100 \n\n
>>&0 use pgp >>&0 use pgp
# Reference: https://www.gnupg.org/gph/en/manual/x135.html
0 string -----BEGIN\040PGP\040SIGNED\040MESSAGE- PGP signed message
#!:mime text/plain
!:mime text/PGP
#!:mime application/pgp
!:ext asc
0 string -----BEGIN\040PGP\040SIGNATURE- PGP signature 0 string -----BEGIN\040PGP\040SIGNATURE- PGP signature
# https://reposcope.com/mimetype/application/pgp-signature
!:mime application/pgp-signature !:mime application/pgp-signature
!:ext asc
>10 search/100 \n\n >10 search/100 \n\n
>>&0 use pgp >>&0 use pgp
@ -127,8 +147,8 @@
# 1024b RSA encrypted data # 1024b RSA encrypted data
0 string \x84\x8c\x03 PGP RSA encrypted session key - 0 string \x84\x8c\x03 PGP RSA encrypted session key -
>3 lelong x keyid: %X >3 belong x keyid: %08X
>7 lelong x %X >7 belong x %08X
>11 byte 0x01 RSA (Encrypt or Sign) 1024b >11 byte 0x01 RSA (Encrypt or Sign) 1024b
>11 byte 0x02 RSA Encrypt-Only 1024b >11 byte 0x02 RSA Encrypt-Only 1024b
>12 string \x04\x00 >12 string \x04\x00
@ -144,8 +164,8 @@
# 2048b RSA encrypted data # 2048b RSA encrypted data
0 string \x85\x01\x0c\x03 PGP RSA encrypted session key - 0 string \x85\x01\x0c\x03 PGP RSA encrypted session key -
>4 lelong x keyid: %X >4 belong x keyid: %08X
>8 lelong x %X >8 belong x %08X
>12 byte 0x01 RSA (Encrypt or Sign) 2048b >12 byte 0x01 RSA (Encrypt or Sign) 2048b
>12 byte 0x02 RSA Encrypt-Only 2048b >12 byte 0x02 RSA Encrypt-Only 2048b
>13 string \x08\x00 >13 string \x08\x00
@ -161,8 +181,8 @@
# 3072b RSA encrypted data # 3072b RSA encrypted data
0 string \x85\x01\x8c\x03 PGP RSA encrypted session key - 0 string \x85\x01\x8c\x03 PGP RSA encrypted session key -
>4 lelong x keyid: %X >4 belong x keyid: %08X
>8 lelong x %X >8 belong x %08X
>12 byte 0x01 RSA (Encrypt or Sign) 3072b >12 byte 0x01 RSA (Encrypt or Sign) 3072b
>12 byte 0x02 RSA Encrypt-Only 3072b >12 byte 0x02 RSA Encrypt-Only 3072b
>13 string \x0c\x00 >13 string \x0c\x00
@ -175,11 +195,11 @@
>13 string \x0b\xf9 >13 string \x0b\xf9
>399 byte 0xd2 . >399 byte 0xd2 .
# 3072b RSA encrypted data # 4096b RSA encrypted data
0 string \x85\x02\x0c\x03 PGP RSA encrypted session key - 0 string \x85\x02\x0c\x03 PGP RSA encrypted session key -
>4 lelong x keyid: %X >4 belong x keyid: %08X
>8 lelong x %X >8 belong x %08X
>12 byte 0x01 RSA (Encrypt or Sign) 4096b >12 byte 0x01 RSA (Encrypt or Sign) 4096b
>12 byte 0x02 RSA Encrypt-Only 4096b >12 byte 0x02 RSA Encrypt-Only 4096b
>13 string \x10\x00 >13 string \x10\x00
@ -192,13 +212,13 @@
>13 string \x0f\xf9 >13 string \x0f\xf9
>527 byte 0xd2 . >527 byte 0xd2 .
# 4096b RSA encrypted data # 8192b RSA encrypted data
0 string \x85\x04\x0c\x03 PGP RSA encrypted session key - 0 string \x85\x04\x0c\x03 PGP RSA encrypted session key -
>4 lelong x keyid: %X >4 belong x keyid: %08X
>8 lelong x %X >8 belong x %08X
>12 byte 0x01 RSA (Encrypt or Sign) 8129b >12 byte 0x01 RSA (Encrypt or Sign) 8192b
>12 byte 0x02 RSA Encrypt-Only 8129b >12 byte 0x02 RSA Encrypt-Only 8192b
>13 string \x20\x00 >13 string \x20\x00
>13 string \x1f\xff >13 string \x1f\xff
>13 string \x1f\xfe >13 string \x1f\xfe
@ -209,6 +229,51 @@
>13 string \x1f\xf9 >13 string \x1f\xf9
>1039 byte 0xd2 . >1039 byte 0xd2 .
# 1024b Elgamal encrypted data
0 string \x85\x01\x0e\x03 PGP Elgamal encrypted session key -
>4 belong x keyid: %08X
>8 belong x %08X
>12 byte 0x10 Elgamal Encrypt-Only 1024b.
>13 string \x04\x00
>13 string \x03\xff
>13 string \x03\xfe
>13 string \x03\xfd
>13 string \x03\xfc
>13 string \x03\xfb
>13 string \x03\xfa
>13 string \x03\xf9
# 2048b Elgamal encrypted data
0 string \x85\x02\x0e\x03 PGP Elgamal encrypted session key -
>4 belong x keyid: %08X
>8 belong x %08X
>12 byte 0x10 Elgamal 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
# 3072b Elgamal encrypted data
0 string \x85\x03\x0e\x03 PGP Elgamal encrypted session key -
>4 belong x keyid: %08X
>8 belong x %08X
>12 byte 0x10 Elgamal 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
# crypto algo mapper # crypto algo mapper
0 name crypto 0 name crypto

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: python,v 1.37 2019/10/21 19:40:58 christos Exp $ # $File: python,v 1.42 2020/06/04 00:22:50 christos Exp $
# python: file(1) magic for python # python: file(1) magic for python
# #
# Outlook puts """ too for urgent messages # Outlook puts """ too for urgent messages
@ -10,85 +10,255 @@
# MAGIC as specified in Python/import.c (1.0 to 3.7) # MAGIC as specified in Python/import.c (1.0 to 3.7)
# two bytes of magic followed by "\r\n" in little endian order # two bytes of magic followed by "\r\n" in little endian order
0 belong 0x02099900 python 1.0 byte-compiled 0 belong 0x02099900 python 1.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x03099900 python 1.1/1.2 byte-compiled 0 belong 0x03099900 python 1.1/1.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x892e0d0a python 1.3 byte-compiled 0 belong 0x892e0d0a python 1.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x04170d0a python 1.4 byte-compiled 0 belong 0x04170d0a python 1.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x994e0d0a python 1.5 byte-compiled 0 belong 0x994e0d0a python 1.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xfcc40d0a python 1.6 byte-compiled 0 belong 0xfcc40d0a python 1.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xfdc40d0a python 1.6 byte-compiled 0 belong 0xfdc40d0a python 1.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x87c60d0a python 2.0 byte-compiled 0 belong 0x87c60d0a python 2.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x88c60d0a python 2.0 byte-compiled 0 belong 0x88c60d0a python 2.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2aeb0d0a python 2.1 byte-compiled 0 belong 0x2aeb0d0a python 2.1 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2beb0d0a python 2.1 byte-compiled 0 belong 0x2beb0d0a python 2.1 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2ded0d0a python 2.2 byte-compiled 0 belong 0x2ded0d0a python 2.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2eed0d0a python 2.2 byte-compiled 0 belong 0x2eed0d0a python 2.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x3bf20d0a python 2.3 byte-compiled 0 belong 0x3bf20d0a python 2.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x3cf20d0a python 2.3 byte-compiled 0 belong 0x3cf20d0a python 2.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x45f20d0a python 2.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x59f20d0a python 2.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x63f20d0a python 2.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x6df20d0a python 2.4 byte-compiled 0 belong 0x6df20d0a python 2.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x6ef20d0a python 2.4 byte-compiled 0 belong 0x6ef20d0a python 2.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x77f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x81f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x8bf20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x8cf20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x95f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x9ff20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xa9f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xb3f20d0a python 2.5 byte-compiled 0 belong 0xb3f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xb4f20d0a python 2.5 byte-compiled 0 belong 0xb4f20d0a python 2.5 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xc7f20d0a python 2.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xd1f20d0a python 2.6 byte-compiled 0 belong 0xd1f20d0a python 2.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xd2f20d0a python 2.6 byte-compiled 0 belong 0xd2f20d0a python 2.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xdbf20d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xe5f20d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xeff20d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xf9f20d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x03f30d0a python 2.7 byte-compiled 0 belong 0x03f30d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x04f30d0a python 2.7 byte-compiled 0 belong 0x04f30d0a python 2.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xb80b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xc20b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xcc0b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xd60b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xe00b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xea0b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xf40b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xf50b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xff0b0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x090c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x130c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x1d0c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x1f0c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x270c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x3b0c0d0a python 3.0 byte-compiled 0 belong 0x3b0c0d0a python 3.0 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x450c0d0a python 3.1 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x4f0c0d0a python 3.1 byte-compiled 0 belong 0x4f0c0d0a python 3.1 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x580c0d0a python 3.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x620c0d0a python 3.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x6c0c0d0a python 3.2 byte-compiled 0 belong 0x6c0c0d0a python 3.2 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x760c0d0a python 3.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x800c0d0a python 3.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x8a0c0d0a python 3.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x940c0d0a python 3.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x9e0c0d0a python 3.3 byte-compiled 0 belong 0x9e0c0d0a python 3.3 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xb20c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xbc0c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xc60c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xd00c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xda0c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xe40c0d0a python 3.4 byte-compiled
!:mime text/x-bytecode.python
0 belong 0xee0c0d0a python 3.4 byte-compiled 0 belong 0xee0c0d0a python 3.4 byte-compiled
0 belong 0x160d0d0a python 3.5.2- byte-compiled !:mime text/x-bytecode.python
0 belong 0x170d0d0a python 3.5.3+ byte-compiled 0 belong 0xf80c0d0a python 3.5.1- byte-compiled
!:mime text/x-bytecode.python
0 belong 0x020d0d0a python 3.5.1- byte-compiled
!:mime text/x-bytecode.python
0 belong 0x0c0d0d0a python 3.5.1- byte-compiled
!:mime text/x-bytecode.python
0 belong 0x160d0d0a python 3.5.1- byte-compiled
!:mime text/x-bytecode.python
0 belong 0x170d0d0a python 3.5.2+ byte-compiled
!:mime text/x-bytecode.python
0 belong 0x200d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x210d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2a0d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2b0d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2c0d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2d0d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x2f0d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x300d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x310d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x320d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x330d0d0a python 3.6 byte-compiled 0 belong 0x330d0d0a python 3.6 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x3e0d0d0a python 3.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x3f0d0d0a python 3.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x400d0d0a python 3.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x410d0d0a python 3.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x420d0d0a python 3.7 byte-compiled 0 belong 0x420d0d0a python 3.7 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x480d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x490d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x520d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x530d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x540d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x550d0d0a python 3.8 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x5c0d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x5d0d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x5e0d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x5f0d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x600d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 belong 0x610d0d0a python 3.9 byte-compiled
!:mime text/x-bytecode.python
0 search/1/w #!\040/usr/bin/python Python script text executable
0 search/1/w #!\ /usr/bin/python Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
0 search/1/w #!\ /usr/local/bin/python Python script text executable 0 search/1/w #!\040/usr/local/bin/python Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
0 search/1 #!/usr/bin/env\ python Python script text executable 0 search/10/w #!\040/usr/bin/env\040python Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
0 search/10 #!\ /usr/bin/env\ python Python script text executable
!:strength + 15
!:mime text/x-python
# from module.submodule import func1, func2 # from module.submodule import func1, func2
0 search/8192 import 0 search/8192 import
>0 regex \^from[\040\t\f\r\n]+([A-Za-z0-9_]|\\.)+[\040\t\f\r\n]+import.*$ Python script text executable >0 regex \^from[\040\t]+([A-Za-z0-9_]|\\.)+[\040\t]+import.*$ Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
# def __init__ (self, ...): # def __init__ (self, ...):
0 search/4096 def\ __init__ 0 search/4096 def\ __init__
>&0 search/64 self Python script text executable >&0 search/64 self Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
# if __name__ == "__main__": # if __name__ == "__main__":
0 search/4096 if\ __name__ 0 search/4096 if\ __name__
>&0 search/64 '__main__' Python script text executable >&0 search/64 '__main__' Python script text executable
>&0 search/64 "__main__" Python script text executable >&0 search/64 "__main__" Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
# import module [as abrev] # import module [as abrev]
0 search/8192 import 0 search/8192 import
>0 regex \^import\ [_[:alpha:]]+\ as\ [[:alpha:]][[:space:]]*$ Python script text executable >0 regex \^import\ [_[:alpha:]]+\ as\ [[:alpha:]][[:space:]]*$ Python script text executable
!:mime text/x-python !:mime text/x-script.python
# comments # comments
#0 search/4096 ''' #0 search/4096 '''
#>&0 regex .*'''$ Python script text executable #>&0 regex .*'''$ Python script text executable
#!:mime text/x-python #!:mime text/x-script.python
#0 search/4096 """ #0 search/4096 """
#>&0 regex .*"""$ Python script text executable #>&0 regex .*"""$ Python script text executable
#!:mime text/x-python #!:mime text/x-script.python
# try: # try:
# except: or finally: # except: or finally:
@ -96,19 +266,27 @@
0 search/4096 try: 0 search/4096 try:
>&0 regex \^[[:space:]]*except.*:$ Python script text executable >&0 regex \^[[:space:]]*except.*:$ Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
>&0 search/4096 finally: Python script text executable >&0 search/4096 finally: Python script text executable
!:mime text/x-python !:mime text/x-script.python
# class name[(base classes,)]: [pass] # class name[(base classes,)]: [pass]
0 search/8192 class 0 search/8192 class
>0 regex \^class\ [_[:alpha:]]+(\\(.*\\))?(\ )*:([\ \t]+pass)?$ Python script text executable >0 regex \^class\ [_[:alpha:]]+(\\(.*\\))?(\ )*:([\ \t]+pass)?$ Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
# def name(*args, **kwargs): # def name(*args, **kwargs):
0 search/8192 def\ 0 search/8192 def\
>0 regex \^[[:space:]]{0,50}def\ {1,50}[_a-zA-Z]{1,100} >0 regex \^[[:space:]]{0,50}def\ {1,50}[_a-zA-Z]{1,100}
>>&0 regex \\(([[:alpha:]*_,\ ]){0,255}\\):$ Python script text executable >>&0 regex \\(([[:alpha:]*_,\ ]){0,255}\\):$ Python script text executable
!:strength + 15 !:strength + 15
!:mime text/x-python !:mime text/x-script.python
# https://numpy.org/devdocs/reference/generated/numpy.lib.format.html
0 string \223NUMPY NumPy data file
!:mime application/x-numpy-data
>6 byte x \b, version %d
>7 byte x \b.%d
#>8 leshort x \b, header length=%d
>10 string x \b, description %s

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: riff,v 1.34 2019/04/19 00:42:27 christos Exp $ # $File: riff,v 1.35 2020/06/05 17:15:03 christos Exp $
# riff: file(1) magic for RIFF format # riff: file(1) magic for RIFF format
# See # See
# #
@ -120,11 +120,33 @@
!:mime audio/x-wav !:mime audio/x-wav
>>12 string >\0 >>12 string >\0
>>>12 use riff-walk >>>12 use riff-walk
# Update: Joerg Jenderek
# lower case for Corel Draw version 8 Bidi
>8 string/c cdr
# skip Corel CCX Clipart
>>8 string !CDRXcont
# Corel Draw Picture # Corel Draw Picture
>8 string CDRA \b, Corel Draw Picture >>>0 use corel-draw
!:mime image/x-coreldraw # URL: http://fileformats.archiveteam.org/wiki/CCX_(Corel)
>8 string CDR6 \b, Corel Draw Picture, version 6 # Reference: http://mark0.net/download/triddefs_xml.7z/defs/c/ccx-corel.trid.xml
!:mime image/x-coreldraw >>8 string =CDRXcont \b, Corel Clipart
!:mime application/x-corel-ccx
!:ext ccx
# 3rd chunk data {Corel\040Binary\040Meta\040File}
#>>>20 string x \b, 3rd '%-s'
>>>4 ulelong+8 x \b, %u bytes
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/CorelDRAW
# Reference: http://fileformats.archiveteam.org/wiki/CorelDRAW
# Picture templates created by newer software start with RIFF type CDT
>8 string CDT
>>0 use corel-draw
# Picture templates with version 4.4
>8 string CDST
>>0 use corel-draw
# pattern created by newer software start with RIFF type PAT
>8 string PAT
>>0 use corel-draw
>8 string NUNDROOT \b, Steinberg CuBase >8 string NUNDROOT \b, Steinberg CuBase
# AVI == Audio Video Interleave # AVI == Audio Video Interleave
>8 string AVI\040 \b, AVI >8 string AVI\040 \b, AVI
@ -255,7 +277,87 @@
>8 string WEBP \b, Web/P image >8 string WEBP \b, Web/P image
!:mime image/webp !:mime image/webp
>>12 use riff-walk >>12 use riff-walk
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/CorelDRAW
# Reference: http://fileformats.archiveteam.org/wiki/CorelDRAW
# Note: Since version 3 CorelDraw Pictures are RIFF based
# but data chunks remain proprietary.
# Since version 14 til 15 packed as "content/riffData.cdr" and
# since 16 "content/root.dat" in ZIP container
# TODO: distinguish templates with version 12.5 from Designer illustration 12
# display information of RIFF based Corel Draw pictures, templates and patterns
0 name corel-draw
# display second chunk for debugging
#>8 string x \b, [8]=%.8s
>0 string x \b, Corel Draw
#!:mime image/x-coreldraw
!:mime application/vnd.corel-draw
# used by newer pictures templates
>>8 string CDT
# used by templates with newer versions since 16
>>>12 string =fver Picture template (root.dat)
!:ext dat
# used by templates with older versions with vrsn tag
>>>12 string !fver
# used by templates with older versions 14-15
>>>>11 string >E Picture template (riffData.cdr)
!:ext cdr
# used by templates with older versions 11-13
>>>>11 string <F Picture template
!:ext cdt/cdrt
# used by older templates with version 4.4
>>8 string CDST Picture template
!:ext cdt
# used by templates with version 12.5
>>8 string DESC Picture template
!:ext cdt
# used by newer patterns with version 22
>>8 string PAT Pattern
!:ext dat
# remaining older templates, patterns, drawings
>>8 default x
# pattern with old version 4.y
>>>26 ulelong =0x0000206C Pattern
!:ext pat
# pattern with newer versions
>>>26 ulelong =0x00000D2C Pattern
!:ext pat
# remaining older templates or pictures
>>>26 default x
# used by older versions 5 - 15
>>>>12 string =vrsn
# 4th chunk size unequal 282Ch only found for CDR
>>>>>26 ulelong !0x0000282c Picture
!:ext cdr
>>>>>26 default x Picture or template
!:ext cdr/cdt
# used by newer versions since 16
>>>>12 string =fver Picture (root.dat)
!:ext dat
# version marked by 1 ASCII char: space~3, ... , F~15, ... , N~22, ... R~22 template
>11 string x \b, version
>11 string >\040 '%-.1s'
>0 use corel-version
>4 ulelong+8 x \b, %u bytes
#
# display numeric version of RIFF based Corel after 3rd RIFF tag
0 name corel-version
# for debugging purpose; vrsn for short content; fver for 16 byte size
#>12 string x \b, TAG "%-4.4s"
# 1st data chunk length 2 implies short content version
>16 ulelong 2
# vrsn chunk short content interpreted by MajorVersion * 100 + MinorVersion
>>20 uleshort/100 x %u
>>20 uleshort%100 >0 \b.%u
# for debugging purpose display next chunk like: DISP LIST
#>>22 string x \b, 4th "%-4.4s"
#>>26 ulelong x \b, 4th SIZE 0x%x
# for debugging purpose display 5th chunk like: LIST DISP ccmm osfp
#>>(26.l+30) string x \b, 5th "%-4.4s"
# 1st data chunk length 10h implies 16 byte content with version info
>16 ulelong 0x10
>>34 ubyte x %u
>>>33 ubyte >0 \b.%u
# #
# XXX - some of the below may only appear in little-endian form. # XXX - some of the below may only appear in little-endian form.
# #
@ -292,9 +394,12 @@
>>22 beshort =2 \b, stereo >>22 beshort =2 \b, stereo
>>22 beshort >2 \b, %d channels >>22 beshort >2 \b, %d channels
>>24 belong >0 %d Hz >>24 belong >0 %d Hz
# Corel Draw Picture # Corel Draw Picture big endian not tested by real examples
>8 string CDRA \b, Corel Draw Picture #>8 string CDRA \b, Corel Draw Picture
>8 string CDR6 \b, Corel Draw Picture, version 6 #>8 string CDR6 \b, Corel Draw Picture, version 6
>8 string CDR
>>0 use \^corel-draw
# AVI == Audio Video Interleave # AVI == Audio Video Interleave
>8 string AVI\040 \b, AVI >8 string AVI\040 \b, AVI
# Animated Cursor format # Animated Cursor format

View File

@ -1,11 +1,11 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: rst,v 1.2 2019/11/02 18:41:26 christos Exp $ # $File: rst,v 1.3 2020/04/27 01:50:36 christos Exp $
# rst: ReStructuredText http://docutils.sourceforge.net/rst.html # rst: ReStructuredText http://docutils.sourceforge.net/rst.html
0 search/256 \=\= 0 search/256 \=\=
!:strength + 30 !:strength + 30
>&0 regex/256 \^[\=]+$ >&0 regex/256 \^[\=]+$
>>&0 search/512 :Author: ReStructuredText file >>&0 search/512 :Author: ReStructuredText file
>>&0 default x >>&0 default x
>>>&0 regex/512 \^\.\.[A-Za-z] ReStructuredText file >>>&0 regex/512 \^\\.\\.[A-Za-z] ReStructuredText file
!:ext rst !:ext rst

View File

@ -1,16 +1,94 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: rtf,v 1.7 2009/09/19 16:28:12 christos Exp $ # $File: rtf,v 1.8 2020/05/17 19:28:49 christos Exp $
# rtf: file(1) magic for Rich Text Format (RTF) # rtf: file(1) magic for Rich Text Format (RTF)
# #
# Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk # Duncan P. Simpson, D.P.Simpson@dcs.warwick.ac.uk
# # Update: Joerg Jenderek
0 string {\\rtf Rich Text Format data, # URL: https://en.wikipedia.org/wiki/Rich_Text_Format
# Reference: http://www.snake.net/software/RTF/RTF-Spec-1.7.rtf
# http://www.kleinlercher.at/tools/Windows_Protocols/Word2007RTFSpec9.pdf
0 string {\\rtf
# skip DROID fmt-355-signature-id-522.rtf by looking for valid version
>5 ubyte !0xAB
# skip also \ in DROID fmt-50-signature-id-158.rtf by looking for valid version
>>5 ubyte !0x5C Rich Text Format data
!:mime text/rtf !:mime text/rtf
>5 string 1 version 1, !:apple ????RTF
>>6 string \\ansi ANSI !:ext rtf
>>6 string \\mac Apple Macintosh >>>0 use rtf-info
>>6 string \\pc IBM PC, code page 437 # display information like version, language and code page of RTF
>>6 string \\pca IBM PS/2, code page 850 0 name rtf-info
>>6 default x unknown character set # 1 mostly, 2 for newer Pocket Word documents, space for test like fdo78502.rtf, { for some urtf
>5 default x unknown version >5 ubyte !0x7b \b, version %c
# The word for character set must precede any text or most other control words
>6 string \\mac \b, Apple Macintosh
>6 string \\pc
# control word \pca
>>9 ubyte =0x61 \b, IBM PS/2, code page 850
>>9 ubyte !0x61 \b, IBM PC, code page 437
# unknown character set or ANSI later after control words like
# \adeflang1025 \info \title \author \category \manager
# "Burow, Steffanie - Im Tal des Schneeleoparden.rtf"
#>6 search/105 \\ansi \b, ANSI
>6 search/502 \\ansi \b, ANSI
>6 default x \b, unknown character set
# look for explict codepage keyword
# "Burow, Steffanie - Im Tal des Schneeleoparden.rtf"
#>5 search/110 \\ansicpg
>5 search/500 \\ansicpg
# skip unknown or buggy codepage string 0 like in fdo78502.rtf
>>&0 ubyte !0x30 \b, code page
# codepage string: 437~United States IBM, ..., 1252~WesternEuropean, ..., 57011~Punjabi
>>>&-1 string x %-.3s
# skip space or \ and display possible 4th digit of code page string
>>>&2 ubyte >0x2F
>>>>&-1 ubyte <0x3A \b%c
# possible 5th digit of code page string
>>>>>&0 ubyte >0x2F
>>>>>>&-1 ubyte <0x3A \b%c
# look again at version byte to use default clause
>5 ubyte x
# Default language ID for South Asian/Middle Eastern text
# language ID: 1025, ..., 1065~Persian, ..., 2057~English_UnitedKingdom, ..., 58380~French_NorthAfrica
# Readme-0.72-Persian.rtf
#>6 search/1 \\adeflang \b, default middle east language ID
>>6 search/497 \\adeflang \b, default middle east language ID
# https://docs.microsoft.com/en-us/openspecs/office_standards/ms-oe376/6c085406-a698-4e12-9d4d-c3b0ee3dbc4a
>>>&0 string x %.4s
# skip \ and NL and show possible 5th digit of language string
>>>&4 ubyte >0x2F
>>>>&-1 ubyte <0x3A \b%c
# else look for default language to be used when the \plain control word is encountered
>>6 default x
# "Burow, Steffanie - Im Tal des Schneeleoparden.rtf"
#>>>6 search/127 \\deflang
>>>6 search/505 \\deflang
>>>>&0 string >0 \b, default language ID %-.4s
# possible 5th digit of language string
>>>>&4 ubyte >0x2F
>>>>>&-1 ubyte <0x3A \b%c
# Reference: http://latex2rtf.sourceforge.net/rtfspec_63.html
# Note: no real world example found
0 string {\\urtf Rich Text Format unicoded data
!:mime text/rtf
#!:apple ????RTF
!:ext rtf
>1 use rtf-info
# URL: https://en.wikipedia.org/wiki/Microsoft_Word
# Reference: http://fileformats.archiveteam.org/wiki/Microsoft_Word
# Note: called by TrID "Pocket Word document"
# by PlanMaker "Pocket Word-Handheld PC" for pwd
# by PlanMaker "Pocket Word-Pocket PC" for psw
0 string {\\pwd Pocket Word document or template
# by SoftMaker Office http://extension.nirsoft.net/pwd
#!:mime application/msword
# https://reposcope.com/mimetype/application/x-pocket-word
!:mime application/x-pocket-word
# PWD for Handheld PC variant and PSW for Pocket PC variant
# PWT for template
!:ext pwd/psw/pwt
>0 use rtf-info

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: sgml,v 1.40 2019/09/30 15:44:22 christos Exp $ # $File: sgml,v 1.41 2020/06/07 18:16:43 christos Exp $
# Type: SVG Vectorial Graphics # Type: SVG Vectorial Graphics
# From: Noel Torres <tecnico@ejerciciosresueltos.com> # From: Noel Torres <tecnico@ejerciciosresueltos.com>
0 string \<?xml\ version= 0 string \<?xml\ version=
@ -109,7 +109,7 @@
>15 string/t >\0 %.3s document text >15 string/t >\0 %.3s document text
>>23 search/1 \<xsl:stylesheet (XSL stylesheet) >>23 search/1 \<xsl:stylesheet (XSL stylesheet)
>>24 search/1 \<xsl:stylesheet (XSL stylesheet) >>24 search/1 \<xsl:stylesheet (XSL stylesheet)
0 string \<?xml\ version=' XML 0 string/t \<?xml\ version=' XML
!:mime text/xml !:mime text/xml
!:strength + 5 !:strength + 5
>15 string/t >\0 %.3s document text >15 string/t >\0 %.3s document text

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: sniffer,v 1.27 2019/12/08 18:22:24 christos Exp $ # $File: sniffer,v 1.28 2020/03/13 16:47:29 christos Exp $
# sniffer: file(1) magic for packet capture files # sniffer: file(1) magic for packet capture files
# #
# From: guy@alum.mit.edu (Guy Harris) # From: guy@alum.mit.edu (Guy Harris)
@ -87,183 +87,183 @@
>6 beshort x \b.%d >6 beshort x \b.%d
# clear that continuation level match # clear that continuation level match
>20 clear x >20 clear x
>20 belong 0 (No link-layer encapsulation >20 belong&0x03FFFFFF 0 (No link-layer encapsulation
>20 belong 1 (Ethernet >20 belong&0x03FFFFFF 1 (Ethernet
>20 belong 2 (3Mb Ethernet >20 belong&0x03FFFFFF 2 (3Mb Ethernet
>20 belong 3 (AX.25 >20 belong&0x03FFFFFF 3 (AX.25
>20 belong 4 (ProNET >20 belong&0x03FFFFFF 4 (ProNET
>20 belong 5 (CHAOS >20 belong&0x03FFFFFF 5 (CHAOS
>20 belong 6 (Token Ring >20 belong&0x03FFFFFF 6 (Token Ring
>20 belong 7 (BSD ARCNET >20 belong&0x03FFFFFF 7 (BSD ARCNET
>20 belong 8 (SLIP >20 belong&0x03FFFFFF 8 (SLIP
>20 belong 9 (PPP >20 belong&0x03FFFFFF 9 (PPP
>20 belong 10 (FDDI >20 belong&0x03FFFFFF 10 (FDDI
>20 belong 11 (RFC 1483 ATM >20 belong&0x03FFFFFF 11 (RFC 1483 ATM
>20 belong 12 (Raw IP >20 belong&0x03FFFFFF 12 (Raw IP
>20 belong 13 (BSD/OS SLIP >20 belong&0x03FFFFFF 13 (BSD/OS SLIP
>20 belong 14 (BSD/OS PPP >20 belong&0x03FFFFFF 14 (BSD/OS PPP
>20 belong 19 (Linux ATM Classical IP >20 belong&0x03FFFFFF 19 (Linux ATM Classical IP
>20 belong 50 (PPP or Cisco HDLC >20 belong&0x03FFFFFF 50 (PPP or Cisco HDLC
>20 belong 51 (PPP-over-Ethernet >20 belong&0x03FFFFFF 51 (PPP-over-Ethernet
>20 belong 99 (Symantec Enterprise Firewall >20 belong&0x03FFFFFF 99 (Symantec Enterprise Firewall
>20 belong 100 (RFC 1483 ATM >20 belong&0x03FFFFFF 100 (RFC 1483 ATM
>20 belong 101 (Raw IP >20 belong&0x03FFFFFF 101 (Raw IP
>20 belong 102 (BSD/OS SLIP >20 belong&0x03FFFFFF 102 (BSD/OS SLIP
>20 belong 103 (BSD/OS PPP >20 belong&0x03FFFFFF 103 (BSD/OS PPP
>20 belong 104 (BSD/OS Cisco HDLC >20 belong&0x03FFFFFF 104 (BSD/OS Cisco HDLC
>20 belong 105 (802.11 >20 belong&0x03FFFFFF 105 (802.11
>20 belong 106 (Linux Classical IP over ATM >20 belong&0x03FFFFFF 106 (Linux Classical IP over ATM
>20 belong 107 (Frame Relay >20 belong&0x03FFFFFF 107 (Frame Relay
>20 belong 108 (OpenBSD loopback >20 belong&0x03FFFFFF 108 (OpenBSD loopback
>20 belong 109 (OpenBSD IPsec encrypted >20 belong&0x03FFFFFF 109 (OpenBSD IPsec encrypted
>20 belong 112 (Cisco HDLC >20 belong&0x03FFFFFF 112 (Cisco HDLC
>20 belong 113 (Linux cooked v1 >20 belong&0x03FFFFFF 113 (Linux cooked v1
>20 belong 114 (LocalTalk >20 belong&0x03FFFFFF 114 (LocalTalk
>20 belong 117 (OpenBSD PFLOG >20 belong&0x03FFFFFF 117 (OpenBSD PFLOG
>20 belong 119 (802.11 with Prism header >20 belong&0x03FFFFFF 119 (802.11 with Prism header
>20 belong 122 (RFC 2625 IP over Fibre Channel >20 belong&0x03FFFFFF 122 (RFC 2625 IP over Fibre Channel
>20 belong 123 (SunATM >20 belong&0x03FFFFFF 123 (SunATM
>20 belong 127 (802.11 with radiotap header >20 belong&0x03FFFFFF 127 (802.11 with radiotap header
>20 belong 129 (Linux ARCNET >20 belong&0x03FFFFFF 129 (Linux ARCNET
>20 belong 130 (Juniper Multi-Link PPP >20 belong&0x03FFFFFF 130 (Juniper Multi-Link PPP
>20 belong 131 (Juniper Multi-Link Frame Relay >20 belong&0x03FFFFFF 131 (Juniper Multi-Link Frame Relay
>20 belong 132 (Juniper Encryption Services PIC >20 belong&0x03FFFFFF 132 (Juniper Encryption Services PIC
>20 belong 133 (Juniper GGSN PIC >20 belong&0x03FFFFFF 133 (Juniper GGSN PIC
>20 belong 134 (Juniper FRF.16 Frame Relay >20 belong&0x03FFFFFF 134 (Juniper FRF.16 Frame Relay
>20 belong 135 (Juniper ATM2 PIC >20 belong&0x03FFFFFF 135 (Juniper ATM2 PIC
>20 belong 136 (Juniper Advanced Services PIC >20 belong&0x03FFFFFF 136 (Juniper Advanced Services PIC
>20 belong 137 (Juniper ATM1 PIC >20 belong&0x03FFFFFF 137 (Juniper ATM1 PIC
>20 belong 138 (Apple IP over IEEE 1394 >20 belong&0x03FFFFFF 138 (Apple IP over IEEE 1394
>20 belong 139 (SS7 MTP2 with pseudo-header >20 belong&0x03FFFFFF 139 (SS7 MTP2 with pseudo-header
>20 belong 140 (SS7 MTP2 >20 belong&0x03FFFFFF 140 (SS7 MTP2
>20 belong 141 (SS7 MTP3 >20 belong&0x03FFFFFF 141 (SS7 MTP3
>20 belong 142 (SS7 SCCP >20 belong&0x03FFFFFF 142 (SS7 SCCP
>20 belong 143 (DOCSIS >20 belong&0x03FFFFFF 143 (DOCSIS
>20 belong 144 (Linux IrDA >20 belong&0x03FFFFFF 144 (Linux IrDA
>20 belong 147 (Private use 0 >20 belong&0x03FFFFFF 147 (Private use 0
>20 belong 148 (Private use 1 >20 belong&0x03FFFFFF 148 (Private use 1
>20 belong 149 (Private use 2 >20 belong&0x03FFFFFF 149 (Private use 2
>20 belong 150 (Private use 3 >20 belong&0x03FFFFFF 150 (Private use 3
>20 belong 151 (Private use 4 >20 belong&0x03FFFFFF 151 (Private use 4
>20 belong 152 (Private use 5 >20 belong&0x03FFFFFF 152 (Private use 5
>20 belong 153 (Private use 6 >20 belong&0x03FFFFFF 153 (Private use 6
>20 belong 154 (Private use 7 >20 belong&0x03FFFFFF 154 (Private use 7
>20 belong 155 (Private use 8 >20 belong&0x03FFFFFF 155 (Private use 8
>20 belong 156 (Private use 9 >20 belong&0x03FFFFFF 156 (Private use 9
>20 belong 157 (Private use 10 >20 belong&0x03FFFFFF 157 (Private use 10
>20 belong 158 (Private use 11 >20 belong&0x03FFFFFF 158 (Private use 11
>20 belong 159 (Private use 12 >20 belong&0x03FFFFFF 159 (Private use 12
>20 belong 160 (Private use 13 >20 belong&0x03FFFFFF 160 (Private use 13
>20 belong 161 (Private use 14 >20 belong&0x03FFFFFF 161 (Private use 14
>20 belong 162 (Private use 15 >20 belong&0x03FFFFFF 162 (Private use 15
>20 belong 163 (802.11 with AVS header >20 belong&0x03FFFFFF 163 (802.11 with AVS header
>20 belong 164 (Juniper Passive Monitor PIC >20 belong&0x03FFFFFF 164 (Juniper Passive Monitor PIC
>20 belong 165 (BACnet MS/TP >20 belong&0x03FFFFFF 165 (BACnet MS/TP
>20 belong 166 (PPPD >20 belong&0x03FFFFFF 166 (PPPD
>20 belong 167 (Juniper PPPoE >20 belong&0x03FFFFFF 167 (Juniper PPPoE
>20 belong 168 (Juniper PPPoE/ATM >20 belong&0x03FFFFFF 168 (Juniper PPPoE/ATM
>20 belong 169 (GPRS LLC >20 belong&0x03FFFFFF 169 (GPRS LLC
>20 belong 170 (GPF-T >20 belong&0x03FFFFFF 170 (GPF-T
>20 belong 171 (GPF-F >20 belong&0x03FFFFFF 171 (GPF-F
>20 belong 174 (Juniper PIC Peer >20 belong&0x03FFFFFF 174 (Juniper PIC Peer
>20 belong 175 (Ethernet with Endace ERF header >20 belong&0x03FFFFFF 175 (Ethernet with Endace ERF header
>20 belong 176 (Packet-over-SONET with Endace ERF header >20 belong&0x03FFFFFF 176 (Packet-over-SONET with Endace ERF header
>20 belong 177 (Linux LAPD >20 belong&0x03FFFFFF 177 (Linux LAPD
>20 belong 178 (Juniper Ethernet >20 belong&0x03FFFFFF 178 (Juniper Ethernet
>20 belong 179 (Juniper PPP >20 belong&0x03FFFFFF 179 (Juniper PPP
>20 belong 180 (Juniper Frame Relay >20 belong&0x03FFFFFF 180 (Juniper Frame Relay
>20 belong 181 (Juniper C-HDLC >20 belong&0x03FFFFFF 181 (Juniper C-HDLC
>20 belong 182 (FRF.16 Frame Relay >20 belong&0x03FFFFFF 182 (FRF.16 Frame Relay
>20 belong 183 (Juniper Voice PIC >20 belong&0x03FFFFFF 183 (Juniper Voice PIC
>20 belong 184 (Arinc 429 >20 belong&0x03FFFFFF 184 (Arinc 429
>20 belong 185 (Arinc 653 Interpartition Communication >20 belong&0x03FFFFFF 185 (Arinc 653 Interpartition Communication
>20 belong 186 (USB with FreeBSD header >20 belong&0x03FFFFFF 186 (USB with FreeBSD header
>20 belong 187 (Bluetooth HCI H4 >20 belong&0x03FFFFFF 187 (Bluetooth HCI H4
>20 belong 188 (802.16 MAC Common Part Sublayer >20 belong&0x03FFFFFF 188 (802.16 MAC Common Part Sublayer
>20 belong 189 (Linux USB >20 belong&0x03FFFFFF 189 (Linux USB
>20 belong 190 (Controller Area Network (CAN) v. 2.0B >20 belong&0x03FFFFFF 190 (Controller Area Network (CAN) v. 2.0B
>20 belong 191 (802.15.4 with Linux padding >20 belong&0x03FFFFFF 191 (802.15.4 with Linux padding
>20 belong 192 (PPI >20 belong&0x03FFFFFF 192 (PPI
>20 belong 193 (802.16 MAC Common Part Sublayer plus radiotap header >20 belong&0x03FFFFFF 193 (802.16 MAC Common Part Sublayer plus radiotap header
>20 belong 194 (Juniper Integrated Service Module >20 belong&0x03FFFFFF 194 (Juniper Integrated Service Module
>20 belong 195 (802.15.4 with FCS >20 belong&0x03FFFFFF 195 (802.15.4 with FCS
>20 belong 196 (SITA >20 belong&0x03FFFFFF 196 (SITA
>20 belong 197 (Endace ERF >20 belong&0x03FFFFFF 197 (Endace ERF
>20 belong 198 (Ethernet with u10 Networks pseudo-header >20 belong&0x03FFFFFF 198 (Ethernet with u10 Networks pseudo-header
>20 belong 199 (IPMB >20 belong&0x03FFFFFF 199 (IPMB
>20 belong 200 (Juniper Secure Tunnel >20 belong&0x03FFFFFF 200 (Juniper Secure Tunnel
>20 belong 201 (Bluetooth HCI H4 with pseudo-header >20 belong&0x03FFFFFF 201 (Bluetooth HCI H4 with pseudo-header
>20 belong 202 (AX.25 with KISS header >20 belong&0x03FFFFFF 202 (AX.25 with KISS header
>20 belong 203 (LAPD >20 belong&0x03FFFFFF 203 (LAPD
>20 belong 204 (PPP with direction pseudo-header >20 belong&0x03FFFFFF 204 (PPP with direction pseudo-header
>20 belong 205 (Cisco HDLC with direction pseudo-header >20 belong&0x03FFFFFF 205 (Cisco HDLC with direction pseudo-header
>20 belong 206 (Frame Relay with direction pseudo-header >20 belong&0x03FFFFFF 206 (Frame Relay with direction pseudo-header
>20 belong 209 (Linux IPMB >20 belong&0x03FFFFFF 209 (Linux IPMB
>20 belong 215 (802.15.4 with non-ASK PHY header >20 belong&0x03FFFFFF 215 (802.15.4 with non-ASK PHY header
>20 belong 216 (Linux evdev events >20 belong&0x03FFFFFF 216 (Linux evdev events
>20 belong 219 (MPLS with label as link-layer header >20 belong&0x03FFFFFF 219 (MPLS with label as link-layer header
>20 belong 220 (Memory-mapped Linux USB >20 belong&0x03FFFFFF 220 (Memory-mapped Linux USB
>20 belong 221 (DECT >20 belong&0x03FFFFFF 221 (DECT
>20 belong 222 (AOS Space Data Link protocol >20 belong&0x03FFFFFF 222 (AOS Space Data Link protocol
>20 belong 223 (Wireless HART >20 belong&0x03FFFFFF 223 (Wireless HART
>20 belong 224 (Fibre Channel FC-2 >20 belong&0x03FFFFFF 224 (Fibre Channel FC-2
>20 belong 225 (Fibre Channel FC-2 with frame delimiters >20 belong&0x03FFFFFF 225 (Fibre Channel FC-2 with frame delimiters
>20 belong 226 (Solaris IPNET >20 belong&0x03FFFFFF 226 (Solaris IPNET
>20 belong 227 (SocketCAN >20 belong&0x03FFFFFF 227 (SocketCAN
>20 belong 228 (Raw IPv4 >20 belong&0x03FFFFFF 228 (Raw IPv4
>20 belong 229 (Raw IPv6 >20 belong&0x03FFFFFF 229 (Raw IPv6
>20 belong 230 (802.15.4 without FCS >20 belong&0x03FFFFFF 230 (802.15.4 without FCS
>20 belong 231 (D-Bus messages >20 belong&0x03FFFFFF 231 (D-Bus messages
>20 belong 232 (Juniper Virtual Server >20 belong&0x03FFFFFF 232 (Juniper Virtual Server
>20 belong 233 (Juniper SRX E2E >20 belong&0x03FFFFFF 233 (Juniper SRX E2E
>20 belong 234 (Juniper Fibre Channel >20 belong&0x03FFFFFF 234 (Juniper Fibre Channel
>20 belong 235 (DVB-CI >20 belong&0x03FFFFFF 235 (DVB-CI
>20 belong 236 (MUX27010 >20 belong&0x03FFFFFF 236 (MUX27010
>20 belong 237 (STANAG 5066 D_PDUs >20 belong&0x03FFFFFF 237 (STANAG 5066 D_PDUs
>20 belong 238 (Juniper ATM CEMIC >20 belong&0x03FFFFFF 238 (Juniper ATM CEMIC
>20 belong 239 (Linux netfilter log messages >20 belong&0x03FFFFFF 239 (Linux netfilter log messages
>20 belong 240 (Hilscher netAnalyzer >20 belong&0x03FFFFFF 240 (Hilscher netAnalyzer
>20 belong 241 (Hilscher netAnalyzer with delimiters >20 belong&0x03FFFFFF 241 (Hilscher netAnalyzer with delimiters
>20 belong 242 (IP-over-Infiniband >20 belong&0x03FFFFFF 242 (IP-over-Infiniband
>20 belong 243 (MPEG-2 Transport Stream packets >20 belong&0x03FFFFFF 243 (MPEG-2 Transport Stream packets
>20 belong 244 (ng4t ng40 >20 belong&0x03FFFFFF 244 (ng4t ng40
>20 belong 245 (NFC LLCP >20 belong&0x03FFFFFF 245 (NFC LLCP
>20 belong 246 (Packet filter state syncing >20 belong&0x03FFFFFF 246 (Packet filter state syncing
>20 belong 247 (InfiniBand >20 belong&0x03FFFFFF 247 (InfiniBand
>20 belong 248 (SCTP >20 belong&0x03FFFFFF 248 (SCTP
>20 belong 249 (USB with USBPcap header >20 belong&0x03FFFFFF 249 (USB with USBPcap header
>20 belong 250 (Schweitzer Engineering Laboratories RTAC packets >20 belong&0x03FFFFFF 250 (Schweitzer Engineering Laboratories RTAC packets
>20 belong 251 (Bluetooth Low Energy air interface >20 belong&0x03FFFFFF 251 (Bluetooth Low Energy air interface
>20 belong 252 (Wireshark Upper PDU export >20 belong&0x03FFFFFF 252 (Wireshark Upper PDU export
>20 belong 253 (Linux netlink >20 belong&0x03FFFFFF 253 (Linux netlink
>20 belong 254 (Bluetooth Linux Monitor >20 belong&0x03FFFFFF 254 (Bluetooth Linux Monitor
>20 belong 255 (Bluetooth Basic Rate/Enhanced Data Rate baseband packets >20 belong&0x03FFFFFF 255 (Bluetooth Basic Rate/Enhanced Data Rate baseband packets
>20 belong 256 (Bluetooth Low Energy air interface with pseudo-header >20 belong&0x03FFFFFF 256 (Bluetooth Low Energy air interface with pseudo-header
>20 belong 257 (PROFIBUS data link layer >20 belong&0x03FFFFFF 257 (PROFIBUS data link layer
>20 belong 258 (Apple DLT_PKTAP >20 belong&0x03FFFFFF 258 (Apple DLT_PKTAP
>20 belong 259 (Ethernet with 802.3 Clause 65 EPON preamble >20 belong&0x03FFFFFF 259 (Ethernet with 802.3 Clause 65 EPON preamble
>20 belong 260 (IPMI trace packets >20 belong&0x03FFFFFF 260 (IPMI trace packets
>20 belong 261 (Z-Wave RF profile R1 and R2 packets >20 belong&0x03FFFFFF 261 (Z-Wave RF profile R1 and R2 packets
>20 belong 262 (Z-Wave RF profile R3 packets >20 belong&0x03FFFFFF 262 (Z-Wave RF profile R3 packets
>20 belong 263 (WattStopper Digital Lighting Mngmt/Legrand Nitoo Open Proto >20 belong&0x03FFFFFF 263 (WattStopper Digital Lighting Mngmt/Legrand Nitoo Open Proto
>20 belong 264 (ISO 14443 messages >20 belong&0x03FFFFFF 264 (ISO 14443 messages
>20 belong 265 (IEC 62106 Radio Data System groups >20 belong&0x03FFFFFF 265 (IEC 62106 Radio Data System groups
>20 belong 266 (USB with Darwin header >20 belong&0x03FFFFFF 266 (USB with Darwin header
>20 belong 267 (OpenBSD DLT_OPENFLOW >20 belong&0x03FFFFFF 267 (OpenBSD DLT_OPENFLOW
>20 belong 268 (IBM SDLC frames >20 belong&0x03FFFFFF 268 (IBM SDLC frames
>20 belong 269 (TI LLN sniffer frames >20 belong&0x03FFFFFF 269 (TI LLN sniffer frames
>20 belong 271 (Linux vsock >20 belong&0x03FFFFFF 271 (Linux vsock
>20 belong 272 (Nordic Semiconductor Bluetooth LE sniffer frames >20 belong&0x03FFFFFF 272 (Nordic Semiconductor Bluetooth LE sniffer frames
>20 belong 273 (Excentis XRA-31 DOCSIS 3.1 RF sniffer frames >20 belong&0x03FFFFFF 273 (Excentis XRA-31 DOCSIS 3.1 RF sniffer frames
>20 belong 274 (802.3br mPackets >20 belong&0x03FFFFFF 274 (802.3br mPackets
>20 belong 275 (DisplayPort AUX channel monitoring data >20 belong&0x03FFFFFF 275 (DisplayPort AUX channel monitoring data
>20 belong 276 (Linux cooked v2 >20 belong&0x03FFFFFF 276 (Linux cooked v2
>20 belong 278 (OpenVizsla USB >20 belong&0x03FFFFFF 278 (OpenVizsla USB
>20 belong 279 (Elektrobit High Speed Capture and Replay (EBHSCR) >20 belong&0x03FFFFFF 279 (Elektrobit High Speed Capture and Replay (EBHSCR)
>20 belong 281 (Broadcom tag >20 belong&0x03FFFFFF 281 (Broadcom tag
>20 belong 282 (Broadcom tag (prepended) >20 belong&0x03FFFFFF 282 (Broadcom tag (prepended)
>20 belong 284 (Marvell DSA >20 belong&0x03FFFFFF 284 (Marvell DSA
>20 belong 285 (Marvell EDSA >20 belong&0x03FFFFFF 285 (Marvell EDSA
# print default match # print default match
>20 default x >20 default x
>>20 belong x (linktype#%u >>20 belong x (linktype#%u

View File

@ -17,3 +17,23 @@
>>12 ubequad x \b, version %llx >>12 ubequad x \b, version %llx
>>>20 beqdate x \b, generated %s >>>20 beqdate x \b, generated %s
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/PuTTY
# Reference: https://the.earth.li/~sgtatham/putty/latest/putty-0.73.tar.gz
# /sshpubk.c
0 string PuTTY-User-Key-File- PuTTY Private Key File
#!:mime text/plain
# https://github.com/github/putty/blob/master/windows/installer.wxs
!:mime application/x-putty-private-key
!:ext ppk
# version 1 or 2
>20 string x \b, version %.1s
# name of the algorithm like: ssh-dss ssh-rsa ecdsa-sha2-nistp256 ssh-ed25519
>23 string x \b, algorithm %s
# next line says "Encryption: " plus an encryption type like aes256-cbc or none
>32 search/13 Encryption:\040 \b, Encryption
>>&0 string x %s
# next line says "Comment: " plus the comment string
>>>&0 search/3 Comment:\040
>>>>&0 string x "%s"

View File

@ -0,0 +1,36 @@
#------------------------------------------------------------------------------
# $File: sylk,v 1.1 2020/04/05 22:18:34 christos Exp $
# sylk: file(1) magic for SYLK text files
# From: Joerg Jenderek
# URL: https://en.wikipedia.org/wiki/SYmbolic_LinK_%28SYLK%29
# http://fileformats.archiveteam.org/wiki/SYLK
# Note: called by TrID "SYLK - SYmbolic LinK data",
# by DROID "Microsoft Symbolic Link (SYLK) File"
# by FreeDesktop.org "spreadsheet interchange document"
0 string ID;P
# skip short DROID x-fmt-106-signature-id-603.slk
>7 ubyte >0 spreadsheet interchange document
# https://reposcope.com/mimetype/text/spreadsheet
#!:mime text/spreadsheet
# https://reposcope.com/mimetype/application/x-sylk by Gnumeric
!:mime application/x-sylk
!:ext slk/sylk
>>4 ubyte >037 \b, created by
# Gnumeric, pmw~PlanMaker, CALCOOO32~LibreOffice OpenOffice, SCALC3~StarOffice
# MP~Multiplan, XL~Excel WXL~Excel Windows
>>>4 string Gnumeric Gnumeric
>>>4 string pmw PlanMaker
>>>4 string CALCOOO32 Libre/OpenOffice Calc
>>>4 string SCALC3 StarOffice Calc
>>>4 string XL Excel
# Excel, version probably running on Windows
>>>4 string WXL Excel
# not tested
>>>4 string MP Multiplan
# unknown spreadsheet software
>>>4 default x
>>>>4 string x %s

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: ti-8x,v 1.7 2014/04/30 21:41:02 christos Exp $ # $File: ti-8x,v 1.8 2020/02/12 22:13:01 christos Exp $
# ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators. # ti-8x: file(1) magic for the TI-8x and TI-9x Graphing Calculators.
# #
# From: Ryan McGuire (rmcguire@freenet.columbus.oh.us). # From: Ryan McGuire (rmcguire@freenet.columbus.oh.us).
@ -206,7 +206,7 @@
# #
# Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades # Magic Numbers for the TI-73/83+/89/92+/V200 FLASH upgrades
# #
0x0000016 string Advanced TI-XX Graphing Calculator (FLASH) #0x0000016 string Advanced TI-XX Graphing Calculator (FLASH)
0 string **TIFL** TI-XX Graphing Calculator (FLASH) 0 string **TIFL** TI-XX Graphing Calculator (FLASH)
>8 byte >0 - Revision %d >8 byte >0 - Revision %d
>>9 byte x \b.%d, >>9 byte x \b.%d,

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: tplink,v 1.4 2019/04/19 00:42:27 christos Exp $ # $File: tplink,v 1.5 2020/03/28 23:14:26 christos Exp $
# tplink: File magic for openwrt firmware files # tplink: File magic for openwrt firmware files
# URL: https://wiki.openwrt.org/doc/techref/header # URL: https://wiki.openwrt.org/doc/techref/header
@ -13,7 +13,9 @@
>>0x100 long 0 >>0x100 long 0
# skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor # skip Norton Commander Cleanup Utility NCCLEAN.INI by looking for valid vendor
>>>4 ubelong >0x1F000000 >>>4 ubelong >0x1F000000
>>>>0 use firmware-tplink # skip user.dbt by looking for positive hardware id
>>>>0x40 ubeshort >0
>>>>>0 use firmware-tplink
0 name firmware-tplink 0 name firmware-tplink
>0 ubyte x firmware >0 ubyte x firmware

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: troff,v 1.11 2014/06/03 19:01:34 christos Exp $ # $File: troff,v 1.13 2020/05/30 23:12:34 christos Exp $
# troff: file(1) magic for *roff # troff: file(1) magic for *roff
# #
# updated by Daniel Quinlan (quinlan@yggdrasil.com) # updated by Daniel Quinlan (quinlan@yggdrasil.com)
@ -14,11 +14,11 @@
!:mime text/troff !:mime text/troff
0 search/1 \\" troff or preprocessor input text 0 search/1 \\" troff or preprocessor input text
!:mime text/troff !:mime text/troff
0 search/1 ''' troff or preprocessor input text #0 search/1 ''' troff or preprocessor input text
#!:mime text/troff
0 regex/20l \^\\.[A-Za-z][A-Za-z0-9][\ \t] troff or preprocessor input text
!:mime text/troff !:mime text/troff
0 regex/20l \^\\.[A-Za-z0-9][A-Za-z0-9][\ \t] troff or preprocessor input text 0 regex/20l \^\\.[A-Za-z][A-Za-z0-9]$ troff or preprocessor input text
!:mime text/troff
0 regex/20l \^\\.[A-Za-z0-9][A-Za-z0-9]$ troff or preprocessor input text
!:mime text/troff !:mime text/troff
# ditroff intermediate output text # ditroff intermediate output text

View File

@ -0,0 +1,12 @@
#------------------------------------------------------------------------------
# $File: unisig,v 1.1 2020/04/09 19:05:44 christos Exp $
# unisig: file(1) magic for files carrying a uniform signature (Unisig)
# From: Lassi Kortela, John Cowan
# URL: https://github.com/unisig
#
0 string \xDC\xDC\x0D\x0A\x1A\x0A\x00 Unisig:
>7 ubyte =0 UUID
>>8 guid x %s
>7 ubyte >0 URI
>>7 pstring x %s

View File

@ -0,0 +1,21 @@
#------------------------------------------------------------------------------
# $File: usd,v 1.2 2020/05/21 22:17:00 christos Exp $
#
# From Christian Schmidbauer
#
# https://github.com/PixarAnimationStudios/USD
# USD crate file
# https://github.com/PixarAnimationStudios/USD/blob/ebac0a8b6703f4fa1c27115f1f013bb9819662f4/pxr/usd/usd/crateFile.h#L441-L450
0 string PXR-USDC USD crate
>8 byte x \b, version %x.
>9 byte x \b%x.
>10 byte x \b%x
!:ext usd
# USD ASCII file
0 string #usda\040 USD ASCII
>6 string x \b, version %s
!:mime text/plain
!:ext usd

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: virtual,v 1.10 2019/04/19 00:42:27 christos Exp $ # $File: virtual,v 1.12 2020/02/15 01:20:15 christos Exp $
# From: James Nobis <quel@quelrod.net> # From: James Nobis <quel@quelrod.net>
# Microsoft hard disk images for: # Microsoft hard disk images for:
# Virtual Server # Virtual Server

View File

@ -0,0 +1,12 @@
#------------------------------------------------------------------------------
# $File: web,v 1.1 2020/05/17 19:14:28 christos Exp $
# http://www.rdfhdt.org/
# From Christoph Biedl
# http://www.rdfhdt.org/hdt-internals/
# https://github.com/rdfhdt/hdt-cpp
0 string $HDT\x01 HDT file (binary compressed indexed RDF triples) type 1
!:mime application/vnd.hdt
!:ext hdt

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: windows,v 1.29 2019/11/18 03:11:20 christos Exp $ # $File: windows,v 1.31 2020/03/15 16:44:37 christos Exp $
# windows: file(1) magic for Microsoft Windows # windows: file(1) magic for Microsoft Windows
# #
# This file is mainly reserved for files where programs # This file is mainly reserved for files where programs
@ -620,104 +620,144 @@
# Windows Precompiled INF files *.PNF added by Joerg Jenderek at Mar 2013 of _PNF_HEADER inf.h # Windows Precompiled INF files *.PNF added by Joerg Jenderek at Mar 2013 of _PNF_HEADER inf.h
# http://read.pudn.com/downloads3/sourcecode/windows/248345/win2k/private/windows/setup/setupapi/inf.h__.htm # http://read.pudn.com/downloads3/sourcecode/windows/248345/win2k/private/windows/setup/setupapi/inf.h__.htm
# GRR: line below too general as it catches also PDP-11 UNIX/RT ldp # URL: http://fileformats.archiveteam.org/wiki/INF_(Windows)
0 leshort&0xFeFe 0x0000 # Reference: http://en.verysource.com/code/10350344_1/inf.h.html
!:strength -5 # Note: stored in %Windir%\Inf %Windir%\System32\DriverStore\FileRepository
# test for unused null bits in PNF_FLAGs # check for valid major and minor versions: 101h - 303h
>4 ulelong&0xFCffFe00 0x00000000 0 leshort&0xFcFc =0x0000
# only found 58h for Offset of WinDirPath immediately after _PNF_HEADER structure # GRR: line above (strength 50) is too general as it catches also "PDP-11 UNIX/RT ldp" ./pdp
>>68 ulelong >0x57 >0 leshort&0x0303 !0x0000
# test for zero high byte of InfValueBlockSize, followed by WinDirPath like # test for valid InfStyles: 1 2
# C:\WINDOWS (ASCII 0x433a5c.. , unicode 0x43003a005c..) or X:\MININT >>2 uleshort >0
>>>(68.l-1) ubelong&0xffE0C519 =0x00400018 Windows Precompiled iNF >>>2 uleshort <3
# look for colon in WinDirPath after PNF header
#>>>>0x59 search/18 :
>>>>0 use PreCompiledInf
0 name PreCompiledInf
>0 uleshort x Windows Precompiled iNF
!:mime application/x-pnf !:mime application/x-pnf
# currently only found Major Version=1 and Minor Version=1 !:ext pnf
#>>>>0 uleshort =0x0101 # major version 1 for older Windows like XP and 3 since about Windows Vista
#>>>>>1 ubyte x \b, version %u # 101h~98-XP; 301h~Windows Vista-7 ; 302h~Windows 10 14393; 303h~Windows 10 18362
#>>>>>0 ubyte x \b.%u >1 ubyte x \b, version %u
>>>>0 uleshort !0x0101 >0 ubyte x \b.%u
>>>>>1 ubyte x \b, version %u >0 uleshort =0x0101 (Windows
>>>>>0 ubyte x \b.%u >>4 ulelong&0x00000001 !0x00000001 98)
>>4 ulelong&0x00000001 =0x00000001 XP)
>0 uleshort =0x0301 (Windows Vista-8.1)
>0 uleshort =0x0302 (Windows 10 older)
>0 uleshort =0x0303 (Windows 10)
# 1 ,2 (windows 98 SE) # 1 ,2 (windows 98 SE)
#>>>>2 uleshort =2 \b, InfStyle %u >2 uleshort !2 \b, InfStyle %u
>>>>2 uleshort !2 \b, InfStyle %u
# PNF_FLAG_IS_UNICODE 0x00000001 # PNF_FLAG_IS_UNICODE 0x00000001
# PNF_FLAG_HAS_STRINGS 0x00000002 # PNF_FLAG_HAS_STRINGS 0x00000002
# PNF_FLAG_SRCPATH_IS_URL 0x00000004 # PNF_FLAG_SRCPATH_IS_URL 0x00000004
# PNF_FLAG_HAS_VOLATILE_DIRIDS 0x00000008 # PNF_FLAG_HAS_VOLATILE_DIRIDS 0x00000008
# PNF_FLAG_INF_VERIFIED 0x00000010 # PNF_FLAG_INF_VERIFIED 0x00000010
# PNF_FLAG_INF_DIGITALLY_SIGNED 0x00000020 # PNF_FLAG_INF_DIGITALLY_SIGNED 0x00000020
# ?? 0x00000100 # UNKNOWN8 0x00000080
# ?? 0x01000000 # UNKNOWN 0x00000100
# ?? 0x02000000 # UNKNOWN1 0x01000000
>>>>4 ulelong&0x00000001 0x00000001 \b, unicoded # UNKNOWN2 0x02000000
>>>>4 ulelong&0x00000020 0x00000020 \b, digitally signed >4 ulelong&0x03000180 >0 \b, flags
#>>>>8 ulelong x \b, InfSubstValueListOffset 0x%x >>4 ulelong x 0x%x
>4 ulelong&0x00000001 0x00000001 \b, unicoded
>4 ulelong&0x00000002 0x00000002 \b, has strings
>4 ulelong&0x00000004 0x00000004 \b, src URL
>4 ulelong&0x00000008 0x00000008 \b, volatile dir ids
>4 ulelong&0x00000010 0x00000010 \b, verified
>4 ulelong&0x00000020 0x00000020 \b, digitally signed
# >4 ulelong&0x00000080 0x00000080 \b, UNKNOWN8
# >4 ulelong&0x00000100 0x00000100 \b, UNKNOWN
# >4 ulelong&0x01000000 0x01000000 \b, UNKNOWN1
# >4 ulelong&0x02000000 0x02000000 \b, UNKNOWN2
#>8 ulelong x \b, InfSubstValueListOffset 0x%x
# many 0, 1 lmouusb.PNF, 2 linkfx10.PNF , f webfdr16.PNF # many 0, 1 lmouusb.PNF, 2 linkfx10.PNF , f webfdr16.PNF
#>>>>12 uleshort x \b, InfSubstValueCount 0x%x # , 6 bth.PNF, 9 usbport.PNF, d netnwifi.PNF, 10h nettcpip.PNF
# only < 9 found #>12 uleshort x \b, InfSubstValueCount 0x%x
#>>>>14 uleshort x \b, InfVersionDatumCount 0x%x # only < 9 found: 8 hcw85b64.PNF
# only found values lower 0x0000ffff #>14 uleshort x \b, InfVersionDatumCount 0x%x
#>>>>16 ulelong x \b, InfVersionDataSize 0x%x # only found values lower 0x0000ffff ??
#>16 ulelong x \b, InfVersionDataSize 0x%x
# only found positive values lower 0x00ffFFff for InfVersionDataOffset # only found positive values lower 0x00ffFFff for InfVersionDataOffset
>>>>20 ulelong x \b, at 0x%x >20 ulelong x \b, at 0x%x
>>>>4 ulelong&0x00000001 =0x00000001 >4 ulelong&0x00000001 =0x00000001
# case independent: CatalogFile Class DriverVer layoutfile LayoutFile SetupClass signature Signature # case independent: CatalogFile Class DriverVer layoutfile LayoutFile SetupClass signature Signature
>>>>>(20.l) lestring16 x "%s" >>(20.l) lestring16 x "%s"
>>>>4 ulelong&0x00000001 !0x00000001 >4 ulelong&0x00000001 !0x00000001
>>>>>(20.l) string x "%s" >>(20.l) string x "%s"
# FILETIME is number of 100-nanosecond intervals since 1 January 1601 # FILETIME is number of 100-nanosecond intervals since 1 January 1601
#>>>>24 ulequad x \b, InfVersionLastWriteTime %16.16llx #>24 ulequad x \b, InfVersionLastWriteTime %16.16llx
#>24 foodate-0xbar x \b, InfVersionLastWriteTime %s
# for Windows 98, XP
>0 uleshort <0x0102
# only found values lower 0x00ffFFff # only found values lower 0x00ffFFff
#>>>>32 ulelong x \b, StringTableBlockOffset 0x%x # often 70 but also 78h for corelist.PNF
#>>>>36 ulelong x \b, StringTableBlockSize 0x%x # >>32 ulelong x \b, StringTableBlockOffset 0x%x
#>>>>40 ulelong x \b, InfSectionCount 0x%x # >>36 ulelong x \b, StringTableBlockSize 0x%x
#>>>>44 ulelong x \b, InfSectionBlockOffset 0x%x # >>40 ulelong x \b, InfSectionCount 0x%x
#>>>>48 ulelong x \b, InfSectionBlockSize 0x%x # >>44 ulelong x \b, InfSectionBlockOffset 0x%x
#>>>>52 ulelong x \b, InfLineBlockOffset 0x%x # >>48 ulelong x \b, InfSectionBlockSize 0x%x
#>>>>56 ulelong x \b, InfLineBlockSize 0x%x # >>52 ulelong x \b, InfLineBlockOffset 0x%x
#>>>>60 ulelong x \b, InfValueBlockOffset 0x%x # >>56 ulelong x \b, InfLineBlockSize 0x%x
#>>>>64 ulelong x \b, InfValueBlockSize 0x%x # >>60 ulelong x \b, InfValueBlockOffset 0x%x
# >>64 ulelong x \b, InfValueBlockSize 0x%x
# WinDirPathOffset # WinDirPathOffset
#>>>>68 ulelong x \b, at 0x%x # like 58h, which means direct after PNF header
>>>>68 ulelong >0x57 #>>68 ulelong x \b, at 0x%x
>>>>>4 ulelong&0x00000001 =0x00000001 >>68 ulelong x
>>>>>>(68.l) ubequad =0x43003a005c005700 >>>4 ulelong&0x00000001 =0x00000001
#>>>>(68.l) ubequad =0x43003a005c005700
# normally unicoded C:\Windows # normally unicoded C:\Windows
#>>>>>>>(68.l) lestring16 x \b, WinDirPath "%s" #>>>>>(68.l) lestring16 x \b, WinDirPath "%s"
>>>>>>(68.l) ubequad !0x43003a005c005700 >>>>(68.l) ubequad !0x43003a005c005700
>>>>>>>(68.l) lestring16 x \b, WinDirPath "%s" >>>>>(68.l) lestring16 x \b, WinDirPath "%s"
>>>>>4 ulelong&0x00000001 !0x00000001 >>>4 ulelong&0x00000001 !0x00000001
# normally ASCII C:\WINDOWS # normally ASCII C:\WINDOWS
#>>>>>>(68.l) string =C:\\WINDOWS \b, WinDirPath "%s" #>>>>(68.l) string =C:\\WINDOWS \b, WinDirPath "%s"
>>>>>>(68.l) string !C:\\WINDOWS \b, WinDirPath "%s" >>>>(68.l) string !C:\\WINDOWS
>>>>>(68.l) string x \b, WinDirPath "%s"
# found OsLoaderPathOffset values often 0 , once 70h corelist.PNF, once 68h ASCII machine.PNF # found OsLoaderPathOffset values often 0 , once 70h corelist.PNF, once 68h ASCII machine.PNF
#>>>>72 ulelong >0 \b, at 0x%x >>>72 ulelong >0 \b,
>>>>72 ulelong >0 \b, >>>>4 ulelong&0x00000001 =0x00000001
>>>>>4 ulelong&0x00000001 =0x00000001 >>>>>(72.l) lestring16 x OsLoaderPath "%s"
>>>>>>(72.l) lestring16 x OsLoaderPath "%s" >>>>4 ulelong&0x00000001 !0x00000001
>>>>>4 ulelong&0x00000001 !0x00000001
# seldom C:\ instead empty # seldom C:\ instead empty
>>>>>>(72.l) string x OsLoaderPath "%s" >>>>>(72.l) string x OsLoaderPath "%s"
# 1fdh # 1fdh
#>>>>76 uleshort x \b, StringTableHashBucketCount 0x%x #>>>76 uleshort x \b, StringTableHashBucketCount 0x%x
>>>>78 uleshort !0x407 \b, LanguageId %x
# only 407h found # only 407h found
#>>>>78 uleshort =0x407 \b, LanguageId %x >>>78 uleshort !0x409 \b, LanguageID %x
#>>>78 uleshort =0x409 \b, LanguageID %x
# InfSourcePathOffset often 0 # InfSourcePathOffset often 0
#>>>>80 ulelong >0 \b, at 0x%x >>>80 ulelong >0 \b, at 0x%x
>>>>80 ulelong >0 \b, >>>>4 ulelong&0x00000001 =0x00000001
>>>>>4 ulelong&0x00000001 =0x00000001 >>>>>(80.l) lestring16 x SourcePath "%s"
>>>>>>(80.l) lestring16 x SourcePath "%s" >>>>4 ulelong&0x00000001 !0x00000001
>>>>>4 ulelong&0x00000001 !0x00000001 >>>>>(80.l) string >\0 SourcePath "%s"
>>>>>>(80.l) string >\0 SourcePath "%s"
# OriginalInfNameOffset often 0 # OriginalInfNameOffset often 0
#>>>>84 ulelong >0 \b, at 0x%x >>>84 ulelong >0 \b, at 0x%x
>>>>84 ulelong >0 \b, >>>>4 ulelong&0x00000001 =0x00000001
>>>>>4 ulelong&0x00000001 =0x00000001 >>>>>(84.l) lestring16 x InfName "%s"
>>>>>>(84.l) lestring16 x InfName "%s" >>>>4 ulelong&0x00000001 !0x00000001
>>>>>4 ulelong&0x00000001 !0x00000001 >>>>>(84.l) string >\0 InfName "%s"
>>>>>>(84.l) string >\0 InfName "%s"
# for newer Windows like Vista, 7 , 8.1 , 10
>0 uleshort >0x0101
>>80 ulelong x \b, at 0x%x WinDirPath
>>>4 ulelong&0x00000001 0x00000001
# normally unicoded C:\Windows
#>>>>(80.l) ubequad =0x43003a005c005700
#>>>>>(80.l) lestring16 x "%s"
>>>>(80.l) ubequad !0x43003a005c005700
>>>>>(80.l) lestring16 x "%s"
# language id: 0 407h~german 409h~English_US
>>90 uleshort !0x409 \b, LanguageID %x
#>>90 uleshort =0x409 \b, LanguageID %x
>>92 ulelong >0 \b, at 0x%x
>>>4 ulelong&0x00000001 0x00000001
# language string like: de-DE en-US
>>>>(92.l) lestring16 x language %s
# Summary: backup file created with utility like NTBACKUP.EXE shipped with Windows NT/2K/XP/2003 # Summary: backup file created with utility like NTBACKUP.EXE shipped with Windows NT/2K/XP/2003
# Extension: .bkf # Extension: .bkf
@ -991,3 +1031,9 @@
# URL like File\C:\Users\nutzer\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\desktop.ini # URL like File\C:\Users\nutzer\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\desktop.ini
>>&20 lestring16 x \b, 1st %-s >>&20 lestring16 x \b, 1st %-s
# Microsoft SYLK
# https://en.wikipedia.org/wiki/SYmbolic_LinK_(SYLK)
# https://outflank.nl/upload/sylksum.txt
0 string ID;P Microsoft SYLK program
>4 string >0 \b, created by %s
!:ext slk/sylk

View File

@ -1,6 +1,6 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: wordprocessors,v 1.23 2019/10/25 20:15:49 christos Exp $ # $File: wordprocessors,v 1.24 2020/05/22 19:28:47 christos Exp $
# wordprocessors: file(1) magic fo word processors. # wordprocessors: file(1) magic fo word processors.
# #
####### PWP file format used on Smith Corona Personal Word Processors: ####### PWP file format used on Smith Corona Personal Word Processors:
@ -302,3 +302,20 @@
# partial file name, URL or internal name like "dd2*" of 1st object or RESRV # partial file name, URL or internal name like "dd2*" of 1st object or RESRV
>>>(2.s+11) pstring/h x \b, 1st %s >>>(2.s+11) pstring/h x \b, 1st %s
# From: Joerg Jenderek
# URL: http://fileformats.archiveteam.org/wiki/StarOffice_Gallery
# Note: used in Star-, Open- and Libre-Office and found in directories like
# %APPDATA%\Roaming\LibreOffice\4\user\gallery
# $HOME/.config/libreoffice/4/user/gallery
0 string SGA3 StarOffice Gallery thumbnails
# Unknown like 0x04000?0001000142
#>4 ubequad x \b, UNKNOWN 0x%16.16llx
#!:mime application/x-sdg
!:mime application/x-stargallery-sdg
!:ext sdg
# display image magic for debugging purpose like 'BM'
# looking like PC bitmap, Windows 3.x format with unknown compression
#>11 string x \b, image magic '%-.2s'
# inspect 1st GALLERY thumbnail magic by ./images with 1 space at end
#>11 indirect x \b; contains

View File

@ -1,14 +1,15 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# $File: zip,v 1.3 2019/07/06 19:25:06 christos Exp $ # $File: zip,v 1.4 2020/03/03 13:46:52 christos Exp $
# zip: file(1) magic for zip files; this is not use # zip: file(1) magic for zip files; this is not use
# Note the version of magic in archive is currently stronger, this is # Note the version of magic in archive is currently stronger, this is
# just an example until negative offsets are supported better # just an example until negative offsets are supported better
# Zip Central Cirectory record # Zip Central Directory record
0 name zipcd 0 name zipcd
>0 string PK\001\002 Zip archive data >0 string PK\001\002 Zip archive data
>>4 leshort x \b, made by >>4 leshort x \b, made by
>>4 use zipversion >>4 use zipversion
>>4 use ziphost
>>6 leshort x \b, extract using at least >>6 leshort x \b, extract using at least
>>6 use zipversion >>6 use zipversion
>>12 ledate x \b, last modified %s >>12 ledate x \b, last modified %s
@ -16,13 +17,27 @@
>>10 leshort x \b, method= >>10 leshort x \b, method=
>>10 use zipcompression >>10 use zipcompression
# URL: https://en.wikipedia.org/wiki/Zip_(file_format)
# reference: https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.3.6.TXT
# Zip known compressions # Zip known compressions
0 name zipcompression 0 name zipcompression
>0 leshort 0 \bstore >0 leshort 0 \bstore
>0 leshort 1 \bShrinking
>0 leshort 6 \bImploding
>0 leshort 7 \bTokenizing
>0 leshort 8 \bdeflate >0 leshort 8 \bdeflate
>0 leshort 9 \bdeflate64 >0 leshort 9 \bdeflate64
>0 leshort 10 \bLibrary imploding
#>0 leshort 11 \bReserved by PKWARE
>0 leshort 12 \bbzip2 >0 leshort 12 \bbzip2
#>0 leshort 13 \bReserved by PKWARE
>0 leshort 14 \blzma >0 leshort 14 \blzma
#>0 leshort 15 \bReserved by PKWARE
>0 leshort 16 \bCMPSC Compression
#>0 leshort 17 \bReserved by PKWARE
>0 leshort 18 \bIBM TERSE
>0 leshort 19 \bIBM LZ77
# https://support.winzip.com/hc/en-us/articles/115012122828-Compression-method-used-for-this-file-is-94
>0 leshort 94 \bMP3 >0 leshort 94 \bMP3
>0 leshort 95 \bxz >0 leshort 95 \bxz
>0 leshort 96 \bJpeg >0 leshort 96 \bJpeg
@ -34,23 +49,55 @@
# Zip known versions # Zip known versions
0 name zipversion 0 name zipversion
>0 leshort 0x09 v0.9 # The lower byte indicates the ZIP version of this file. The value/10 indicates
>0 leshort 0x0a v1.0 # the major version number, and the value mod 10 is the minor version number.
>0 leshort 0x0b v1.1 >0 ubyte/10 x v%u
>0 leshort 0x14 v2.0 >0 ubyte%10 x \b.%u
>0 leshort 0x15 v2.1 # >0 leshort 0x09 v0.9
>0 leshort 0x19 v2.5 # >0 leshort 0x0a v1.0
>0 leshort 0x1b v2.7 # >0 leshort 0x0b v1.1
>0 leshort 0x2d v4.5 # >0 leshort 0x14 v2.0
>0 leshort 0x2e v4.6 # >0 leshort 0x15 v2.1
>0 leshort 0x32 v5.0 # >0 leshort 0x19 v2.5
>0 leshort 0x33 v5.1 # >0 leshort 0x1b v2.7
>0 leshort 0x34 v5.2 # >0 leshort 0x2d v4.5
>0 leshort 0x3d v6.1 # >0 leshort 0x2e v4.6
>0 leshort 0x3e v6.2 # >0 leshort 0x32 v5.0
>0 leshort 0x3f v6.3 # >0 leshort 0x33 v5.1
>0 default x # >0 leshort 0x34 v5.2
>>0 leshort x v?[%#x] # >0 leshort 0x3d v6.1
# >0 leshort 0x3e v6.2
# >0 leshort 0x3f v6.3
# >0 default x
# >>0 leshort x v?[%#x]
# display compatible host system name of ZIP archive
0 name ziphost
# The upper byte indicates the compatibility of the file attribute information.
# If the file is compatible with MS-DOS (v 2.04g) then this value will be zero.
#>1 ubyte 0 DOS
>1 ubyte 1 Amiga
>1 ubyte 2 OpenVMS
>1 ubyte 3 UNIX
>1 ubyte 4 VM/CMS
>1 ubyte 6 OS/2
>1 ubyte 7 Macintosh
>1 ubyte 11 MVS
>1 ubyte 13 Acorn Risc
>1 ubyte 16 BeOS
>1 ubyte 17 Tandem
# 9 untested
>1 ubyte 5 Atari ST
>1 ubyte 8 Z-System
>1 ubyte 9 CP/M
>1 ubyte 10 Windows NTFS
>1 ubyte 12 VSE
>1 ubyte 14 VFAT
>1 ubyte 15 alternate MVS
>1 ubyte 18 OS/400
>1 ubyte 19 OS X
# unused
#>1 ubyte >19 unused 0x%x
# Zip End Of Central Directory record # Zip End Of Central Directory record
-22 string PK\005\006 -22 string PK\005\006

View File

@ -1,5 +1,5 @@
# #
# $File: Makefile.am,v 1.151 2019/11/02 18:37:58 christos Exp $ # $File: Makefile.am,v 1.157 2020/05/21 16:22:47 christos Exp $
# #
MAGIC_FRAGMENT_BASE = Magdir MAGIC_FRAGMENT_BASE = Magdir
MAGIC_DIR = $(top_srcdir)/magic MAGIC_DIR = $(top_srcdir)/magic
@ -28,6 +28,7 @@ $(MAGIC_FRAGMENT_DIR)/application \
$(MAGIC_FRAGMENT_DIR)/applix \ $(MAGIC_FRAGMENT_DIR)/applix \
$(MAGIC_FRAGMENT_DIR)/apt \ $(MAGIC_FRAGMENT_DIR)/apt \
$(MAGIC_FRAGMENT_DIR)/archive \ $(MAGIC_FRAGMENT_DIR)/archive \
$(MAGIC_FRAGMENT_DIR)/asf \
$(MAGIC_FRAGMENT_DIR)/assembler \ $(MAGIC_FRAGMENT_DIR)/assembler \
$(MAGIC_FRAGMENT_DIR)/asterix \ $(MAGIC_FRAGMENT_DIR)/asterix \
$(MAGIC_FRAGMENT_DIR)/att3b \ $(MAGIC_FRAGMENT_DIR)/att3b \
@ -78,6 +79,7 @@ $(MAGIC_FRAGMENT_DIR)/dataone \
$(MAGIC_FRAGMENT_DIR)/dbpf \ $(MAGIC_FRAGMENT_DIR)/dbpf \
$(MAGIC_FRAGMENT_DIR)/der \ $(MAGIC_FRAGMENT_DIR)/der \
$(MAGIC_FRAGMENT_DIR)/diamond \ $(MAGIC_FRAGMENT_DIR)/diamond \
$(MAGIC_FRAGMENT_DIR)/dif \
$(MAGIC_FRAGMENT_DIR)/diff \ $(MAGIC_FRAGMENT_DIR)/diff \
$(MAGIC_FRAGMENT_DIR)/digital \ $(MAGIC_FRAGMENT_DIR)/digital \
$(MAGIC_FRAGMENT_DIR)/dolby \ $(MAGIC_FRAGMENT_DIR)/dolby \
@ -271,6 +273,7 @@ $(MAGIC_FRAGMENT_DIR)/sql \
$(MAGIC_FRAGMENT_DIR)/ssh \ $(MAGIC_FRAGMENT_DIR)/ssh \
$(MAGIC_FRAGMENT_DIR)/ssl \ $(MAGIC_FRAGMENT_DIR)/ssl \
$(MAGIC_FRAGMENT_DIR)/sun \ $(MAGIC_FRAGMENT_DIR)/sun \
$(MAGIC_FRAGMENT_DIR)/sylk \
$(MAGIC_FRAGMENT_DIR)/symbos \ $(MAGIC_FRAGMENT_DIR)/symbos \
$(MAGIC_FRAGMENT_DIR)/sysex \ $(MAGIC_FRAGMENT_DIR)/sysex \
$(MAGIC_FRAGMENT_DIR)/tcl \ $(MAGIC_FRAGMENT_DIR)/tcl \
@ -285,7 +288,9 @@ $(MAGIC_FRAGMENT_DIR)/troff \
$(MAGIC_FRAGMENT_DIR)/tuxedo \ $(MAGIC_FRAGMENT_DIR)/tuxedo \
$(MAGIC_FRAGMENT_DIR)/typeset \ $(MAGIC_FRAGMENT_DIR)/typeset \
$(MAGIC_FRAGMENT_DIR)/unicode \ $(MAGIC_FRAGMENT_DIR)/unicode \
$(MAGIC_FRAGMENT_DIR)/unisig \
$(MAGIC_FRAGMENT_DIR)/unknown \ $(MAGIC_FRAGMENT_DIR)/unknown \
$(MAGIC_FRAGMENT_DIR)/usd \
$(MAGIC_FRAGMENT_DIR)/uterus \ $(MAGIC_FRAGMENT_DIR)/uterus \
$(MAGIC_FRAGMENT_DIR)/uuencode \ $(MAGIC_FRAGMENT_DIR)/uuencode \
$(MAGIC_FRAGMENT_DIR)/vacuum-cleaner \ $(MAGIC_FRAGMENT_DIR)/vacuum-cleaner \
@ -301,6 +306,7 @@ $(MAGIC_FRAGMENT_DIR)/vmware \
$(MAGIC_FRAGMENT_DIR)/vorbis \ $(MAGIC_FRAGMENT_DIR)/vorbis \
$(MAGIC_FRAGMENT_DIR)/vxl \ $(MAGIC_FRAGMENT_DIR)/vxl \
$(MAGIC_FRAGMENT_DIR)/warc \ $(MAGIC_FRAGMENT_DIR)/warc \
$(MAGIC_FRAGMENT_DIR)/web \
$(MAGIC_FRAGMENT_DIR)/weak \ $(MAGIC_FRAGMENT_DIR)/weak \
$(MAGIC_FRAGMENT_DIR)/webassembly \ $(MAGIC_FRAGMENT_DIR)/webassembly \
$(MAGIC_FRAGMENT_DIR)/windows \ $(MAGIC_FRAGMENT_DIR)/windows \

View File

@ -274,7 +274,7 @@ top_builddir = @top_builddir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
# #
# $File: Makefile.am,v 1.151 2019/11/02 18:37:58 christos Exp $ # $File: Makefile.am,v 1.157 2020/05/21 16:22:47 christos Exp $
# #
MAGIC_FRAGMENT_BASE = Magdir MAGIC_FRAGMENT_BASE = Magdir
MAGIC_DIR = $(top_srcdir)/magic MAGIC_DIR = $(top_srcdir)/magic
@ -301,6 +301,7 @@ $(MAGIC_FRAGMENT_DIR)/application \
$(MAGIC_FRAGMENT_DIR)/applix \ $(MAGIC_FRAGMENT_DIR)/applix \
$(MAGIC_FRAGMENT_DIR)/apt \ $(MAGIC_FRAGMENT_DIR)/apt \
$(MAGIC_FRAGMENT_DIR)/archive \ $(MAGIC_FRAGMENT_DIR)/archive \
$(MAGIC_FRAGMENT_DIR)/asf \
$(MAGIC_FRAGMENT_DIR)/assembler \ $(MAGIC_FRAGMENT_DIR)/assembler \
$(MAGIC_FRAGMENT_DIR)/asterix \ $(MAGIC_FRAGMENT_DIR)/asterix \
$(MAGIC_FRAGMENT_DIR)/att3b \ $(MAGIC_FRAGMENT_DIR)/att3b \
@ -351,6 +352,7 @@ $(MAGIC_FRAGMENT_DIR)/dataone \
$(MAGIC_FRAGMENT_DIR)/dbpf \ $(MAGIC_FRAGMENT_DIR)/dbpf \
$(MAGIC_FRAGMENT_DIR)/der \ $(MAGIC_FRAGMENT_DIR)/der \
$(MAGIC_FRAGMENT_DIR)/diamond \ $(MAGIC_FRAGMENT_DIR)/diamond \
$(MAGIC_FRAGMENT_DIR)/dif \
$(MAGIC_FRAGMENT_DIR)/diff \ $(MAGIC_FRAGMENT_DIR)/diff \
$(MAGIC_FRAGMENT_DIR)/digital \ $(MAGIC_FRAGMENT_DIR)/digital \
$(MAGIC_FRAGMENT_DIR)/dolby \ $(MAGIC_FRAGMENT_DIR)/dolby \
@ -544,6 +546,7 @@ $(MAGIC_FRAGMENT_DIR)/sql \
$(MAGIC_FRAGMENT_DIR)/ssh \ $(MAGIC_FRAGMENT_DIR)/ssh \
$(MAGIC_FRAGMENT_DIR)/ssl \ $(MAGIC_FRAGMENT_DIR)/ssl \
$(MAGIC_FRAGMENT_DIR)/sun \ $(MAGIC_FRAGMENT_DIR)/sun \
$(MAGIC_FRAGMENT_DIR)/sylk \
$(MAGIC_FRAGMENT_DIR)/symbos \ $(MAGIC_FRAGMENT_DIR)/symbos \
$(MAGIC_FRAGMENT_DIR)/sysex \ $(MAGIC_FRAGMENT_DIR)/sysex \
$(MAGIC_FRAGMENT_DIR)/tcl \ $(MAGIC_FRAGMENT_DIR)/tcl \
@ -558,7 +561,9 @@ $(MAGIC_FRAGMENT_DIR)/troff \
$(MAGIC_FRAGMENT_DIR)/tuxedo \ $(MAGIC_FRAGMENT_DIR)/tuxedo \
$(MAGIC_FRAGMENT_DIR)/typeset \ $(MAGIC_FRAGMENT_DIR)/typeset \
$(MAGIC_FRAGMENT_DIR)/unicode \ $(MAGIC_FRAGMENT_DIR)/unicode \
$(MAGIC_FRAGMENT_DIR)/unisig \
$(MAGIC_FRAGMENT_DIR)/unknown \ $(MAGIC_FRAGMENT_DIR)/unknown \
$(MAGIC_FRAGMENT_DIR)/usd \
$(MAGIC_FRAGMENT_DIR)/uterus \ $(MAGIC_FRAGMENT_DIR)/uterus \
$(MAGIC_FRAGMENT_DIR)/uuencode \ $(MAGIC_FRAGMENT_DIR)/uuencode \
$(MAGIC_FRAGMENT_DIR)/vacuum-cleaner \ $(MAGIC_FRAGMENT_DIR)/vacuum-cleaner \
@ -574,6 +579,7 @@ $(MAGIC_FRAGMENT_DIR)/vmware \
$(MAGIC_FRAGMENT_DIR)/vorbis \ $(MAGIC_FRAGMENT_DIR)/vorbis \
$(MAGIC_FRAGMENT_DIR)/vxl \ $(MAGIC_FRAGMENT_DIR)/vxl \
$(MAGIC_FRAGMENT_DIR)/warc \ $(MAGIC_FRAGMENT_DIR)/warc \
$(MAGIC_FRAGMENT_DIR)/web \
$(MAGIC_FRAGMENT_DIR)/weak \ $(MAGIC_FRAGMENT_DIR)/weak \
$(MAGIC_FRAGMENT_DIR)/webassembly \ $(MAGIC_FRAGMENT_DIR)/webassembly \
$(MAGIC_FRAGMENT_DIR)/windows \ $(MAGIC_FRAGMENT_DIR)/windows \

View File

@ -32,7 +32,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: apprentice.c,v 1.284 2019/06/29 22:31:04 christos Exp $") FILE_RCSID("@(#)$File: apprentice.c,v 1.297 2020/05/09 18:57:15 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -120,6 +120,7 @@ private void apprentice_list(struct mlist *, int );
private struct magic_map *apprentice_load(struct magic_set *, private struct magic_map *apprentice_load(struct magic_set *,
const char *, int); const char *, int);
private struct mlist *mlist_alloc(void); private struct mlist *mlist_alloc(void);
private void mlist_free_all(struct magic_set *);
private void mlist_free(struct mlist *); private void mlist_free(struct mlist *);
private void byteswap(struct magic *, uint32_t); private void byteswap(struct magic *, uint32_t);
private void bs1(struct magic *); private void bs1(struct magic *);
@ -137,10 +138,14 @@ private int apprentice_compile(struct magic_set *, struct magic_map *,
private int check_format_type(const char *, int, const char **); private int check_format_type(const char *, int, const char **);
private int check_format(struct magic_set *, struct magic *); private int check_format(struct magic_set *, struct magic *);
private int get_op(char); private int get_op(char);
private int parse_mime(struct magic_set *, struct magic_entry *, const char *); private int parse_mime(struct magic_set *, struct magic_entry *, const char *,
private int parse_strength(struct magic_set *, struct magic_entry *, const char *); size_t);
private int parse_apple(struct magic_set *, struct magic_entry *, const char *); private int parse_strength(struct magic_set *, struct magic_entry *,
private int parse_ext(struct magic_set *, struct magic_entry *, const char *); const char *, size_t);
private int parse_apple(struct magic_set *, struct magic_entry *, const char *,
size_t);
private int parse_ext(struct magic_set *, struct magic_entry *, const char *,
size_t);
private size_t magicsize = sizeof(struct magic); private size_t magicsize = sizeof(struct magic);
@ -150,7 +155,8 @@ private const char usg_hdr[] = "cont\toffset\ttype\topcode\tmask\tvalue\tdesc";
private struct { private struct {
const char *name; const char *name;
size_t len; size_t len;
int (*fun)(struct magic_set *, struct magic_entry *, const char *); int (*fun)(struct magic_set *, struct magic_entry *, const char *,
size_t);
} bang[] = { } bang[] = {
#define DECLARE_FIELD(name) { # name, sizeof(# name) - 1, parse_ ## name } #define DECLARE_FIELD(name) { # name, sizeof(# name) - 1, parse_ ## name }
DECLARE_FIELD(mime), DECLARE_FIELD(mime),
@ -260,6 +266,8 @@ static const struct type_tbl_s type_tbl[] = {
{ XX("use"), FILE_USE, FILE_FMT_NONE }, { XX("use"), FILE_USE, FILE_FMT_NONE },
{ XX("clear"), FILE_CLEAR, FILE_FMT_NONE }, { XX("clear"), FILE_CLEAR, FILE_FMT_NONE },
{ XX("der"), FILE_DER, FILE_FMT_STR }, { XX("der"), FILE_DER, FILE_FMT_STR },
{ XX("guid"), FILE_GUID, FILE_FMT_STR },
{ XX("offset"), FILE_OFFSET, FILE_FMT_QUAD },
{ XX_NULL, FILE_INVALID, FILE_FMT_NONE }, { XX_NULL, FILE_INVALID, FILE_FMT_NONE },
}; };
@ -451,8 +459,6 @@ apprentice_1(struct magic_set *ms, const char *fn, int action)
#ifndef COMPILE_ONLY #ifndef COMPILE_ONLY
map = apprentice_map(ms, fn); map = apprentice_map(ms, fn);
if (map == RCAST(struct magic_map *, -1))
return -1;
if (map == NULL) { if (map == NULL) {
if (ms->flags & MAGIC_CHECK) if (ms->flags & MAGIC_CHECK)
file_magwarn(ms, "using regular magic file `%s'", fn); file_magwarn(ms, "using regular magic file `%s'", fn);
@ -463,6 +469,11 @@ apprentice_1(struct magic_set *ms, const char *fn, int action)
for (i = 0; i < MAGIC_SETS; i++) { for (i = 0; i < MAGIC_SETS; i++) {
if (add_mlist(ms->mlist[i], map, i) == -1) { if (add_mlist(ms->mlist[i], map, i) == -1) {
/* failed to add to any list, free explicitly */
if (i == 0)
apprentice_unmap(map);
else
mlist_free_all(ms);
file_oomem(ms, sizeof(*ml)); file_oomem(ms, sizeof(*ml));
return -1; return -1;
} }
@ -513,6 +524,7 @@ file_ms_alloc(int flags)
} }
ms->o.buf = ms->o.pbuf = NULL; ms->o.buf = ms->o.pbuf = NULL;
ms->o.blen = 0;
len = (ms->c.len = 10) * sizeof(*ms->c.li); len = (ms->c.len = 10) * sizeof(*ms->c.li);
if ((ms->c.li = CAST(struct level_info *, malloc(len))) == NULL) if ((ms->c.li = CAST(struct level_info *, malloc(len))) == NULL)
@ -581,6 +593,17 @@ mlist_alloc(void)
return mlist; return mlist;
} }
private void
mlist_free_all(struct magic_set *ms)
{
size_t i;
for (i = 0; i < MAGIC_SETS; i++) {
mlist_free(ms->mlist[i]);
ms->mlist[i] = NULL;
}
}
private void private void
mlist_free_one(struct mlist *ml) mlist_free_one(struct mlist *ml)
{ {
@ -597,9 +620,10 @@ mlist_free(struct mlist *mlist)
if (mlist == NULL) if (mlist == NULL)
return; return;
for (ml = mlist->next; ml != mlist; ml = next) { for (ml = mlist->next; ml != mlist;) {
next = ml->next; next = ml->next;
mlist_free_one(ml); mlist_free_one(ml);
ml = next;
} }
mlist_free_one(mlist); mlist_free_one(mlist);
} }
@ -644,10 +668,7 @@ buffer_apprentice(struct magic_set *ms, struct magic **bufs,
return 0; return 0;
fail: fail:
for (i = 0; i < MAGIC_SETS; i++) { mlist_free_all(ms);
mlist_free(ms->mlist[i]);
ms->mlist[i] = NULL;
}
return -1; return -1;
} }
#endif #endif
@ -658,7 +679,7 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
{ {
char *p, *mfn; char *p, *mfn;
int fileerr, errs = -1; int fileerr, errs = -1;
size_t i; size_t i, j;
(void)file_reset(ms, 0); (void)file_reset(ms, 0);
@ -676,9 +697,9 @@ file_apprentice(struct magic_set *ms, const char *fn, int action)
mlist_free(ms->mlist[i]); mlist_free(ms->mlist[i]);
if ((ms->mlist[i] = mlist_alloc()) == NULL) { if ((ms->mlist[i] = mlist_alloc()) == NULL) {
file_oomem(ms, sizeof(*ms->mlist[i])); file_oomem(ms, sizeof(*ms->mlist[i]));
while (i-- > 0) { for (j = 0; j < i; j++) {
mlist_free(ms->mlist[i]); mlist_free(ms->mlist[j]);
ms->mlist[i] = NULL; ms->mlist[j] = NULL;
} }
free(mfn); free(mfn);
return -1; return -1;
@ -829,9 +850,14 @@ typesize(int type)
case FILE_DOUBLE: case FILE_DOUBLE:
case FILE_BEDOUBLE: case FILE_BEDOUBLE:
case FILE_LEDOUBLE: case FILE_LEDOUBLE:
case FILE_OFFSET:
return 8; return 8;
case FILE_GUID:
return 16;
default: default:
return CAST(size_t, ~0); return FILE_BADSIZE;
} }
} }
@ -885,8 +911,10 @@ apprentice_magic_strength(const struct magic *m)
case FILE_DOUBLE: case FILE_DOUBLE:
case FILE_BEDOUBLE: case FILE_BEDOUBLE:
case FILE_LEDOUBLE: case FILE_LEDOUBLE:
case FILE_GUID:
case FILE_OFFSET:
ts = typesize(m->type); ts = typesize(m->type);
if (ts == CAST(size_t, ~0)) if (ts == FILE_BADSIZE)
abort(); abort();
val += ts * MULT; val += ts * MULT;
break; break;
@ -1077,6 +1105,8 @@ set_test_type(struct magic *mstart, struct magic *m)
case FILE_BEDOUBLE: case FILE_BEDOUBLE:
case FILE_LEDOUBLE: case FILE_LEDOUBLE:
case FILE_DER: case FILE_DER:
case FILE_GUID:
case FILE_OFFSET:
mstart->flag |= BINTEST; mstart->flag |= BINTEST;
break; break;
case FILE_STRING: case FILE_STRING:
@ -1201,7 +1231,8 @@ load_1(struct magic_set *ms, int action, const char *fn, int *errs,
continue; continue;
} }
if ((*bang[i].fun)(ms, &me, if ((*bang[i].fun)(ms, &me,
line + bang[i].len + 2) != 0) { line + bang[i].len + 2,
len - bang[i].len - 2) != 0) {
(*errs)++; (*errs)++;
continue; continue;
} }
@ -1381,9 +1412,10 @@ apprentice_load(struct magic_set *ms, const char *fn, int action)
} }
if (files >= maxfiles) { if (files >= maxfiles) {
size_t mlen; size_t mlen;
char **nfilearr;
maxfiles = (maxfiles + 1) * 2; maxfiles = (maxfiles + 1) * 2;
mlen = maxfiles * sizeof(*filearr); mlen = maxfiles * sizeof(*filearr);
if ((filearr = CAST(char **, if ((nfilearr = CAST(char **,
realloc(filearr, mlen))) == NULL) { realloc(filearr, mlen))) == NULL) {
file_oomem(ms, mlen); file_oomem(ms, mlen);
free(mfn); free(mfn);
@ -1391,6 +1423,7 @@ apprentice_load(struct magic_set *ms, const char *fn, int action)
errs++; errs++;
goto out; goto out;
} }
filearr = nfilearr;
} }
filearr[files++] = mfn; filearr[files++] = mfn;
} }
@ -1402,6 +1435,7 @@ apprentice_load(struct magic_set *ms, const char *fn, int action)
free(filearr[i]); free(filearr[i]);
} }
free(filearr); free(filearr);
filearr = NULL;
} }
} else } else
load_1(ms, action, fn, &errs, mset); load_1(ms, action, fn, &errs, mset);
@ -1436,6 +1470,7 @@ apprentice_load(struct magic_set *ms, const char *fn, int action)
} }
out: out:
free(filearr);
for (j = 0; j < MAGIC_SETS; j++) for (j = 0; j < MAGIC_SETS; j++)
magic_entry_free(mset[j].me, mset[j].count); magic_entry_free(mset[j].me, mset[j].count);
@ -1499,6 +1534,7 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
case FILE_DOUBLE: case FILE_DOUBLE:
case FILE_BEDOUBLE: case FILE_BEDOUBLE:
case FILE_LEDOUBLE: case FILE_LEDOUBLE:
case FILE_OFFSET:
v = CAST(int64_t, v); v = CAST(int64_t, v);
break; break;
case FILE_STRING: case FILE_STRING:
@ -1513,12 +1549,13 @@ file_signextend(struct magic_set *ms, struct magic *m, uint64_t v)
case FILE_USE: case FILE_USE:
case FILE_CLEAR: case FILE_CLEAR:
case FILE_DER: case FILE_DER:
case FILE_GUID:
break; break;
default: default:
if (ms->flags & MAGIC_CHECK) if (ms->flags & MAGIC_CHECK)
file_magwarn(ms, "cannot happen: m->type=%d\n", file_magwarn(ms, "cannot happen: m->type=%d\n",
m->type); m->type);
return ~0U; return FILE_BADSIZE;
} }
} }
return v; return v;
@ -1920,6 +1957,10 @@ parse(struct magic_set *ms, struct magic_entry *me, const char *line,
} }
/* get offset, then skip over it */ /* get offset, then skip over it */
if (*l == '-') {
++l; /* step over */
m->flag |= OFFNEGATIVE;
}
m->offset = CAST(int32_t, strtol(l, &t, 0)); m->offset = CAST(int32_t, strtol(l, &t, 0));
if (l == t) { if (l == t) {
if (ms->flags & MAGIC_CHECK) if (ms->flags & MAGIC_CHECK)
@ -2224,7 +2265,8 @@ parse(struct magic_set *ms, struct magic_entry *me, const char *line,
* if valid * if valid
*/ */
private int private int
parse_strength(struct magic_set *ms, struct magic_entry *me, const char *line) parse_strength(struct magic_set *ms, struct magic_entry *me, const char *line,
size_t len __attribute__((__unused__)))
{ {
const char *l = line; const char *l = line;
char *el; char *el;
@ -2286,7 +2328,8 @@ goodchar(unsigned char x, const char *extra)
private int private int
parse_extra(struct magic_set *ms, struct magic_entry *me, const char *line, parse_extra(struct magic_set *ms, struct magic_entry *me, const char *line,
off_t off, size_t len, const char *name, const char *extra, int nt) size_t llen, off_t off, size_t len, const char *name, const char *extra,
int nt)
{ {
size_t i; size_t i;
const char *l = line; const char *l = line;
@ -2307,7 +2350,8 @@ parse_extra(struct magic_set *ms, struct magic_entry *me, const char *line,
} }
EATAB; EATAB;
for (i = 0; *l && i < len && goodchar(*l, extra); buf[i++] = *l++) for (i = 0; *l && i < llen && i < len && goodchar(*l, extra);
buf[i++] = *l++)
continue; continue;
if (i == len && *l) { if (i == len && *l) {
@ -2336,11 +2380,12 @@ parse_extra(struct magic_set *ms, struct magic_entry *me, const char *line,
* magic[index - 1] * magic[index - 1]
*/ */
private int private int
parse_apple(struct magic_set *ms, struct magic_entry *me, const char *line) parse_apple(struct magic_set *ms, struct magic_entry *me, const char *line,
size_t len)
{ {
struct magic *m = &me->mp[0]; struct magic *m = &me->mp[0];
return parse_extra(ms, me, line, return parse_extra(ms, me, line, len,
CAST(off_t, offsetof(struct magic, apple)), CAST(off_t, offsetof(struct magic, apple)),
sizeof(m->apple), "APPLE", "!+-./?", 0); sizeof(m->apple), "APPLE", "!+-./?", 0);
} }
@ -2349,11 +2394,12 @@ parse_apple(struct magic_set *ms, struct magic_entry *me, const char *line)
* Parse a comma-separated list of extensions * Parse a comma-separated list of extensions
*/ */
private int private int
parse_ext(struct magic_set *ms, struct magic_entry *me, const char *line) parse_ext(struct magic_set *ms, struct magic_entry *me, const char *line,
size_t len)
{ {
struct magic *m = &me->mp[0]; struct magic *m = &me->mp[0];
return parse_extra(ms, me, line, return parse_extra(ms, me, line, len,
CAST(off_t, offsetof(struct magic, ext)), CAST(off_t, offsetof(struct magic, ext)),
sizeof(m->ext), "EXTENSION", ",!+-/@?_$", 0); sizeof(m->ext), "EXTENSION", ",!+-/@?_$", 0);
} }
@ -2363,11 +2409,12 @@ parse_ext(struct magic_set *ms, struct magic_entry *me, const char *line)
* if valid * if valid
*/ */
private int private int
parse_mime(struct magic_set *ms, struct magic_entry *me, const char *line) parse_mime(struct magic_set *ms, struct magic_entry *me, const char *line,
size_t len)
{ {
struct magic *m = &me->mp[0]; struct magic *m = &me->mp[0];
return parse_extra(ms, me, line, return parse_extra(ms, me, line, len,
CAST(off_t, offsetof(struct magic, mimetype)), CAST(off_t, offsetof(struct magic, mimetype)),
sizeof(m->mimetype), "MIME", "+-/.$?:{}", 1); sizeof(m->mimetype), "MIME", "+-/.$?:{}", 1);
} }
@ -2684,6 +2731,11 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
if (errno == 0) if (errno == 0)
*p = ep; *p = ep;
return 0; return 0;
case FILE_GUID:
if (file_parse_guid(*p, m->value.guid) == -1)
return -1;
*p += FILE_GUID_SIZE - 1;
return 0;
default: default:
errno = 0; errno = 0;
ull = CAST(uint64_t, strtoull(*p, &ep, 0)); ull = CAST(uint64_t, strtoull(*p, &ep, 0));
@ -2695,7 +2747,7 @@ getvalue(struct magic_set *ms, struct magic *m, const char **p, int action)
uint64_t x; uint64_t x;
const char *q; const char *q;
if (ts == CAST(size_t, ~0)) { if (ts == FILE_BADSIZE) {
file_magwarn(ms, file_magwarn(ms,
"Expected numeric type got `%s'", "Expected numeric type got `%s'",
type_tbl[m->type].name); type_tbl[m->type].name);
@ -2892,8 +2944,12 @@ getstr(struct magic_set *ms, struct magic *m, const char *s, int warn)
out: out:
*p = '\0'; *p = '\0';
m->vallen = CAST(unsigned char, (p - origp)); m->vallen = CAST(unsigned char, (p - origp));
if (m->type == FILE_PSTRING) if (m->type == FILE_PSTRING) {
m->vallen += CAST(unsigned char, file_pstring_length_size(m)); size_t l = file_pstring_length_size(ms, m);
if (l == FILE_BADSIZE)
return NULL;
m->vallen += CAST(unsigned char, l);
}
return s; return s;
} }
@ -2923,7 +2979,7 @@ file_showstr(FILE *fp, const char *s, size_t len)
char c; char c;
for (;;) { for (;;) {
if (len == ~0U) { if (len == FILE_BADSIZE) {
c = *s++; c = *s++;
if (c == '\0') if (c == '\0')
break; break;
@ -3077,13 +3133,11 @@ apprentice_map(struct magic_set *ms, const char *fn)
file_badread(ms); file_badread(ms);
goto error; goto error;
} }
#define RET 1
#endif #endif
(void)close(fd); (void)close(fd);
fd = -1; fd = -1;
if (check_buffer(ms, map, dbname) != 0) { if (check_buffer(ms, map, dbname) != 0) {
rv = RCAST(struct magic_map *, -1);
goto error; goto error;
} }
#ifdef QUICK #ifdef QUICK
@ -3357,7 +3411,7 @@ bs1(struct magic *m)
} }
protected size_t protected size_t
file_pstring_length_size(const struct magic *m) file_pstring_length_size(struct magic_set *ms, const struct magic *m)
{ {
switch (m->str_flags & PSTRING_LEN) { switch (m->str_flags & PSTRING_LEN) {
case PSTRING_1_LE: case PSTRING_1_LE:
@ -3369,12 +3423,15 @@ file_pstring_length_size(const struct magic *m)
case PSTRING_4_BE: case PSTRING_4_BE:
return 4; return 4;
default: default:
abort(); /* Impossible */ file_error(ms, 0, "corrupt magic file "
return 1; "(bad pascal string length %d)",
m->str_flags & PSTRING_LEN);
return FILE_BADSIZE;
} }
} }
protected size_t protected size_t
file_pstring_get_length(const struct magic *m, const char *ss) file_pstring_get_length(struct magic_set *ms, const struct magic *m,
const char *ss)
{ {
size_t len = 0; size_t len = 0;
const unsigned char *s = RCAST(const unsigned char *, ss); const unsigned char *s = RCAST(const unsigned char *, ss);
@ -3409,11 +3466,18 @@ file_pstring_get_length(const struct magic *m, const char *ss)
len = (s0 << 24) | (s1 << 16) | (s2 << 8) | s3; len = (s0 << 24) | (s1 << 16) | (s2 << 8) | s3;
break; break;
default: default:
abort(); /* Impossible */ file_error(ms, 0, "corrupt magic file "
"(bad pascal string length %d)",
m->str_flags & PSTRING_LEN);
return FILE_BADSIZE;
} }
if (m->str_flags & PSTRING_LENGTH_INCLUDES_ITSELF) if (m->str_flags & PSTRING_LENGTH_INCLUDES_ITSELF) {
len -= file_pstring_length_size(m); size_t l = file_pstring_length_size(ms, m);
if (l == FILE_BADSIZE)
return l;
len -= l;
}
return len; return len;
} }

View File

@ -35,7 +35,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: ascmagic.c,v 1.105 2019/06/08 20:49:14 christos Exp $") FILE_RCSID("@(#)$File: ascmagic.c,v 1.107 2020/06/08 19:58:36 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -115,7 +115,6 @@ file_ascmagic_with_encoding(struct magic_set *ms,
int need_separator = 0; int need_separator = 0;
const char *subtype = NULL; const char *subtype = NULL;
const char *subtype_mime = NULL;
int has_escapes = 0; int has_escapes = 0;
int has_backspace = 0; int has_backspace = 0;
@ -164,8 +163,11 @@ file_ascmagic_with_encoding(struct magic_set *ms,
goto done; goto done;
} }
} }
if ((ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION)))
return 0; if ((ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION))) {
rv = 0;
goto done;
}
/* Now try to discover other details about the file. */ /* Now try to discover other details about the file. */
for (i = 0; i < ulen; i++) { for (i = 0; i < ulen; i++) {
@ -222,10 +224,6 @@ file_ascmagic_with_encoding(struct magic_set *ms,
} }
if (need_separator && file_separator(ms) == -1) if (need_separator && file_separator(ms) == -1)
goto done; goto done;
}
if (subtype_mime) {
if (file_printf(ms, "%s", subtype_mime) == -1)
goto done;
} else { } else {
if (file_printf(ms, "text/plain") == -1) if (file_printf(ms, "text/plain") == -1)
goto done; goto done;

View File

@ -27,7 +27,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: buffer.c,v 1.7 2019/06/10 21:35:26 christos Exp $") FILE_RCSID("@(#)$File: buffer.c,v 1.8 2020/02/16 15:52:49 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -64,7 +64,7 @@ buffer_fill(const struct buffer *bb)
struct buffer *b = CCAST(struct buffer *, bb); struct buffer *b = CCAST(struct buffer *, bb);
if (b->elen != 0) if (b->elen != 0)
return b->elen == CAST(size_t, ~0) ? -1 : 0; return b->elen == FILE_BADSIZE ? -1 : 0;
if (!S_ISREG(b->st.st_mode)) if (!S_ISREG(b->st.st_mode))
goto out; goto out;
@ -83,6 +83,6 @@ buffer_fill(const struct buffer *bb)
return 0; return 0;
out: out:
b->elen = CAST(size_t, ~0); b->elen = FILE_BADSIZE;
return -1; return -1;
} }

View File

@ -35,7 +35,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: compress.c,v 1.124 2019/07/21 11:42:09 christos Exp $") FILE_RCSID("@(#)$File: compress.c,v 1.127 2020/05/31 00:11:06 christos Exp $")
#endif #endif
#include "magic.h" #include "magic.h"
@ -51,7 +51,7 @@ FILE_RCSID("@(#)$File: compress.c,v 1.124 2019/07/21 11:42:09 christos Exp $")
#ifndef HAVE_SIG_T #ifndef HAVE_SIG_T
typedef void (*sig_t)(int); typedef void (*sig_t)(int);
#endif /* HAVE_SIG_T */ #endif /* HAVE_SIG_T */
#if !defined(__MINGW32__) && !defined(WIN32) #if !defined(__MINGW32__) && !defined(WIN32) && !defined(__MINGW64__)
#include <sys/ioctl.h> #include <sys/ioctl.h>
#endif #endif
#ifdef HAVE_SYS_WAIT_H #ifdef HAVE_SYS_WAIT_H
@ -66,12 +66,12 @@ typedef void (*sig_t)(int);
#include <zlib.h> #include <zlib.h>
#endif #endif
#if defined(HAVE_BZLIB_H) || defined(BZLIBSUPPORT) #if defined(HAVE_BZLIB_H) && defined(BZLIBSUPPORT)
#define BUILTIN_BZLIB #define BUILTIN_BZLIB
#include <bzlib.h> #include <bzlib.h>
#endif #endif
#if defined(HAVE_XZLIB_H) || defined(XZLIBSUPPORT) #if defined(HAVE_XZLIB_H) && defined(XZLIBSUPPORT)
#define BUILTIN_XZLIB #define BUILTIN_XZLIB
#include <lzma.h> #include <lzma.h>
#endif #endif
@ -161,7 +161,10 @@ static const char *zstd_args[] = {
#define do_bzlib NULL #define do_bzlib NULL
private const struct { private const struct {
const void *magic; union {
const char *magic;
int (*func)(const unsigned char *);
} u;
int maglen; int maglen;
const char **argv; const char **argv;
void *unused; void *unused;
@ -171,26 +174,26 @@ private const struct {
#define METH_XZ 9 #define METH_XZ 9
#define METH_LZMA 13 #define METH_LZMA 13
#define METH_ZLIB 14 #define METH_ZLIB 14
{ "\037\235", 2, gzip_args, NULL }, /* 0, compressed */ { { .magic = "\037\235" }, 2, gzip_args, NULL }, /* 0, compressed */
/* Uncompress can get stuck; so use gzip first if we have it /* Uncompress can get stuck; so use gzip first if we have it
* Idea from Damien Clark, thanks! */ * Idea from Damien Clark, thanks! */
{ "\037\235", 2, uncompress_args, NULL }, /* 1, compressed */ { { .magic = "\037\235" }, 2, uncompress_args, NULL },/* 1, compressed */
{ "\037\213", 2, gzip_args, do_zlib }, /* 2, gzipped */ { { .magic = "\037\213" }, 2, gzip_args, do_zlib },/* 2, gzipped */
{ "\037\236", 2, gzip_args, NULL }, /* 3, frozen */ { { .magic = "\037\236" }, 2, gzip_args, NULL }, /* 3, frozen */
{ "\037\240", 2, gzip_args, NULL }, /* 4, SCO LZH */ { { .magic = "\037\240" }, 2, gzip_args, NULL }, /* 4, SCO LZH */
/* the standard pack utilities do not accept standard input */ /* the standard pack utilities do not accept standard input */
{ "\037\036", 2, gzip_args, NULL }, /* 5, packed */ { { .magic = "\037\036" }, 2, gzip_args, NULL }, /* 5, packed */
{ "PK\3\4", 4, gzip_args, NULL }, /* 6, pkzipped, */ { { .magic = "PK\3\4" }, 4, gzip_args, NULL }, /* 6, pkziped */
/* ...only first file examined */ /* ...only first file examined */
{ "BZh", 3, bzip2_args, do_bzlib }, /* 7, bzip2-ed */ { { .magic = "BZh" }, 3, bzip2_args, do_bzlib },/* 7, bzip2-ed */
{ "LZIP", 4, lzip_args, NULL }, /* 8, lzip-ed */ { { .magic = "LZIP" }, 4, lzip_args, NULL }, /* 8, lzip-ed */
{ "\3757zXZ\0", 6, xz_args, NULL }, /* 9, XZ Utils */ { { .magic = "\3757zXZ\0" },6, xz_args, NULL }, /* 9, XZ Util */
{ "LRZI", 4, lrzip_args, NULL }, /* 10, LRZIP */ { { .magic = "LRZI" }, 4, lrzip_args, NULL }, /* 10, LRZIP */
{ "\004\"M\030",4, lz4_args, NULL }, /* 11, LZ4 */ { { .magic = "\004\"M\030" },4, lz4_args, NULL }, /* 11, LZ4 */
{ "\x28\xB5\x2F\xFD", 4, zstd_args, NULL }, /* 12, zstd */ { { .magic = "\x28\xB5\x2F\xFD" }, 4, zstd_args, NULL },/* 12, zstd */
{ RCAST(const void *, lzmacmp), -13, xz_args, NULL }, /* 13, lzma */ { { .func = lzmacmp }, -13, xz_args, NULL }, /* 13, lzma */
#ifdef ZLIBSUPPORT #ifdef ZLIBSUPPORT
{ RCAST(const void *, zlibcmp), -2, zlib_args, NULL }, /* 14, zlib */ { { .func = zlibcmp }, -2, zlib_args, NULL }, /* 14, zlib */
#endif #endif
}; };
@ -262,10 +265,9 @@ file_zmagic(struct magic_set *ms, const struct buffer *b, const char *name)
if (nbytes < CAST(size_t, abs(compr[i].maglen))) if (nbytes < CAST(size_t, abs(compr[i].maglen)))
continue; continue;
if (compr[i].maglen < 0) { if (compr[i].maglen < 0) {
zm = (RCAST(int (*)(const unsigned char *), zm = (*compr[i].u.func)(buf);
CCAST(void *, compr[i].magic)))(buf);
} else { } else {
zm = memcmp(buf, compr[i].magic, zm = memcmp(buf, compr[i].u.magic,
CAST(size_t, compr[i].maglen)) == 0; CAST(size_t, compr[i].maglen)) == 0;
} }

View File

@ -35,8 +35,11 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: der.c,v 1.16 2019/02/20 02:35:27 christos Exp $") FILE_RCSID("@(#)$File: der.c,v 1.20 2020/06/07 19:10:37 christos Exp $")
#endif #endif
#else
#define SIZE_T_FORMAT "z"
#define CAST(a, b) ((a)(b))
#endif #endif
#include <sys/types.h> #include <sys/types.h>
@ -62,13 +65,13 @@ FILE_RCSID("@(#)$File: der.c,v 1.16 2019/02/20 02:35:27 christos Exp $")
#define DER_CLASS_APPLICATION 1 #define DER_CLASS_APPLICATION 1
#define DER_CLASS_CONTEXT 2 #define DER_CLASS_CONTEXT 2
#define DER_CLASS_PRIVATE 3 #define DER_CLASS_PRIVATE 3
#ifdef DEBUG_DER #if defined(DEBUG_DER) || defined(TEST_DER)
static const char der_class[] = "UACP"; static const char der_class[] = "UACP";
#endif #endif
#define DER_TYPE_PRIMITIVE 0 #define DER_TYPE_PRIMITIVE 0
#define DER_TYPE_CONSTRUCTED 1 #define DER_TYPE_CONSTRUCTED 1
#ifdef DEBUG_DER #if defined(DEBUG_DER) || defined(TEST_DER)
static const char der_type[] = "PC"; static const char der_type[] = "PC";
#endif #endif
@ -86,7 +89,7 @@ static const char der_type[] = "PC";
#define DER_TAG_EMBEDDED_PDV 0x0b #define DER_TAG_EMBEDDED_PDV 0x0b
#define DER_TAG_UTF8_STRING 0x0c #define DER_TAG_UTF8_STRING 0x0c
#define DER_TAG_RELATIVE_OID 0x0d #define DER_TAG_RELATIVE_OID 0x0d
#define DER_TAG_RESERVED_1 0x0e #define DER_TAG_TIME 0x0e
#define DER_TAG_RESERVED_2 0x0f #define DER_TAG_RESERVED_2 0x0f
#define DER_TAG_SEQUENCE 0x10 #define DER_TAG_SEQUENCE 0x10
#define DER_TAG_SET 0x11 #define DER_TAG_SET 0x11
@ -103,16 +106,23 @@ static const char der_type[] = "PC";
#define DER_TAG_UNIVERSAL_STRING 0x1c #define DER_TAG_UNIVERSAL_STRING 0x1c
#define DER_TAG_CHARACTER_STRING 0x1d #define DER_TAG_CHARACTER_STRING 0x1d
#define DER_TAG_BMP_STRING 0x1e #define DER_TAG_BMP_STRING 0x1e
#define DER_TAG_LONG 0x1f #define DER_TAG_DATE 0x1f
#define DER_TAG_TIME_OF_DAY 0x20
#define DER_TAG_DATE_TIME 0x21
#define DER_TAG_DURATION 0x22
#define DER_TAG_OID_IRI 0x23
#define DER_TAG_RELATIVE_OID_IRI 0x24
#define DER_TAG_LAST 0x25
static const char *der__tag[] = { static const char *der__tag[] = {
"eoc", "bool", "int", "bit_str", "octet_str", "eoc", "bool", "int", "bit_str", "octet_str",
"null", "obj_id", "obj_desc", "ext", "real", "null", "obj_id", "obj_desc", "ext", "real",
"enum", "embed", "utf8_str", "oid", "res1", "enum", "embed", "utf8_str", "rel_oid", "time",
"res2", "seq", "set", "num_str", "prt_str", "res2", "seq", "set", "num_str", "prt_str",
"t61_str", "vid_str", "ia5_str", "utc_time", "t61_str", "vid_str", "ia5_str", "utc_time", "gen_time",
"gen_time", "gr_str", "vis_str", "gen_str", "gr_str", "vis_str", "gen_str", "univ_str", "char_str",
"char_str", "bmp_str", "long" "bmp_str", "date", "tod", "datetime", "duration",
"oid-iri", "rel-oid-iri",
}; };
#ifdef DEBUG_DER #ifdef DEBUG_DER
@ -175,8 +185,10 @@ getlength(const uint8_t *c, size_t *p, size_t l)
size_t len; size_t len;
int is_onebyte_result; int is_onebyte_result;
if (*p >= l) if (*p >= l) {
DPRINTF(("%s:[1] %zu >= %zu\n", __func__, *p, l));
return DER_BAD; return DER_BAD;
}
/* /*
* Digits can either be 0b0 followed by the result, or 0b1 * Digits can either be 0b0 followed by the result, or 0b1
@ -185,8 +197,10 @@ getlength(const uint8_t *c, size_t *p, size_t l)
*/ */
is_onebyte_result = (c[*p] & 0x80) == 0; is_onebyte_result = (c[*p] & 0x80) == 0;
digits = c[(*p)++] & 0x7f; digits = c[(*p)++] & 0x7f;
if (*p + digits >= l) if (*p + digits >= l) {
DPRINTF(("%s:[2] %zu + %u >= %zu\n", __func__, *p, digits, l));
return DER_BAD; return DER_BAD;
}
if (is_onebyte_result) if (is_onebyte_result)
return digits; return digits;
@ -199,15 +213,18 @@ getlength(const uint8_t *c, size_t *p, size_t l)
for (i = 0; i < digits; i++) for (i = 0; i < digits; i++)
len = (len << 8) | c[(*p)++]; len = (len << 8) | c[(*p)++];
if (len > UINT32_MAX - *p || *p + len >= l) if (len > UINT32_MAX - *p || *p + len > l) {
DPRINTF(("%s:[3] bad len %zu + %zu >= %zu\n",
__func__, *p, len, l));
return DER_BAD; return DER_BAD;
}
return CAST(uint32_t, len); return CAST(uint32_t, len);
} }
static const char * static const char *
der_tag(char *buf, size_t len, uint32_t tag) der_tag(char *buf, size_t len, uint32_t tag)
{ {
if (tag < DER_TAG_LONG) if (tag < DER_TAG_LAST)
strlcpy(buf, der__tag[tag], len); strlcpy(buf, der__tag[tag], len);
else else
snprintf(buf, len, "%#x", tag); snprintf(buf, len, "%#x", tag);
@ -223,8 +240,14 @@ der_data(char *buf, size_t blen, uint32_t tag, const void *q, uint32_t len)
case DER_TAG_PRINTABLE_STRING: case DER_TAG_PRINTABLE_STRING:
case DER_TAG_UTF8_STRING: case DER_TAG_UTF8_STRING:
case DER_TAG_IA5_STRING: case DER_TAG_IA5_STRING:
case DER_TAG_UTCTIME:
return snprintf(buf, blen, "%.*s", len, RCAST(const char *, q)); return snprintf(buf, blen, "%.*s", len, RCAST(const char *, q));
case DER_TAG_UTCTIME:
if (len < 12)
break;
return snprintf(buf, blen,
"20%c%c-%c%c-%c%c %c%c:%c%c:%c%c GMT", d[0], d[1], d[2],
d[3], d[4], d[5], d[6], d[7], d[8], d[9], d[10], d[11]);
break;
default: default:
break; break;
} }
@ -243,14 +266,18 @@ der_offs(struct magic_set *ms, struct magic *m, size_t nbytes)
const uint8_t *b = RCAST(const uint8_t *, ms->search.s); const uint8_t *b = RCAST(const uint8_t *, ms->search.s);
size_t offs = 0, len = ms->search.s_len ? ms->search.s_len : nbytes; size_t offs = 0, len = ms->search.s_len ? ms->search.s_len : nbytes;
if (gettag(b, &offs, len) == DER_BAD) if (gettag(b, &offs, len) == DER_BAD) {
DPRINTF(("%s: bad tag 1\n", __func__));
return -1; return -1;
}
DPRINTF(("%s1: %d %" SIZE_T_FORMAT "u %u\n", __func__, ms->offset, DPRINTF(("%s1: %d %" SIZE_T_FORMAT "u %u\n", __func__, ms->offset,
offs, m->offset)); offs, m->offset));
uint32_t tlen = getlength(b, &offs, len); uint32_t tlen = getlength(b, &offs, len);
if (tlen == DER_BAD) if (tlen == DER_BAD) {
DPRINTF(("%s: bad tag 2\n", __func__));
return -1; return -1;
}
DPRINTF(("%s2: %d %" SIZE_T_FORMAT "u %u\n", __func__, ms->offset, DPRINTF(("%s2: %d %" SIZE_T_FORMAT "u %u\n", __func__, ms->offset,
offs, tlen)); offs, tlen));
@ -280,13 +307,22 @@ der_cmp(struct magic_set *ms, struct magic *m)
uint32_t tag, tlen; uint32_t tag, tlen;
char buf[128]; char buf[128];
DPRINTF(("%s: compare %zu bytes\n", __func__, len));
tag = gettag(b, &offs, len); tag = gettag(b, &offs, len);
if (tag == DER_BAD) if (tag == DER_BAD) {
DPRINTF(("%s: bad tag 1\n", __func__));
return -1; return -1;
}
DPRINTF(("%s1: %d %" SIZE_T_FORMAT "u %u\n", __func__, ms->offset,
offs, m->offset));
tlen = getlength(b, &offs, len); tlen = getlength(b, &offs, len);
if (tlen == DER_BAD) if (tlen == DER_BAD) {
DPRINTF(("%s: bad tag 2\n", __func__));
return -1; return -1;
}
der_tag(buf, sizeof(buf), tag); der_tag(buf, sizeof(buf), tag);
if ((ms->flags & MAGIC_DEBUG) != 0) if ((ms->flags & MAGIC_DEBUG) != 0)
@ -342,6 +378,8 @@ printtag(uint32_t tag, const void *q, uint32_t len)
switch (tag) { switch (tag) {
case DER_TAG_PRINTABLE_STRING: case DER_TAG_PRINTABLE_STRING:
case DER_TAG_UTF8_STRING: case DER_TAG_UTF8_STRING:
case DER_TAG_IA5_STRING:
case DER_TAG_UTCTIME:
printf("%.*s\n", len, (const char *)q); printf("%.*s\n", len, (const char *)q);
return; return;
default: default:
@ -365,8 +403,8 @@ printdata(size_t level, const void *v, size_t x, size_t l)
uint8_t c = getclass(p[x]); uint8_t c = getclass(p[x]);
uint8_t t = gettype(p[x]); uint8_t t = gettype(p[x]);
ox = x; ox = x;
if (x != 0) // if (x != 0)
printf("%.2x %.2x %.2x\n", p[x - 1], p[x], p[x + 1]); // printf("%.2x %.2x %.2x\n", p[x - 1], p[x], p[x + 1]);
uint32_t tag = gettag(p, &x, ep - p + x); uint32_t tag = gettag(p, &x, ep - p + x);
if (p + x >= ep) if (p + x >= ep)
break; break;

View File

@ -32,7 +32,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: file.c,v 1.184 2019/08/03 11:51:59 christos Exp $") FILE_RCSID("@(#)$File: file.c,v 1.187 2020/06/07 17:38:30 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -83,7 +83,8 @@ int getopt_long(int, char * const *, const char *,
"Usage: %s [-" FILE_FLAGS "] [--apple] [--extension] [--mime-encoding]\n" \ "Usage: %s [-" FILE_FLAGS "] [--apple] [--extension] [--mime-encoding]\n" \
" [--mime-type] [-e <testname>] [-F <separator>] " \ " [--mime-type] [-e <testname>] [-F <separator>] " \
" [-f <namefile>]\n" \ " [-f <namefile>]\n" \
" [-m <magicfiles>] [-P <parameter=value>] <file> ...\n" \ " [-m <magicfiles>] [-P <parameter=value>] [--exclude-quiet]\n" \
" <file> ...\n" \
" %s -C [-m <magicfiles>]\n" \ " %s -C [-m <magicfiles>]\n" \
" %s [--help]\n" " %s [--help]\n"
@ -100,9 +101,10 @@ private const struct option long_options[] = {
#define OPT_EXTENSIONS 3 #define OPT_EXTENSIONS 3
#define OPT_MIME_TYPE 4 #define OPT_MIME_TYPE 4
#define OPT_MIME_ENCODING 5 #define OPT_MIME_ENCODING 5
#define OPT(shortname, longname, opt, def, doc) \ #define OPT_EXCLUDE_QUIET 6
#define OPT(shortname, longname, opt, def, doc) \
{longname, opt, NULL, shortname}, {longname, opt, NULL, shortname},
#define OPT_LONGONLY(longname, opt, def, doc, id) \ #define OPT_LONGONLY(longname, opt, def, doc, id) \
{longname, opt, NULL, id}, {longname, opt, NULL, id},
#include "file_opts.h" #include "file_opts.h"
#undef OPT #undef OPT
@ -133,14 +135,23 @@ private struct {
int tag; int tag;
size_t value; size_t value;
int set; int set;
size_t def;
const char *desc;
} pm[] = { } pm[] = {
{ "indir", MAGIC_PARAM_INDIR_MAX, 0, 0 }, { "bytes", MAGIC_PARAM_BYTES_MAX, 0, 0, FILE_BYTES_MAX,
{ "name", MAGIC_PARAM_NAME_MAX, 0, 0 }, "max bytes to look inside file" },
{ "elf_phnum", MAGIC_PARAM_ELF_PHNUM_MAX, 0, 0 }, { "elf_notes", MAGIC_PARAM_ELF_NOTES_MAX, 0, 0, FILE_ELF_NOTES_MAX,
{ "elf_shnum", MAGIC_PARAM_ELF_SHNUM_MAX, 0, 0 }, "max ELF notes processed" },
{ "elf_notes", MAGIC_PARAM_ELF_NOTES_MAX, 0, 0 }, { "elf_phnum", MAGIC_PARAM_ELF_PHNUM_MAX, 0, 0, FILE_ELF_PHNUM_MAX,
{ "regex", MAGIC_PARAM_REGEX_MAX, 0, 0 }, "max ELF prog sections processed" },
{ "bytes", MAGIC_PARAM_BYTES_MAX, 0, 0 }, { "elf_shnum", MAGIC_PARAM_ELF_SHNUM_MAX, 0, 0, FILE_ELF_SHNUM_MAX,
"max ELF sections processed" },
{ "indir", MAGIC_PARAM_INDIR_MAX, 0, 0, FILE_INDIR_MAX,
"recursion limit for indirection" },
{ "name", MAGIC_PARAM_NAME_MAX, 0, 0, FILE_NAME_MAX,
"use limit for name/use magic" },
{ "regex", MAGIC_PARAM_REGEX_MAX, 0, 0, FILE_REGEX_MAX,
"length limit for REGEX searches" },
}; };
private int posixly; private int posixly;
@ -237,13 +248,15 @@ main(int argc, char *argv[])
flags |= MAGIC_ERROR; flags |= MAGIC_ERROR;
break; break;
case 'e': case 'e':
case OPT_EXCLUDE_QUIET:
for (i = 0; i < __arraycount(nv); i++) for (i = 0; i < __arraycount(nv); i++)
if (strcmp(nv[i].name, optarg) == 0) if (strcmp(nv[i].name, optarg) == 0)
break; break;
if (i == __arraycount(nv)) if (i == __arraycount(nv)) {
errflg++; if (c != OPT_EXCLUDE_QUIET)
else errflg++;
} else
flags |= nv[i].value; flags |= nv[i].value;
break; break;
@ -609,10 +622,10 @@ private void
docprint(const char *opts, int def) docprint(const char *opts, int def)
{ {
size_t i; size_t i;
int comma; int comma, pad;
char *sp, *p; char *sp, *p;
p = strstr(opts, "%o"); p = strchr(opts, '%');
if (p == NULL) { if (p == NULL) {
fprintf(stdout, "%s", opts); fprintf(stdout, "%s", opts);
defprint(def); defprint(def);
@ -623,17 +636,34 @@ docprint(const char *opts, int def)
continue; continue;
fprintf(stdout, "%.*s", CAST(int, p - opts), opts); fprintf(stdout, "%.*s", CAST(int, p - opts), opts);
pad = (int)CAST(int, p - sp - 1);
comma = 0; switch (*++p) {
for (i = 0; i < __arraycount(nv); i++) { case 'e':
fprintf(stdout, "%s%s", comma++ ? ", " : "", nv[i].name); comma = 0;
if (i && i % 5 == 0 && i != __arraycount(nv) - 1) { for (i = 0; i < __arraycount(nv); i++) {
fprintf(stdout, ",\n%*s", CAST(int, p - sp - 1), ""); fprintf(stdout, "%s%s", comma++ ? ", " : "", nv[i].name);
comma = 0; if (i && i % 5 == 0 && i != __arraycount(nv) - 1) {
fprintf(stdout, ",\n%*s", pad, "");
comma = 0;
}
} }
break;
case 'P':
for (i = 0; i < __arraycount(pm); i++) {
fprintf(stdout, "%9s %7zu %s", pm[i].name, pm[i].def,
pm[i].desc);
if (i != __arraycount(pm) - 1)
fprintf(stdout, "\n%*s", pad, "");
}
break;
default:
file_errx(EXIT_FAILURE, "Unknown escape `%c' in long options",
*p);
break;
} }
fprintf(stdout, "%s", opts + (p - opts) + 1);
fprintf(stdout, "%s", opts + (p - opts) + 2);
} }
private void private void
@ -646,7 +676,7 @@ help(void)
#define OPT(shortname, longname, opt, def, doc) \ #define OPT(shortname, longname, opt, def, doc) \
fprintf(stdout, " -%c, --" longname, shortname), \ fprintf(stdout, " -%c, --" longname, shortname), \
docprint(doc, def); docprint(doc, def);
#define OPT_LONGONLY(longname, opt, def, doc, id) \ #define OPT_LONGONLY(longname, opt, def, doc, id) \
fprintf(stdout, " --" longname), \ fprintf(stdout, " --" longname), \
docprint(doc, def); docprint(doc, def);
#include "file_opts.h" #include "file_opts.h"
@ -680,7 +710,10 @@ file_err(int e, const char *fmt, ...)
fprintf(stderr, "%s: ", file_progname); fprintf(stderr, "%s: ", file_progname);
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
fprintf(stderr, " (%s)\n", strerror(se)); if (se)
fprintf(stderr, " (%s)\n", strerror(se));
else
fputc('\n', stderr);
exit(e); exit(e);
} }
@ -707,7 +740,10 @@ file_warn(const char *fmt, ...)
fprintf(stderr, "%s: ", file_progname); fprintf(stderr, "%s: ", file_progname);
vfprintf(stderr, fmt, ap); vfprintf(stderr, fmt, ap);
va_end(ap); va_end(ap);
fprintf(stderr, " (%s)\n", strerror(se)); if (se)
fprintf(stderr, " (%s)\n", strerror(se));
else
fputc('\n', stderr);
errno = se; errno = se;
} }

View File

@ -27,7 +27,7 @@
*/ */
/* /*
* file.h - definitions for file(1) program * file.h - definitions for file(1) program
* @(#)$File: file.h,v 1.208 2019/06/26 20:31:31 christos Exp $ * @(#)$File: file.h,v 1.220 2020/06/08 17:38:27 christos Exp $
*/ */
#ifndef __file_h__ #ifndef __file_h__
@ -36,7 +36,15 @@
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
#endif #endif
#ifdef HAVE_STDINT_H #ifdef HAVE_STDINT_H
#include <stdint.h>
#endif
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#ifndef __STDC_LIMIT_MACROS #ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS
#endif #endif
@ -44,28 +52,33 @@
#define __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS
#endif #endif
#ifdef WIN32 #ifdef _WIN32
#ifdef _WIN64 # ifdef PRIu32
#define SIZE_T_FORMAT "I64" # ifdef _WIN64
#else # define SIZE_T_FORMAT PRIu64
#define SIZE_T_FORMAT "" # else
#endif # define SIZE_T_FORMAT PRIu32
#define INT64_T_FORMAT "I64" # endif
#define INTMAX_T_FORMAT "I64" # define INT64_T_FORMAT PRIi64
# define INTMAX_T_FORMAT PRIiMAX
# else
# ifdef _WIN64
# define SIZE_T_FORMAT "I64"
# else
# define SIZE_T_FORMAT ""
# endif
# define INT64_T_FORMAT "I64"
# define INTMAX_T_FORMAT "I64"
# endif
#else #else
#define SIZE_T_FORMAT "z" # define SIZE_T_FORMAT "z"
#define INT64_T_FORMAT "ll" # define INT64_T_FORMAT "ll"
#define INTMAX_T_FORMAT "j" # define INTMAX_T_FORMAT "j"
#endif
#include <stdint.h>
#endif #endif
#include <stdio.h> /* Include that here, to make sure __P gets defined */ #include <stdio.h> /* Include that here, to make sure __P gets defined */
#include <errno.h> #include <errno.h>
#include <fcntl.h> /* For open and flags */ #include <fcntl.h> /* For open and flags */
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#endif
#include <regex.h> #include <regex.h>
#include <time.h> #include <time.h>
#include <sys/types.h> #include <sys/types.h>
@ -130,18 +143,16 @@
#define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b))
#endif #endif
#ifndef FILE_BYTES_MAX #define FILE_BADSIZE CAST(size_t, ~0ul)
# define FILE_BYTES_MAX (1024 * 1024) /* how much of the file to look at */
#endif
#define MAXMAGIS 8192 /* max entries in any one magic file
or directory */
#define MAXDESC 64 /* max len of text description/MIME type */ #define MAXDESC 64 /* max len of text description/MIME type */
#define MAXMIME 80 /* max len of text MIME type */ #define MAXMIME 80 /* max len of text MIME type */
#define MAXstring 96 /* max len of "string" types */ #define MAXstring 128 /* max len of "string" types */
#define MAGICNO 0xF11E041C #define MAGICNO 0xF11E041C
#define VERSIONNO 14 #define VERSIONNO 16
#define FILE_MAGICSIZE 344 #define FILE_MAGICSIZE 376
#define FILE_GUID_SIZE sizeof("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
#define FILE_LOAD 0 #define FILE_LOAD 0
#define FILE_CHECK 1 #define FILE_CHECK 1
@ -168,6 +179,7 @@ union VALUETYPE {
uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */ uint8_t hq[8]; /* 8 bytes of a fixed-endian "quad" */
char s[MAXstring]; /* the search string or regex pattern */ char s[MAXstring]; /* the search string or regex pattern */
unsigned char us[MAXstring]; unsigned char us[MAXstring];
uint64_t guid[2];
float f; float f;
double d; double d;
}; };
@ -184,6 +196,7 @@ struct magic {
#define BINTEST 0x20 /* test is for a binary type (set only #define BINTEST 0x20 /* test is for a binary type (set only
for top-level tests) */ for top-level tests) */
#define TEXTTEST 0x40 /* for passing to file_softmagic */ #define TEXTTEST 0x40 /* for passing to file_softmagic */
#define OFFNEGATIVE 0x80 /* relative to the end of file */
uint8_t factor; uint8_t factor;
@ -241,7 +254,9 @@ struct magic {
#define FILE_USE 46 #define FILE_USE 46
#define FILE_CLEAR 47 #define FILE_CLEAR 47
#define FILE_DER 48 #define FILE_DER 48
#define FILE_NAMES_SIZE 49 /* size of array to contain all names */ #define FILE_GUID 49
#define FILE_OFFSET 50
#define FILE_NAMES_SIZE 51 /* size of array to contain all names */
#define IS_STRING(t) \ #define IS_STRING(t) \
((t) == FILE_STRING || \ ((t) == FILE_STRING || \
@ -405,9 +420,10 @@ struct magic_set {
} c; } c;
struct out { struct out {
char *buf; /* Accumulation buffer */ char *buf; /* Accumulation buffer */
size_t blen; /* Length of buffer */
char *pbuf; /* Printable buffer */ char *pbuf; /* Printable buffer */
} o; } o;
uint32_t offset; /* a copy of m->offset while we */ uint32_t offset; /* a copy of m->offset while we */
/* are working on the magic entry */ /* are working on the magic entry */
uint32_t eoffset; /* offset from end of file */ uint32_t eoffset; /* offset from end of file */
int error; int error;
@ -436,11 +452,14 @@ struct magic_set {
uint16_t elf_notes_max; uint16_t elf_notes_max;
uint16_t regex_max; uint16_t regex_max;
size_t bytes_max; /* number of bytes to read from file */ size_t bytes_max; /* number of bytes to read from file */
#define FILE_INDIR_MAX 50 #ifndef FILE_BYTES_MAX
#define FILE_NAME_MAX 30 # define FILE_BYTES_MAX (1024 * 1024) /* how much of the file to look at */
#define FILE_ELF_SHNUM_MAX 32768 #endif
#define FILE_ELF_PHNUM_MAX 2048
#define FILE_ELF_NOTES_MAX 256 #define FILE_ELF_NOTES_MAX 256
#define FILE_ELF_PHNUM_MAX 2048
#define FILE_ELF_SHNUM_MAX 32768
#define FILE_INDIR_MAX 50
#define FILE_NAME_MAX 50
#define FILE_REGEX_MAX 8192 #define FILE_REGEX_MAX 8192
}; };
@ -450,7 +469,7 @@ typedef unsigned long unichar;
struct stat; struct stat;
#define FILE_T_LOCAL 1 #define FILE_T_LOCAL 1
#define FILE_T_WINDOWS 2 #define FILE_T_WINDOWS 2
protected const char *file_fmttime(uint64_t, int, char *); protected const char *file_fmttime(char *, size_t, uint64_t, int);
protected struct magic_set *file_ms_alloc(int); protected struct magic_set *file_ms_alloc(int);
protected void file_ms_free(struct magic_set *); protected void file_ms_free(struct magic_set *);
protected int file_default(struct magic_set *, size_t); protected int file_default(struct magic_set *, size_t);
@ -461,7 +480,11 @@ protected int file_pipe2file(struct magic_set *, int, const void *, size_t);
protected int file_vprintf(struct magic_set *, const char *, va_list) protected int file_vprintf(struct magic_set *, const char *, va_list)
__attribute__((__format__(__printf__, 2, 0))); __attribute__((__format__(__printf__, 2, 0)));
protected int file_separator(struct magic_set *); protected int file_separator(struct magic_set *);
protected char *file_copystr(char *, size_t, size_t, const char *);
protected int file_checkfmt(char *, size_t, const char *);
protected size_t file_printedlen(const struct magic_set *); protected size_t file_printedlen(const struct magic_set *);
protected int file_print_guid(char *, size_t, const uint64_t *);
protected int file_parse_guid(const char *, uint64_t *);
protected int file_replace(struct magic_set *, const char *, const char *); protected int file_replace(struct magic_set *, const char *, const char *);
protected int file_printf(struct magic_set *, const char *, ...) protected int file_printf(struct magic_set *, const char *, ...)
__attribute__((__format__(__printf__, 2, 3))); __attribute__((__format__(__printf__, 2, 3)));
@ -506,8 +529,10 @@ protected ssize_t sread(int, void *, size_t, int);
protected int file_check_mem(struct magic_set *, unsigned int); protected int file_check_mem(struct magic_set *, unsigned int);
protected int file_looks_utf8(const unsigned char *, size_t, unichar *, protected int file_looks_utf8(const unsigned char *, size_t, unichar *,
size_t *); size_t *);
protected size_t file_pstring_length_size(const struct magic *); protected size_t file_pstring_length_size(struct magic_set *,
protected size_t file_pstring_get_length(const struct magic *, const char *); const struct magic *);
protected size_t file_pstring_get_length(struct magic_set *,
const struct magic *, const char *);
protected char * file_printable(char *, size_t, const char *, size_t); protected char * file_printable(char *, size_t, const char *, size_t);
#ifdef __EMX__ #ifdef __EMX__
protected int file_os2_apptype(struct magic_set *, const char *, const void *, protected int file_os2_apptype(struct magic_set *, const char *, const void *,
@ -545,6 +570,7 @@ protected void file_regerror(file_regex_t *, int, struct magic_set *);
typedef struct { typedef struct {
char *buf; char *buf;
size_t blen;
uint32_t offset; uint32_t offset;
} file_pushbuf_t; } file_pushbuf_t;

View File

@ -15,48 +15,75 @@
* switch statement! * switch statement!
*/ */
OPT_LONGONLY("help", 0, 0, " display this help and exit\n", OPT_HELP) OPT_LONGONLY("help", 0, 0,
OPT('v', "version", 0, 0, " output version information and exit\n") " display this help and exit\n", OPT_HELP)
OPT('m', "magic-file", 1, 0, " LIST use LIST as a colon-separated list of magic\n" OPT('v', "version", 0, 0,
" output version information and exit\n")
OPT('m', "magic-file", 1, 0,
" LIST use LIST as a colon-separated list of magic\n"
" number files\n") " number files\n")
OPT('z', "uncompress", 0, 0, " try to look inside compressed files\n") OPT('z', "uncompress", 0, 0,
OPT('Z', "uncompress-noreport", 0, 0, " only print the contents of compressed files\n") " try to look inside compressed files\n")
OPT('b', "brief", 0, 0, " do not prepend filenames to output lines\n") OPT('Z', "uncompress-noreport", 0, 0,
OPT('c', "checking-printout", 0, 0, " print the parsed form of the magic file, use in\n" " only print the contents of compressed files\n")
OPT('b', "brief", 0, 0,
" do not prepend filenames to output lines\n")
OPT('c', "checking-printout", 0, 0,
" print the parsed form of the magic file, use in\n"
" conjunction with -m to debug a new magic file\n" " conjunction with -m to debug a new magic file\n"
" before installing it\n") " before installing it\n")
OPT('e', "exclude", 1, 0, " TEST exclude TEST from the list of test to be\n" OPT('e', "exclude", 1, 0,
" TEST exclude TEST from the list of test to be\n"
" performed for file. Valid tests are:\n" " performed for file. Valid tests are:\n"
" %o\n") " %e\n")
OPT('f', "files-from", 1, 0, " FILE read the filenames to be examined from FILE\n") OPT_LONGONLY("exclude-quiet", 1, 0,
OPT('F', "separator", 1, 0, " STRING use string as separator instead of `:'\n") " TEST like exclude, but ignore unknown tests\n", OPT_EXCLUDE_QUIET)
OPT('i', "mime", 0, 0, " output MIME type strings (--mime-type and\n" OPT('f', "files-from", 1, 0,
" FILE read the filenames to be examined from FILE\n")
OPT('F', "separator", 1, 0,
" STRING use string as separator instead of `:'\n")
OPT('i', "mime", 0, 0,
" output MIME type strings (--mime-type and\n"
" --mime-encoding)\n") " --mime-encoding)\n")
OPT_LONGONLY("apple", 0, 0, " output the Apple CREATOR/TYPE\n", OPT_APPLE) OPT_LONGONLY("apple", 0, 0,
OPT_LONGONLY("extension", 0, 0, " output a slash-separated list of extensions\n", OPT_EXTENSIONS) " output the Apple CREATOR/TYPE\n", OPT_APPLE)
OPT_LONGONLY("mime-type", 0, 0, " output the MIME type\n", OPT_MIME_TYPE) OPT_LONGONLY("extension", 0, 0,
OPT_LONGONLY("mime-encoding", 0, 0, " output the MIME encoding\n", OPT_MIME_ENCODING) " output a slash-separated list of extensions\n", OPT_EXTENSIONS)
OPT('k', "keep-going", 0, 0, " don't stop at the first match\n") OPT_LONGONLY("mime-type", 0, 0,
OPT('l', "list", 0, 0, " list magic strength\n") " output the MIME type\n", OPT_MIME_TYPE)
OPT_LONGONLY("mime-encoding", 0, 0,
" output the MIME encoding\n", OPT_MIME_ENCODING)
OPT('k', "keep-going", 0, 0,
" don't stop at the first match\n")
OPT('l', "list", 0, 0,
" list magic strength\n")
#ifdef S_IFLNK #ifdef S_IFLNK
OPT('L', "dereference", 0, 1, " follow symlinks") OPT('L', "dereference", 0, 1,
OPT('h', "no-dereference", 0, 2, " don't follow symlinks") " follow symlinks")
OPT('h', "no-dereference", 0, 2,
" don't follow symlinks")
#endif #endif
OPT('n', "no-buffer", 0, 0, " do not buffer output\n") OPT('n', "no-buffer", 0, 0,
OPT('N', "no-pad", 0, 0, " do not pad output\n") " do not buffer output\n")
OPT('0', "print0", 0, 0, " terminate filenames with ASCII NUL\n") OPT('N', "no-pad", 0, 0,
" do not pad output\n")
OPT('0', "print0", 0, 0,
" terminate filenames with ASCII NUL\n")
#if defined(HAVE_UTIME) || defined(HAVE_UTIMES) #if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
OPT('p', "preserve-date", 0, 0, " preserve access times on files\n") OPT('p', "preserve-date", 0, 0,
" preserve access times on files\n")
#endif #endif
OPT('P', "parameter", 1, 0, " set file engine parameter limits\n" OPT('P', "parameter", 1, 0,
" indir 15 recursion limit for indirection\n" " set file engine parameter limits\n"
" name 30 use limit for name/use magic\n" " %P\n")
" elf_notes 256 max ELF notes processed\n" OPT('r', "raw", 0, 0,
" elf_phnum 128 max ELF prog sections processed\n" " don't translate unprintable chars to \\ooo\n")
" elf_shnum 32768 max ELF sections processed\n") OPT('s', "special-files", 0, 0,
OPT('r', "raw", 0, 0, " don't translate unprintable chars to \\ooo\n") " treat special (block/char devices) files as\n"
OPT('s', "special-files", 0, 0, " treat special (block/char devices) files as\n"
" ordinary ones\n") " ordinary ones\n")
OPT('S', "no-sandbox", 0, 0, " disable system call sandboxing\n") OPT('S', "no-sandbox", 0, 0,
OPT('C', "compile", 0, 0, " compile file specified by -m\n") " disable system call sandboxing\n")
OPT('d', "debug", 0, 0, " print debugging messages\n") OPT('C', "compile", 0, 0,
" compile file specified by -m\n")
OPT('d', "debug", 0, 0,
" print debugging messages\n")

View File

@ -27,7 +27,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: funcs.c,v 1.108 2019/11/09 00:35:46 christos Exp $") FILE_RCSID("@(#)$File: funcs.c,v 1.115 2020/02/20 15:50:20 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -48,6 +48,77 @@ FILE_RCSID("@(#)$File: funcs.c,v 1.108 2019/11/09 00:35:46 christos Exp $")
#define SIZE_MAX ((size_t)~0) #define SIZE_MAX ((size_t)~0)
#endif #endif
protected char *
file_copystr(char *buf, size_t blen, size_t width, const char *str)
{
if (++width > blen)
width = blen;
strlcpy(buf, str, width);
return buf;
}
private void
file_clearbuf(struct magic_set *ms)
{
free(ms->o.buf);
ms->o.buf = NULL;
ms->o.blen = 0;
}
private int
file_checkfield(char *msg, size_t mlen, const char *what, const char **pp)
{
const char *p = *pp;
int fw = 0;
while (*p && isdigit((unsigned char)*p))
fw = fw * 10 + (*p++ - '0');
*pp = p;
if (fw < 1024)
return 1;
if (msg)
snprintf(msg, mlen, "field %s too large: %d", what, fw);
return 0;
}
protected int
file_checkfmt(char *msg, size_t mlen, const char *fmt)
{
for (const char *p = fmt; *p; p++) {
if (*p != '%')
continue;
if (*++p == '%')
continue;
// Skip uninteresting.
while (strchr("0.'+- ", *p) != NULL)
p++;
if (*p == '*') {
if (msg)
snprintf(msg, mlen, "* not allowed in format");
return -1;
}
if (!file_checkfield(msg, mlen, "width", &p))
return -1;
if (*p == '.') {
p++;
if (!file_checkfield(msg, mlen, "precision", &p))
return -1;
}
if (!isalpha((unsigned char)*p)) {
if (msg)
snprintf(msg, mlen, "bad format char: %c", *p);
return -1;
}
}
return 0;
}
/* /*
* Like printf, only we append to a buffer. * Like printf, only we append to a buffer.
*/ */
@ -56,12 +127,26 @@ file_vprintf(struct magic_set *ms, const char *fmt, va_list ap)
{ {
int len; int len;
char *buf, *newstr; char *buf, *newstr;
char tbuf[1024];
if (ms->event_flags & EVENT_HAD_ERR) if (ms->event_flags & EVENT_HAD_ERR)
return 0; return 0;
if (file_checkfmt(tbuf, sizeof(tbuf), fmt)) {
file_clearbuf(ms);
file_error(ms, 0, "Bad magic format `%s' (%s)", fmt, tbuf);
return -1;
}
len = vasprintf(&buf, fmt, ap); len = vasprintf(&buf, fmt, ap);
if (len < 0) if (len < 0 || (size_t)len > 1024 || len + ms->o.blen > 1024 * 1024) {
goto out; size_t blen = ms->o.blen;
free(buf);
file_clearbuf(ms);
file_error(ms, 0, "Output buffer space exceeded %d+%zu", len,
blen);
return -1;
}
if (ms->o.buf != NULL) { if (ms->o.buf != NULL) {
len = asprintf(&newstr, "%s%s", ms->o.buf, buf); len = asprintf(&newstr, "%s%s", ms->o.buf, buf);
@ -72,9 +157,11 @@ file_vprintf(struct magic_set *ms, const char *fmt, va_list ap)
buf = newstr; buf = newstr;
} }
ms->o.buf = buf; ms->o.buf = buf;
ms->o.blen = len;
return 0; return 0;
out: out:
fprintf(stderr, "vasprintf failed (%s)", strerror(errno)); file_clearbuf(ms);
file_error(ms, errno, "vasprintf failed");
return -1; return -1;
} }
@ -103,8 +190,7 @@ file_error_core(struct magic_set *ms, int error, const char *f, va_list va,
if (ms->event_flags & EVENT_HAD_ERR) if (ms->event_flags & EVENT_HAD_ERR)
return; return;
if (lineno != 0) { if (lineno != 0) {
free(ms->o.buf); file_clearbuf(ms);
ms->o.buf = NULL;
(void)file_printf(ms, "line %" SIZE_T_FORMAT "u:", lineno); (void)file_printf(ms, "line %" SIZE_T_FORMAT "u:", lineno);
} }
if (ms->o.buf && *ms->o.buf) if (ms->o.buf && *ms->o.buf)
@ -393,10 +479,7 @@ file_reset(struct magic_set *ms, int checkloaded)
file_error(ms, 0, "no magic files loaded"); file_error(ms, 0, "no magic files loaded");
return -1; return -1;
} }
if (ms->o.buf) { file_clearbuf(ms);
free(ms->o.buf);
ms->o.buf = NULL;
}
if (ms->o.pbuf) { if (ms->o.pbuf) {
free(ms->o.pbuf); free(ms->o.pbuf);
ms->o.pbuf = NULL; ms->o.pbuf = NULL;
@ -518,7 +601,7 @@ file_check_mem(struct magic_set *ms, unsigned int level)
protected size_t protected size_t
file_printedlen(const struct magic_set *ms) file_printedlen(const struct magic_set *ms)
{ {
return ms->o.buf == NULL ? 0 : strlen(ms->o.buf); return ms->o.blen;
} }
protected int protected int
@ -614,9 +697,11 @@ file_push_buffer(struct magic_set *ms)
return NULL; return NULL;
pb->buf = ms->o.buf; pb->buf = ms->o.buf;
pb->blen = ms->o.blen;
pb->offset = ms->offset; pb->offset = ms->offset;
ms->o.buf = NULL; ms->o.buf = NULL;
ms->o.blen = 0;
ms->offset = 0; ms->offset = 0;
return pb; return pb;
@ -636,6 +721,7 @@ file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
rbuf = ms->o.buf; rbuf = ms->o.buf;
ms->o.buf = pb->buf; ms->o.buf = pb->buf;
ms->o.blen = pb->blen;
ms->offset = pb->offset; ms->offset = pb->offset;
free(pb); free(pb);
@ -667,3 +753,33 @@ file_printable(char *buf, size_t bufsiz, const char *str, size_t slen)
*ptr = '\0'; *ptr = '\0';
return buf; return buf;
} }
struct guid {
uint32_t data1;
uint16_t data2;
uint16_t data3;
uint8_t data4[8];
};
protected int
file_parse_guid(const char *s, uint64_t *guid)
{
struct guid *g = CAST(struct guid *, guid);
return sscanf(s,
"%8x-%4hx-%4hx-%2hhx%2hhx-%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx",
&g->data1, &g->data2, &g->data3, &g->data4[0], &g->data4[1],
&g->data4[2], &g->data4[3], &g->data4[4], &g->data4[5],
&g->data4[6], &g->data4[7]) == 11 ? 0 : -1;
}
protected int
file_print_guid(char *str, size_t len, const uint64_t *guid)
{
const struct guid *g = CAST(const struct guid *, guid);
return snprintf(str, len, "%.8X-%.4hX-%.4hX-%.2hhX%.2hhX-"
"%.2hhX%.2hhX%.2hhX%.2hhX%.2hhX%.2hhX",
g->data1, g->data2, g->data3, g->data4[0], g->data4[1],
g->data4[2], g->data4[3], g->data4[4], g->data4[5],
g->data4[6], g->data4[7]);
}

View File

@ -32,7 +32,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: is_json.c,v 1.13 2019/03/02 01:08:10 christos Exp $") FILE_RCSID("@(#)$File: is_json.c,v 1.15 2020/06/07 19:05:47 christos Exp $")
#endif #endif
#include <string.h> #include <string.h>
@ -156,6 +156,7 @@ json_parse_string(const unsigned char **ucp, const unsigned char *ue)
} }
case '"': case '"':
*ucp = uc; *ucp = uc;
DPRINTF("Good string: ", uc, *ucp);
return 1; return 1;
default: default:
continue; continue;
@ -172,23 +173,24 @@ json_parse_array(const unsigned char **ucp, const unsigned char *ue,
size_t *st, size_t lvl) size_t *st, size_t lvl)
{ {
const unsigned char *uc = *ucp; const unsigned char *uc = *ucp;
int more = 0; /* Array has more than 1 element */
DPRINTF("Parse array: ", uc, *ucp); DPRINTF("Parse array: ", uc, *ucp);
while (uc < ue) { while (uc < ue) {
if (*uc == ']')
goto done;
if (!json_parse(&uc, ue, st, lvl + 1)) if (!json_parse(&uc, ue, st, lvl + 1))
goto out; goto out;
if (uc == ue) if (uc == ue)
goto out; goto out;
switch (*uc) { switch (*uc) {
case ',': case ',':
more++;
uc++; uc++;
continue; continue;
case ']': case ']':
if (more) done:
st[JSON_ARRAYN]++; st[JSON_ARRAYN]++;
*ucp = uc + 1; *ucp = uc + 1;
DPRINTF("Good array: ", uc, *ucp);
return 1; return 1;
default: default:
goto out; goto out;
@ -210,6 +212,10 @@ json_parse_object(const unsigned char **ucp, const unsigned char *ue,
uc = json_skip_space(uc, ue); uc = json_skip_space(uc, ue);
if (uc == ue) if (uc == ue)
goto out; goto out;
if (*uc == '}') {
uc++;
goto done;
}
if (*uc++ != '"') { if (*uc++ != '"') {
DPRINTF("not string", uc, *ucp); DPRINTF("not string", uc, *ucp);
goto out; goto out;
@ -236,6 +242,7 @@ json_parse_object(const unsigned char **ucp, const unsigned char *ue,
case ',': case ',':
continue; continue;
case '}': /* { */ case '}': /* { */
done:
*ucp = uc; *ucp = uc;
DPRINTF("Good object: ", uc, *ucp); DPRINTF("Good object: ", uc, *ucp);
return 1; return 1;

View File

@ -33,7 +33,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: magic.c,v 1.111 2019/05/07 02:27:11 christos Exp $") FILE_RCSID("@(#)$File: magic.c,v 1.112 2020/06/08 19:44:10 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -463,8 +463,7 @@ file_or_fd(struct magic_set *ms, const char *inname, int fd)
} }
if (fd != -1) { if (fd != -1) {
if (!okstat) okstat = fstat(fd, &sb) == 0;
okstat = fstat(fd, &sb) == 0;
if (okstat && S_ISFIFO(sb.st_mode)) if (okstat && S_ISFIFO(sb.st_mode))
ispipe = 1; ispipe = 1;
if (inname == NULL) if (inname == NULL)

View File

@ -32,7 +32,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: print.c,v 1.85 2019/03/12 20:43:05 christos Exp $") FILE_RCSID("@(#)$File: print.c,v 1.88 2020/05/09 18:57:15 christos Exp $")
#endif /* lint */ #endif /* lint */
#include <string.h> #include <string.h>
@ -50,7 +50,7 @@ protected void
file_mdump(struct magic *m) file_mdump(struct magic *m)
{ {
static const char optyp[] = { FILE_OPS }; static const char optyp[] = { FILE_OPS };
char tbuf[26]; char tbuf[256];
(void) fprintf(stderr, "%u: %.*s %u", m->lineno, (void) fprintf(stderr, "%u: %.*s %u", m->lineno,
(m->cont_level & 7) + 1, ">>>>>>>>", m->offset); (m->cont_level & 7) + 1, ">>>>>>>>", m->offset);
@ -139,6 +139,7 @@ file_mdump(struct magic *m)
case FILE_BEQUAD: case FILE_BEQUAD:
case FILE_LEQUAD: case FILE_LEQUAD:
case FILE_QUAD: case FILE_QUAD:
case FILE_OFFSET:
(void) fprintf(stderr, "%" INT64_T_FORMAT "d", (void) fprintf(stderr, "%" INT64_T_FORMAT "d",
CAST(long long, m->value.q)); CAST(long long, m->value.q));
break; break;
@ -156,32 +157,35 @@ file_mdump(struct magic *m)
case FILE_BEDATE: case FILE_BEDATE:
case FILE_MEDATE: case FILE_MEDATE:
(void)fprintf(stderr, "%s,", (void)fprintf(stderr, "%s,",
file_fmttime(m->value.l, 0, tbuf)); file_fmttime(tbuf, sizeof(tbuf), m->value.l, 0));
break; break;
case FILE_LDATE: case FILE_LDATE:
case FILE_LELDATE: case FILE_LELDATE:
case FILE_BELDATE: case FILE_BELDATE:
case FILE_MELDATE: case FILE_MELDATE:
(void)fprintf(stderr, "%s,", (void)fprintf(stderr, "%s,",
file_fmttime(m->value.l, FILE_T_LOCAL, tbuf)); file_fmttime(tbuf, sizeof(tbuf), m->value.l,
FILE_T_LOCAL));
break; break;
case FILE_QDATE: case FILE_QDATE:
case FILE_LEQDATE: case FILE_LEQDATE:
case FILE_BEQDATE: case FILE_BEQDATE:
(void)fprintf(stderr, "%s,", (void)fprintf(stderr, "%s,",
file_fmttime(m->value.q, 0, tbuf)); file_fmttime(tbuf, sizeof(tbuf), m->value.q, 0));
break; break;
case FILE_QLDATE: case FILE_QLDATE:
case FILE_LEQLDATE: case FILE_LEQLDATE:
case FILE_BEQLDATE: case FILE_BEQLDATE:
(void)fprintf(stderr, "%s,", (void)fprintf(stderr, "%s,",
file_fmttime(m->value.q, FILE_T_LOCAL, tbuf)); file_fmttime(tbuf, sizeof(tbuf), m->value.q,
FILE_T_LOCAL));
break; break;
case FILE_QWDATE: case FILE_QWDATE:
case FILE_LEQWDATE: case FILE_LEQWDATE:
case FILE_BEQWDATE: case FILE_BEQWDATE:
(void)fprintf(stderr, "%s,", (void)fprintf(stderr, "%s,",
file_fmttime(m->value.q, FILE_T_WINDOWS, tbuf)); file_fmttime(tbuf, sizeof(tbuf), m->value.q,
FILE_T_WINDOWS));
break; break;
case FILE_FLOAT: case FILE_FLOAT:
case FILE_BEFLOAT: case FILE_BEFLOAT:
@ -201,6 +205,12 @@ file_mdump(struct magic *m)
case FILE_DER: case FILE_DER:
(void) fprintf(stderr, "'%s'", m->value.s); (void) fprintf(stderr, "'%s'", m->value.s);
break; break;
case FILE_GUID:
(void) file_print_guid(tbuf, sizeof(tbuf),
m->value.guid);
(void) fprintf(stderr, "%s", tbuf);
break;
default: default:
(void) fprintf(stderr, "*bad type %d*", m->type); (void) fprintf(stderr, "*bad type %d*", m->type);
break; break;
@ -230,7 +240,7 @@ file_magwarn(struct magic_set *ms, const char *f, ...)
} }
protected const char * protected const char *
file_fmttime(uint64_t v, int flags, char *buf) file_fmttime(char *buf, size_t bsize, uint64_t v, int flags)
{ {
char *pp; char *pp;
time_t t; time_t t;
@ -260,5 +270,6 @@ file_fmttime(uint64_t v, int flags, char *buf)
pp[strcspn(pp, "\n")] = '\0'; pp[strcspn(pp, "\n")] = '\0';
return pp; return pp;
out: out:
return strcpy(buf, "*Invalid time*"); strlcpy(buf, "*Invalid time*", bsize);
return buf;
} }

View File

@ -27,7 +27,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: readelf.c,v 1.168 2019/12/16 03:49:19 christos Exp $") FILE_RCSID("@(#)$File: readelf.c,v 1.173 2020/06/07 22:12:54 christos Exp $")
#endif #endif
#ifdef BUILTIN_ELF #ifdef BUILTIN_ELF
@ -67,6 +67,8 @@ private uint64_t getu64(int, uint64_t);
private int private int
toomany(struct magic_set *ms, const char *name, uint16_t num) toomany(struct magic_set *ms, const char *name, uint16_t num)
{ {
if (ms->flags & MAGIC_MIME)
return 1;
if (file_printf(ms, ", too many %s (%u)", name, num) == -1) if (file_printf(ms, ", too many %s (%u)", name, num) == -1)
return -1; return -1;
return 1; return 1;
@ -355,6 +357,9 @@ dophn_core(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
off_t ph_off = off; off_t ph_off = off;
int ph_num = num; int ph_num = num;
if (ms->flags & MAGIC_MIME)
return 0;
if (num == 0) { if (num == 0) {
if (file_printf(ms, ", no program header") == -1) if (file_printf(ms, ", no program header") == -1)
return -1; return -1;
@ -568,8 +573,10 @@ do_bid_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
} }
if (namesz == 4 && strcmp(RCAST(char *, &nbuf[noff]), "Go") == 0 && if (namesz == 4 && strcmp(RCAST(char *, &nbuf[noff]), "Go") == 0 &&
type == NT_GO_BUILD_ID && descsz < 128) { type == NT_GO_BUILD_ID && descsz < 128) {
if (file_printf(ms, ", Go BuildID=%.*s", char buf[256];
CAST(int, descsz), RCAST(char *, &nbuf[doff])) == -1) if (file_printf(ms, ", Go BuildID=%s",
file_copystr(buf, sizeof(buf), descsz,
RCAST(const char *, &nbuf[doff]))) == -1)
return -1; return -1;
return 1; return 1;
} }
@ -721,6 +728,7 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
size_t noff, size_t doff, int *flags, size_t size, int clazz) size_t noff, size_t doff, int *flags, size_t size, int clazz)
{ {
#ifdef ELFCORE #ifdef ELFCORE
char buf[256];
const char *name = RCAST(const char *, &nbuf[noff]); const char *name = RCAST(const char *, &nbuf[noff]);
int os_style = -1; int os_style = -1;
@ -901,8 +909,10 @@ do_core_note(struct magic_set *ms, unsigned char *nbuf, uint32_t type,
*/ */
while (cp > cname && isspace(cp[-1])) while (cp > cname && isspace(cp[-1]))
cp--; cp--;
if (file_printf(ms, ", from '%.*s'", if (file_printf(ms, ", from '%s'",
CAST(int, cp - cname), cname) == -1) file_copystr(buf, sizeof(buf),
CAST(size_t, cp - cname),
CAST(const char *, cname))) == -1)
return -1; return -1;
*flags |= FLAGS_DID_CORE; *flags |= FLAGS_DID_CORE;
return 1; return 1;
@ -1128,6 +1138,7 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
Elf64_Nhdr nh64; Elf64_Nhdr nh64;
size_t noff, doff; size_t noff, doff;
uint32_t namesz, descsz; uint32_t namesz, descsz;
char buf[256];
unsigned char *nbuf = CAST(unsigned char *, vbuf); unsigned char *nbuf = CAST(unsigned char *, vbuf);
if (*notecount == 0) if (*notecount == 0)
@ -1255,7 +1266,8 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
str = RCAST(const char *, &nbuf[doff]); str = RCAST(const char *, &nbuf[doff]);
descw = CAST(int, descsz); descw = CAST(int, descsz);
*flags |= flag; *flags |= flag;
file_printf(ms, ", %s: %.*s", tag, descw, str); file_printf(ms, ", %s: %s", tag,
file_copystr(buf, sizeof(buf), descw, str));
return offset; return offset;
} }
@ -1328,6 +1340,9 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
char name[50]; char name[50];
ssize_t namesize; ssize_t namesize;
if (ms->flags & MAGIC_MIME)
return 0;
if (num == 0) { if (num == 0) {
if (file_printf(ms, ", no section header") == -1) if (file_printf(ms, ", no section header") == -1)
return -1; return -1;
@ -1639,6 +1654,7 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
switch (xph_type) { switch (xph_type) {
case PT_DYNAMIC: case PT_DYNAMIC:
doread = 1; doread = 1;
linking_style = "dynamically";
break; break;
case PT_NOTE: case PT_NOTE:
if (sh_num) /* Did this through section headers */ if (sh_num) /* Did this through section headers */
@ -1653,7 +1669,6 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
} }
/*FALLTHROUGH*/ /*FALLTHROUGH*/
case PT_INTERP: case PT_INTERP:
linking_style = "dynamically";
doread = 1; doread = 1;
break; break;
default: default:
@ -1690,9 +1705,13 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
if (offset == 0) if (offset == 0)
break; break;
} }
if (ms->flags & MAGIC_MIME)
continue;
break; break;
case PT_INTERP: case PT_INTERP:
if (ms->flags & MAGIC_MIME)
continue;
if (bufsize && nbuf[0]) { if (bufsize && nbuf[0]) {
nbuf[bufsize - 1] = '\0'; nbuf[bufsize - 1] = '\0';
memcpy(interp, nbuf, CAST(size_t, bufsize)); memcpy(interp, nbuf, CAST(size_t, bufsize));
@ -1700,6 +1719,8 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
strlcpy(interp, "*empty*", sizeof(interp)); strlcpy(interp, "*empty*", sizeof(interp));
break; break;
case PT_NOTE: case PT_NOTE:
if (ms->flags & MAGIC_MIME)
return 0;
/* /*
* This is a PT_NOTE section; loop through all the notes * This is a PT_NOTE section; loop through all the notes
* in the section. * in the section.
@ -1716,9 +1737,13 @@ dophn_exec(struct magic_set *ms, int clazz, int swap, int fd, off_t off,
} }
break; break;
default: default:
if (ms->flags & MAGIC_MIME)
continue;
break; break;
} }
} }
if (ms->flags & MAGIC_MIME)
return 0;
if (file_printf(ms, ", %s linked", linking_style) if (file_printf(ms, ", %s linked", linking_style)
== -1) == -1)
return -1; return -1;
@ -1751,7 +1776,7 @@ file_tryelf(struct magic_set *ms, const struct buffer *b)
Elf64_Ehdr elf64hdr; Elf64_Ehdr elf64hdr;
uint16_t type, phnum, shnum, notecount; uint16_t type, phnum, shnum, notecount;
if (ms->flags & (MAGIC_MIME|MAGIC_APPLE|MAGIC_EXTENSION)) if (ms->flags & (MAGIC_APPLE|MAGIC_EXTENSION))
return 0; return 0;
/* /*
* ELF executables have multiple section headers in arbitrary * ELF executables have multiple section headers in arbitrary

View File

@ -27,7 +27,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: seccomp.c,v 1.11 2019/07/18 20:32:06 christos Exp $") FILE_RCSID("@(#)$File: seccomp.c,v 1.15 2020/05/30 23:56:26 christos Exp $")
#endif /* lint */ #endif /* lint */
#if HAVE_LIBSECCOMP #if HAVE_LIBSECCOMP
@ -186,8 +186,12 @@ enable_sandbox_full(void)
ALLOW_IOCTL_RULE(FIONREAD); ALLOW_IOCTL_RULE(FIONREAD);
#endif #endif
#ifdef TIOCGWINSZ #ifdef TIOCGWINSZ
// musl libc may call ioctl TIOCGWINSZ when calling stdout // musl libc may call ioctl TIOCGWINSZ on stdout
ALLOW_IOCTL_RULE(TIOCGWINSZ); ALLOW_IOCTL_RULE(TIOCGWINSZ);
#endif
#ifdef TCGETS
// glibc may call ioctl TCGETS on stdout on physical terminal
ALLOW_IOCTL_RULE(TCGETS);
#endif #endif
ALLOW_RULE(lseek); ALLOW_RULE(lseek);
ALLOW_RULE(_llseek); ALLOW_RULE(_llseek);
@ -207,6 +211,9 @@ enable_sandbox_full(void)
ALLOW_RULE(pread64); ALLOW_RULE(pread64);
ALLOW_RULE(read); ALLOW_RULE(read);
ALLOW_RULE(readlink); ALLOW_RULE(readlink);
#ifdef __NR_readlinkat
ALLOW_RULE(readlinkat);
#endif
ALLOW_RULE(rt_sigaction); ALLOW_RULE(rt_sigaction);
ALLOW_RULE(rt_sigprocmask); ALLOW_RULE(rt_sigprocmask);
ALLOW_RULE(rt_sigreturn); ALLOW_RULE(rt_sigreturn);
@ -215,6 +222,7 @@ enable_sandbox_full(void)
ALLOW_RULE(stat64); ALLOW_RULE(stat64);
ALLOW_RULE(sysinfo); ALLOW_RULE(sysinfo);
ALLOW_RULE(umask); // Used in file_pipe2file() ALLOW_RULE(umask); // Used in file_pipe2file()
ALLOW_RULE(getpid); // Used by glibc in file_pipe2file()
ALLOW_RULE(unlink); ALLOW_RULE(unlink);
ALLOW_RULE(write); ALLOW_RULE(write);
@ -222,7 +230,6 @@ enable_sandbox_full(void)
#if 0 #if 0
// needed by valgrind // needed by valgrind
ALLOW_RULE(gettid); ALLOW_RULE(gettid);
ALLOW_RULE(getpid);
ALLOW_RULE(rt_sigtimedwait); ALLOW_RULE(rt_sigtimedwait);
#endif #endif

View File

@ -32,7 +32,7 @@
#include "file.h" #include "file.h"
#ifndef lint #ifndef lint
FILE_RCSID("@(#)$File: softmagic.c,v 1.286 2019/05/17 02:24:59 christos Exp $") FILE_RCSID("@(#)$File: softmagic.c,v 1.299 2020/06/07 21:58:01 christos Exp $")
#endif /* lint */ #endif /* lint */
#include "magic.h" #include "magic.h"
@ -331,6 +331,13 @@ match(struct magic_set *ms, struct magic *magic, uint32_t nmagic,
if (msetoffset(ms, m, &bb, b, offset, cont_level) == -1) if (msetoffset(ms, m, &bb, b, offset, cont_level) == -1)
goto flush; goto flush;
if (m->flag & OFFADD) { if (m->flag & OFFADD) {
if (cont_level == 0) {
if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr,
"direct *zero*"
" cont_level\n");
return 0;
}
ms->offset += ms->offset +=
ms->c.li[cont_level - 1].off; ms->c.li[cont_level - 1].off;
} }
@ -642,6 +649,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_QUAD: case FILE_QUAD:
case FILE_BEQUAD: case FILE_BEQUAD:
case FILE_LEQUAD: case FILE_LEQUAD:
case FILE_OFFSET:
v = file_signextend(ms, m, p->q); v = file_signextend(ms, m, p->q);
switch (check_fmt(ms, desc)) { switch (check_fmt(ms, desc)) {
case -1: case -1:
@ -699,8 +707,12 @@ mprint(struct magic_set *ms, struct magic *m)
sizeof(p->s) - (str - p->s))) == -1) sizeof(p->s) - (str - p->s))) == -1)
return -1; return -1;
if (m->type == FILE_PSTRING) if (m->type == FILE_PSTRING) {
t += file_pstring_length_size(m); size_t l = file_pstring_length_size(ms, m);
if (l == FILE_BADSIZE)
return -1;
t += l;
}
} }
break; break;
@ -709,7 +721,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_LEDATE: case FILE_LEDATE:
case FILE_MEDATE: case FILE_MEDATE:
if (file_printf(ms, F(ms, desc, "%s"), if (file_printf(ms, F(ms, desc, "%s"),
file_fmttime(p->l, 0, tbuf)) == -1) file_fmttime(tbuf, sizeof(tbuf), p->l, 0)) == -1)
return -1; return -1;
t = ms->offset + sizeof(uint32_t); t = ms->offset + sizeof(uint32_t);
break; break;
@ -719,7 +731,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_LELDATE: case FILE_LELDATE:
case FILE_MELDATE: case FILE_MELDATE:
if (file_printf(ms, F(ms, desc, "%s"), if (file_printf(ms, F(ms, desc, "%s"),
file_fmttime(p->l, FILE_T_LOCAL, tbuf)) == -1) file_fmttime(tbuf, sizeof(tbuf), p->l, FILE_T_LOCAL)) == -1)
return -1; return -1;
t = ms->offset + sizeof(uint32_t); t = ms->offset + sizeof(uint32_t);
break; break;
@ -728,7 +740,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_BEQDATE: case FILE_BEQDATE:
case FILE_LEQDATE: case FILE_LEQDATE:
if (file_printf(ms, F(ms, desc, "%s"), if (file_printf(ms, F(ms, desc, "%s"),
file_fmttime(p->q, 0, tbuf)) == -1) file_fmttime(tbuf, sizeof(tbuf), p->q, 0)) == -1)
return -1; return -1;
t = ms->offset + sizeof(uint64_t); t = ms->offset + sizeof(uint64_t);
break; break;
@ -737,7 +749,7 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_BEQLDATE: case FILE_BEQLDATE:
case FILE_LEQLDATE: case FILE_LEQLDATE:
if (file_printf(ms, F(ms, desc, "%s"), if (file_printf(ms, F(ms, desc, "%s"),
file_fmttime(p->q, FILE_T_LOCAL, tbuf)) == -1) file_fmttime(tbuf, sizeof(tbuf), p->q, FILE_T_LOCAL)) == -1)
return -1; return -1;
t = ms->offset + sizeof(uint64_t); t = ms->offset + sizeof(uint64_t);
break; break;
@ -746,7 +758,8 @@ mprint(struct magic_set *ms, struct magic *m)
case FILE_BEQWDATE: case FILE_BEQWDATE:
case FILE_LEQWDATE: case FILE_LEQWDATE:
if (file_printf(ms, F(ms, desc, "%s"), if (file_printf(ms, F(ms, desc, "%s"),
file_fmttime(p->q, FILE_T_WINDOWS, tbuf)) == -1) file_fmttime(tbuf, sizeof(tbuf), p->q, FILE_T_WINDOWS))
== -1)
return -1; return -1;
t = ms->offset + sizeof(uint64_t); t = ms->offset + sizeof(uint64_t);
break; break;
@ -835,6 +848,12 @@ mprint(struct magic_set *ms, struct magic *m)
return -1; return -1;
t = ms->offset; t = ms->offset;
break; break;
case FILE_GUID:
(void) file_print_guid(buf, sizeof(buf), ms->ms_value.guid);
if (file_printf(ms, F(ms, desc, "%s"), buf) == -1)
return -1;
t = ms->offset;
break;
default: default:
file_magerror(ms, "invalid m->type (%d) in mprint()", m->type); file_magerror(ms, "invalid m->type (%d) in mprint()", m->type);
return -1; return -1;
@ -885,9 +904,12 @@ moffset(struct magic_set *ms, struct magic *m, const struct buffer *b,
if (*m->value.s == '\0') if (*m->value.s == '\0')
p->s[strcspn(p->s, "\r\n")] = '\0'; p->s[strcspn(p->s, "\r\n")] = '\0';
o = CAST(uint32_t, (ms->offset + strlen(p->s))); o = CAST(uint32_t, (ms->offset + strlen(p->s)));
if (m->type == FILE_PSTRING) if (m->type == FILE_PSTRING) {
o += CAST(uint32_t, size_t l = file_pstring_length_size(ms, m);
file_pstring_length_size(m)); if (l == FILE_BADSIZE)
return -1;
o += CAST(uint32_t, l);
}
} }
break; break;
@ -947,23 +969,26 @@ moffset(struct magic_set *ms, struct magic *m, const struct buffer *b,
case FILE_CLEAR: case FILE_CLEAR:
case FILE_DEFAULT: case FILE_DEFAULT:
case FILE_INDIRECT: case FILE_INDIRECT:
case FILE_OFFSET:
o = ms->offset; o = ms->offset;
break; break;
case FILE_DER: case FILE_DER:
{ o = der_offs(ms, m, nbytes);
o = der_offs(ms, m, nbytes); if (o == -1 || CAST(size_t, o) > nbytes) {
if (o == -1 || CAST(size_t, o) > nbytes) { if ((ms->flags & MAGIC_DEBUG) != 0) {
if ((ms->flags & MAGIC_DEBUG) != 0) { (void)fprintf(stderr,
(void)fprintf(stderr, "Bad DER offset %d nbytes=%"
"Bad DER offset %d nbytes=%" SIZE_T_FORMAT "u", o, nbytes);
SIZE_T_FORMAT "u", o, nbytes);
}
*op = 0;
return 0;
} }
break; *op = 0;
return 0;
} }
break;
case FILE_GUID:
o = CAST(int32_t, (ms->offset + 2 * sizeof(uint64_t)));
break;
default: default:
o = 0; o = 0;
@ -1168,6 +1193,7 @@ mconvert(struct magic_set *ms, struct magic *m, int flip)
case FILE_QDATE: case FILE_QDATE:
case FILE_QLDATE: case FILE_QLDATE:
case FILE_QWDATE: case FILE_QWDATE:
case FILE_OFFSET:
if (cvt_64(p, m) == -1) if (cvt_64(p, m) == -1)
goto out; goto out;
return 1; return 1;
@ -1179,9 +1205,15 @@ mconvert(struct magic_set *ms, struct magic *m, int flip)
return 1; return 1;
} }
case FILE_PSTRING: { case FILE_PSTRING: {
size_t sz = file_pstring_length_size(m); char *ptr1, *ptr2;
char *ptr1 = p->s, *ptr2 = ptr1 + sz; size_t len, sz = file_pstring_length_size(ms, m);
size_t len = file_pstring_get_length(m, ptr1); if (sz == FILE_BADSIZE)
return 0;
ptr1 = p->s;
ptr2 = ptr1 + sz;
len = file_pstring_get_length(ms, m, ptr1);
if (len == FILE_BADSIZE)
return 0;
sz = sizeof(p->s) - sz; /* maximum length of string */ sz = sizeof(p->s) - sz; /* maximum length of string */
if (len >= sz) { if (len >= sz) {
/* /*
@ -1281,6 +1313,7 @@ mconvert(struct magic_set *ms, struct magic *m, int flip)
case FILE_NAME: case FILE_NAME:
case FILE_USE: case FILE_USE:
case FILE_DER: case FILE_DER:
case FILE_GUID:
return 1; return 1;
default: default:
file_magerror(ms, "invalid type %d in mconvert()", m->type); file_magerror(ms, "invalid type %d in mconvert()", m->type);
@ -1407,6 +1440,12 @@ mcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,
} }
} }
if (type == FILE_OFFSET) {
(void)memset(p, '\0', sizeof(*p));
p->q = offset;
return 0;
}
if (offset >= nbytes) { if (offset >= nbytes) {
(void)memset(p, '\0', sizeof(*p)); (void)memset(p, '\0', sizeof(*p));
return 0; return 0;
@ -1471,7 +1510,9 @@ private int
msetoffset(struct magic_set *ms, struct magic *m, struct buffer *bb, msetoffset(struct magic_set *ms, struct magic *m, struct buffer *bb,
const struct buffer *b, size_t o, unsigned int cont_level) const struct buffer *b, size_t o, unsigned int cont_level)
{ {
if (m->offset < 0) { int32_t offset;
if (m->flag & OFFNEGATIVE) {
offset = -m->offset;
if (cont_level > 0) { if (cont_level > 0) {
if (m->flag & (OFFADD|INDIROFFADD)) if (m->flag & (OFFADD|INDIROFFADD))
goto normal; goto normal;
@ -1489,26 +1530,28 @@ msetoffset(struct magic_set *ms, struct magic *m, struct buffer *bb,
"u at level %u", o, cont_level); "u at level %u", o, cont_level);
return -1; return -1;
} }
if (CAST(size_t, -m->offset) > b->elen) if (CAST(size_t, m->offset) > b->elen)
return -1; return -1;
buffer_init(bb, -1, NULL, b->ebuf, b->elen); buffer_init(bb, -1, NULL, b->ebuf, b->elen);
ms->eoffset = ms->offset = CAST(int32_t, b->elen + m->offset); ms->eoffset = ms->offset = CAST(int32_t, b->elen - m->offset);
} else { } else {
offset = m->offset;
if (cont_level == 0) { if (cont_level == 0) {
normal: normal:
// XXX: Pass real fd, then who frees bb? // XXX: Pass real fd, then who frees bb?
buffer_init(bb, -1, NULL, b->fbuf, b->flen); buffer_init(bb, -1, NULL, b->fbuf, b->flen);
ms->offset = m->offset; ms->offset = offset;
ms->eoffset = 0; ms->eoffset = 0;
} else { } else {
ms->offset = ms->eoffset + m->offset; ms->offset = ms->eoffset + offset;
} }
} }
if ((ms->flags & MAGIC_DEBUG) != 0) { if ((ms->flags & MAGIC_DEBUG) != 0) {
fprintf(stderr, "bb=[%p,%" SIZE_T_FORMAT "u], %d [b=%p,%" fprintf(stderr, "bb=[%p,%" SIZE_T_FORMAT "u,%"
SIZE_T_FORMAT "u], [o=%#x, c=%d]\n", SIZE_T_FORMAT "u], %d [b=%p,%"
bb->fbuf, bb->flen, ms->offset, b->fbuf, b->flen, SIZE_T_FORMAT "u,%" SIZE_T_FORMAT "u], [o=%#x, c=%d]\n",
m->offset, cont_level); bb->fbuf, bb->flen, bb->elen, ms->offset, b->fbuf,
b->flen, b->elen, offset, cont_level);
} }
return 0; return 0;
} }
@ -1566,7 +1609,8 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
if (m->in_op & FILE_OPINDIRECT) { if (m->in_op & FILE_OPINDIRECT) {
const union VALUETYPE *q = CAST(const union VALUETYPE *, const union VALUETYPE *q = CAST(const union VALUETYPE *,
RCAST(const void *, s + offset + off)); RCAST(const void *, s + offset + off));
switch (cvt_flip(m->in_type, flip)) { int op;
switch (op = cvt_flip(m->in_type, flip)) {
case FILE_BYTE: case FILE_BYTE:
if (OFFSET_OOB(nbytes, offset + off, 1)) if (OFFSET_OOB(nbytes, offset + off, 1))
return 0; return 0;
@ -1620,7 +1664,9 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
off = SEXT(sgn,64,LE64(q)); off = SEXT(sgn,64,LE64(q));
break; break;
default: default:
abort(); if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, "bad op=%d\n", op);
return 0;
} }
if ((ms->flags & MAGIC_DEBUG) != 0) if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, "indirect offs=%jd\n", off); fprintf(stderr, "indirect offs=%jd\n", off);
@ -1685,11 +1731,19 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
offset = do_ops(m, SEXT(sgn,64,BE64(p)), off); offset = do_ops(m, SEXT(sgn,64,BE64(p)), off);
break; break;
default: default:
abort(); if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, "bad in_type=%d\n", in_type);
return 0;
} }
if (m->flag & INDIROFFADD) { if (m->flag & INDIROFFADD) {
offset += ms->c.li[cont_level-1].off; if (cont_level == 0) {
if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr,
"indirect *zero* cont_level\n");
return 0;
}
offset += ms->c.li[cont_level - 1].off;
if (offset == 0) { if (offset == 0) {
if ((ms->flags & MAGIC_DEBUG) != 0) if ((ms->flags & MAGIC_DEBUG) != 0)
fprintf(stderr, fprintf(stderr,
@ -1752,6 +1806,11 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
return 0; return 0;
break; break;
case FILE_GUID:
if (OFFSET_OOB(nbytes, offset, 16))
return 0;
break;
case FILE_STRING: case FILE_STRING:
case FILE_PSTRING: case FILE_PSTRING:
case FILE_SEARCH: case FILE_SEARCH:
@ -1847,7 +1906,8 @@ mget(struct magic_set *ms, struct magic *m, const struct buffer *b,
} }
private uint64_t private uint64_t
file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags) file_strncmp(const char *s1, const char *s2, size_t len, size_t maxlen,
uint32_t flags)
{ {
/* /*
* Convert the source args to unsigned here so that (1) the * Convert the source args to unsigned here so that (1) the
@ -1857,7 +1917,9 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags)
*/ */
const unsigned char *a = RCAST(const unsigned char *, s1); const unsigned char *a = RCAST(const unsigned char *, s1);
const unsigned char *b = RCAST(const unsigned char *, s2); const unsigned char *b = RCAST(const unsigned char *, s2);
const unsigned char *eb = b + len; uint32_t ws = flags & (STRING_COMPACT_WHITESPACE |
STRING_COMPACT_OPTIONAL_WHITESPACE);
const unsigned char *eb = b + (ws ? maxlen : len);
uint64_t v; uint64_t v;
/* /*
@ -1915,7 +1977,8 @@ file_strncmp(const char *s1, const char *s2, size_t len, uint32_t flags)
} }
private uint64_t private uint64_t
file_strncmp16(const char *a, const char *b, size_t len, uint32_t flags) file_strncmp16(const char *a, const char *b, size_t len, size_t maxlen,
uint32_t flags)
{ {
/* /*
* XXX - The 16-bit string compare probably needs to be done * XXX - The 16-bit string compare probably needs to be done
@ -1923,7 +1986,7 @@ file_strncmp16(const char *a, const char *b, size_t len, uint32_t flags)
* At the moment, I am unsure. * At the moment, I am unsure.
*/ */
flags = 0; flags = 0;
return file_strncmp(a, b, len, flags); return file_strncmp(a, b, len, maxlen, flags);
} }
private int private int
@ -1974,6 +2037,7 @@ magiccheck(struct magic_set *ms, struct magic *m)
case FILE_QWDATE: case FILE_QWDATE:
case FILE_BEQWDATE: case FILE_BEQWDATE:
case FILE_LEQWDATE: case FILE_LEQWDATE:
case FILE_OFFSET:
v = p->q; v = p->q;
break; break;
@ -2052,14 +2116,14 @@ magiccheck(struct magic_set *ms, struct magic *m)
case FILE_PSTRING: case FILE_PSTRING:
l = 0; l = 0;
v = file_strncmp(m->value.s, p->s, CAST(size_t, m->vallen), v = file_strncmp(m->value.s, p->s, CAST(size_t, m->vallen),
m->str_flags); sizeof(p->s), m->str_flags);
break; break;
case FILE_BESTRING16: case FILE_BESTRING16:
case FILE_LESTRING16: case FILE_LESTRING16:
l = 0; l = 0;
v = file_strncmp16(m->value.s, p->s, CAST(size_t, m->vallen), v = file_strncmp16(m->value.s, p->s, CAST(size_t, m->vallen),
m->str_flags); sizeof(p->s), m->str_flags);
break; break;
case FILE_SEARCH: { /* search ms->search.s for the string m->value.s */ case FILE_SEARCH: { /* search ms->search.s for the string m->value.s */
@ -2094,7 +2158,7 @@ magiccheck(struct magic_set *ms, struct magic *m)
return 0; return 0;
v = file_strncmp(m->value.s, ms->search.s + idx, slen, v = file_strncmp(m->value.s, ms->search.s + idx, slen,
m->str_flags); ms->search.s_len - idx, m->str_flags);
if (v == 0) { /* found match */ if (v == 0) { /* found match */
ms->search.offset += idx; ms->search.offset += idx;
ms->search.rm_len = ms->search.s_len - idx; ms->search.rm_len = ms->search.s_len - idx;
@ -2179,6 +2243,10 @@ magiccheck(struct magic_set *ms, struct magic *m)
return 0; return 0;
} }
return matched; return matched;
case FILE_GUID:
l = 0;
v = memcmp(m->value.guid, p->guid, sizeof(p->guid));
break;
default: default:
file_magerror(ms, "invalid type %d in magiccheck()", m->type); file_magerror(ms, "invalid type %d in magiccheck()", m->type);
return -1; return -1;

View File

@ -3,6 +3,7 @@
PACKAGE=lib${LIB} PACKAGE=lib${LIB}
CONTRDIR= ${SRCTOP}/contrib/file CONTRDIR= ${SRCTOP}/contrib/file
.PATH: ${CONTRDIR}
.PATH: ${CONTRDIR}/src .PATH: ${CONTRDIR}/src
.PATH: ${CONTRDIR}/doc .PATH: ${CONTRDIR}/doc
@ -35,6 +36,19 @@ MAGFILES= ${CONTRDIR}/magic/Header \
${CONTRDIR}/magic/Localstuff \ ${CONTRDIR}/magic/Localstuff \
${CONTRDIR}/magic/Magdir/[a-z]* ${CONTRDIR}/magic/Magdir/[a-z]*
PACKAGE_VERSION!= sed -n '/define.*PACKAGE_VERSION/{s,[^0-9.],,gp;q;}' ${.CURDIR}/config.h
libmagic.pc: libmagic.pc.in
sed -e 's,@prefix@,/usr,g ; \
s,@exec_prefix@,$${prefix},g ; \
s,@libdir@,$${exec_prefix}/lib,g ; \
s,@sharedlibdir@,$${libdir},g ; \
s,@includedir@,$${prefix}/include,g ; \
s,@VERSION@,${PACKAGE_VERSION},g ; \
s,@LIBS@,,g ;' \
${.ALLSRC} > ${.TARGET}
magic: ${MAGFILES} magic: ${MAGFILES}
cat ${.ALLSRC:O} > ${.TARGET} cat ${.ALLSRC:O} > ${.TARGET}
@ -72,4 +86,7 @@ ${inc}: ${inc}.in
sed -e 's,X.YY,${FILEVER:S,",,g:S,.,,g},g' ${.ALLSRC} > ${.TARGET} sed -e 's,X.YY,${FILEVER:S,",,g:S,.,,g},g' ${.ALLSRC} > ${.TARGET}
.endfor .endfor
FILES= libmagic.pc
FILESDIR= ${LIBDATADIR}/pkgconfig
.include <bsd.lib.mk> .include <bsd.lib.mk>

View File

@ -280,7 +280,7 @@
#define PACKAGE_NAME "file" #define PACKAGE_NAME "file"
/* Define to the full name and version of this package. */ /* Define to the full name and version of this package. */
#define PACKAGE_STRING "file 5.38" #define PACKAGE_STRING "file 5.39"
/* Define to the one symbol short name of this package. */ /* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "file" #define PACKAGE_TARNAME "file"
@ -289,7 +289,7 @@
#define PACKAGE_URL "" #define PACKAGE_URL ""
/* Define to the version of this package. */ /* Define to the version of this package. */
#define PACKAGE_VERSION "5.38" #define PACKAGE_VERSION "5.39"
/* Define to 1 if you have the ANSI C header files. */ /* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1 #define STDC_HEADERS 1
@ -320,7 +320,7 @@
/* Version number of package */ /* Version number of package */
#define VERSION "5.38" #define VERSION "5.39"
/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
significant byte first (like Motorola and SPARC, unlike Intel). */ significant byte first (like Motorola and SPARC, unlike Intel). */