123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- Subject: Add lzma and bzip built-in decompression support
- Origin: FILE5_37-55-gb259a07e <https://github.com/file/file/commit/FILE5_37-55-gb259a07e>
- Upstream-Author: Christos Zoulas <christos@zoulas.com>
- Date: Thu Jul 18 20:32:06 2019 +0000
- --- a/configure.ac
- +++ b/configure.ac
- @@ -39,6 +39,16 @@
- [AS_HELP_STRING([--disable-zlib], [disable zlib compression support @<:@default=auto@:>@])])
- AC_MSG_RESULT($enable_zlib)
-
- +AC_MSG_CHECKING(for bzlib support)
- +AC_ARG_ENABLE([bzlib],
- +[AS_HELP_STRING([--disable-bzlib], [disable bz2lib compression support @<:@default=auto@:>@])])
- +AC_MSG_RESULT($enable_bzlib)
- +
- +AC_MSG_CHECKING(for xzlib support)
- +AC_ARG_ENABLE([xzlib],
- +[AS_HELP_STRING([--disable-xzlib], [disable liblzma/xz compression support @<:@default=auto@:>@])])
- +AC_MSG_RESULT($enable_xzlib)
- +
- AC_MSG_CHECKING(for libseccomp support)
- AC_ARG_ENABLE([libseccomp],
- [AS_HELP_STRING([--disable-libseccomp], [disable libseccomp sandboxing @<:@default=auto@:>@])])
- @@ -97,6 +107,12 @@
- if test "$enable_zlib" != "no"; then
- AC_CHECK_HEADERS(zlib.h)
- fi
- +if test "$enable_bzlib" != "no"; then
- + AC_CHECK_HEADERS(bzlib.h)
- +fi
- +if test "$enable_xzlib" != "no"; then
- + AC_CHECK_HEADERS(lzma.h)
- +fi
- AC_CHECK_TYPE([sig_t],[AC_DEFINE([HAVE_SIG_T],1,[Have sig_t type])],,[#include <signal.h>])
-
- dnl Checks for typedefs, structures, and compiler characteristics.
- @@ -160,6 +176,12 @@
- if test "$enable_zlib" != "no"; then
- AC_CHECK_LIB(z, gzopen)
- fi
- +if test "$enable_bzlib" != "no"; then
- + AC_CHECK_LIB(bz2, BZ2_bzCompressInit)
- +fi
- +if test "$enable_xzlib" != "no"; then
- + AC_CHECK_LIB(lzma, lzma_stream_decoder)
- +fi
- if test "$enable_libseccomp" != "no"; then
- AC_CHECK_LIB(seccomp, seccomp_init)
- fi
- @@ -179,6 +201,22 @@
- if test "$ac_cv_header_zlib_h$ac_cv_lib_z_gzopen" = "yesyes"; then
- AC_DEFINE([ZLIBSUPPORT], 1, [Enable zlib compression support])
- fi
- +if test "$enable_bzlib" = "yes"; then
- + if test "$ac_cv_header_bzlib_h$ac_cv_lib_bz2_BZ2_bzCompressInit" != "yesyes"; then
- + AC_MSG_ERROR([bzlib support requested but not found])
- + fi
- +fi
- +if test "$ac_cv_header_bzlib_h$ac_cv_lib_bz2_BZ2_bzCompressInit" = "yesyes"; then
- + AC_DEFINE([BZLIBSUPPORT], 1, [Enable bzlib compression support])
- +fi
- +if test "$enable_xzlib" = "yes"; then
- + if test "$ac_cv_header_lzma_h$ac_cv_lib_lzma_lzma_stream_decoder" != "yesyes"; then
- + AC_MSG_ERROR([xzlib support requested but not found])
- + fi
- +fi
- +if test "$ac_cv_header_lzma_h$ac_cv_lib_lzma_lzma_stream_decoder" = "yesyes"; then
- + AC_DEFINE([XZLIBSUPPORT], 1, [Enable xzlib compression support])
- +fi
-
- AC_CONFIG_FILES([Makefile src/Makefile magic/Makefile tests/Makefile doc/Makefile python/Makefile])
- AC_OUTPUT
- --- a/src/compress.c
- +++ b/src/compress.c
- @@ -66,11 +66,16 @@
- #include <zlib.h>
- #endif
-
- -#if defined(HAVE_BZLIB_H)
- +#if defined(HAVE_BZLIB_H) || defined(BZLIBSUPPORT)
- #define BUILTIN_BZLIB
- #include <bzlib.h>
- #endif
-
- +#if defined(HAVE_XZLIB_H) || defined(XZLIBSUPPORT)
- +#define BUILTIN_XZLIB
- +#include <lzma.h>
- +#endif
- +
- #ifdef DEBUG
- int tty = -1;
- #define DPRINTF(...) do { \
- @@ -201,7 +206,11 @@
- #endif
- #ifdef BUILTIN_BZLIB
- private int uncompressbzlib(const unsigned char *, unsigned char **, size_t,
- - size_t *, int);
- + size_t *);
- +#endif
- +#ifdef BUILTIN_XZLIB
- +private int uncompressxzlib(const unsigned char *, unsigned char **, size_t,
- + size_t *);
- #endif
-
- static int makeerror(unsigned char **, size_t *, const char *, ...)
- @@ -581,6 +590,90 @@
- }
- #endif
-
- +#ifdef BUILTIN_BZLIB
- +private int
- +uncompressbzlib(const unsigned char *old, unsigned char **newch,
- + size_t bytes_max, size_t *n)
- +{
- + int rc;
- + bz_stream bz;
- +
- + memset(&bz, 0, sizeof(bz));
- + rc = BZ2_bzDecompressInit(&bz, 0, 0);
- + if (rc != BZ_OK)
- + goto err;
- +
- + if ((*newch = CAST(unsigned char *, malloc(bytes_max + 1))) == NULL)
- + return makeerror(newch, n, "No buffer, %s", strerror(errno));
- +
- + bz.next_in = CCAST(char *, RCAST(const char *, old));
- + bz.avail_in = CAST(uint32_t, *n);
- + bz.next_out = RCAST(char *, *newch);
- + bz.avail_out = CAST(unsigned int, bytes_max);
- +
- + rc = BZ2_bzDecompress(&bz);
- + if (rc != BZ_OK && rc != BZ_STREAM_END)
- + goto err;
- +
- + /* Assume byte_max is within 32bit */
- + /* assert(bz.total_out_hi32 == 0); */
- + *n = CAST(size_t, bz.total_out_lo32);
- + rc = BZ2_bzDecompressEnd(&bz);
- + if (rc != BZ_OK)
- + goto err;
- +
- + /* let's keep the nul-terminate tradition */
- + (*newch)[*n] = '\0';
- +
- + return OKDATA;
- +err:
- + snprintf(RCAST(char *, *newch), bytes_max, "bunzip error %d", rc);
- + *n = strlen(RCAST(char *, *newch));
- + return ERRDATA;
- +}
- +#endif
- +
- +#ifdef BUILTIN_XZLIB
- +private int
- +uncompressxzlib(const unsigned char *old, unsigned char **newch,
- + size_t bytes_max, size_t *n)
- +{
- + int rc;
- + lzma_stream xz;
- +
- + memset(&xz, 0, sizeof(xz));
- + rc = lzma_auto_decoder(&xz, UINT64_MAX, 0);
- + if (rc != LZMA_OK)
- + goto err;
- +
- + if ((*newch = CAST(unsigned char *, malloc(bytes_max + 1))) == NULL)
- + return makeerror(newch, n, "No buffer, %s", strerror(errno));
- +
- + xz.next_in = CCAST(const uint8_t *, old);
- + xz.avail_in = CAST(uint32_t, *n);
- + xz.next_out = RCAST(uint8_t *, *newch);
- + xz.avail_out = CAST(unsigned int, bytes_max);
- +
- + rc = lzma_code(&xz, LZMA_RUN);
- + if (rc != LZMA_OK && rc != LZMA_STREAM_END)
- + goto err;
- +
- + *n = CAST(size_t, xz.total_out);
- +
- + lzma_end(&xz);
- +
- + /* let's keep the nul-terminate tradition */
- + (*newch)[*n] = '\0';
- +
- + return OKDATA;
- +err:
- + snprintf(RCAST(char *, *newch), bytes_max, "unxz error %d", rc);
- + *n = strlen(RCAST(char *, *newch));
- + return ERRDATA;
- +}
- +#endif
- +
- +
- static int
- makeerror(unsigned char **buf, size_t *len, const char *fmt, ...)
- {
- @@ -713,6 +806,15 @@
- if (compr[method].maglen == 0)
- return uncompresszlib(old, newch, bytes_max, n, 1);
- #endif
- +#ifdef BUILTIN_BZLIB
- + if (method == 7)
- + return uncompressbzlib(old, newch, bytes_max, n);
- +#endif
- +#ifdef BUILTIN_XZLIB
- + if (method == 9 || method == 13)
- + return uncompressxzlib(old, newch, bytes_max, n);
- +#endif
- +
- (void)fflush(stdout);
- (void)fflush(stderr);
-
- --- a/src/seccomp.c
- +++ b/src/seccomp.c
- @@ -174,6 +174,9 @@
- ALLOW_RULE(fcntl64);
- ALLOW_RULE(fstat);
- ALLOW_RULE(fstat64);
- +#ifdef XZLIBSUPPORT
- + ALLOW_RULE(futex);
- +#endif
- ALLOW_RULE(getdents);
- #ifdef __NR_getdents64
- ALLOW_RULE(getdents64);
|