Import xz-5.0.4.
authorPeter Avalos <pavalos@dragonflybsd.org>
Wed, 11 Jul 2012 07:16:52 +0000 (00:16 -0700)
committerPeter Avalos <pavalos@dragonflybsd.org>
Wed, 11 Jul 2012 07:16:52 +0000 (00:16 -0700)
    * liblzma:

        - Fix lzma_index_init(). It could crash if memory allocation
          failed.

        - Fix the possibility of an incorrect LZMA_BUF_ERROR when a BCJ
          filter is used and the application only provides exactly as
          much output space as is the uncompressed size of the file.

    * Fix "xz -lvv foo.xz". It could crash on some corrupted files.

    * Fix output of "xz --robot -lv" and "xz --robot -lvv" which
      incorrectly printed the filename also in the "foo (x/x)" format.

    * Fix exit status of "xzdiff foo.xz bar.xz".

    * Fix exit status of "xzgrep foo binary_file".

17 files changed:
contrib/xz/AUTHORS
contrib/xz/NEWS
contrib/xz/README
contrib/xz/src/common/sysdefs.h
contrib/xz/src/common/tuklib_open_stdxxx.c
contrib/xz/src/liblzma/api/lzma/version.h
contrib/xz/src/liblzma/common/index.c
contrib/xz/src/liblzma/lz/lz_encoder_hash.h
contrib/xz/src/liblzma/simple/simple_coder.c
contrib/xz/src/liblzma/simple/simple_private.h
contrib/xz/src/scripts/xzdiff.in
contrib/xz/src/scripts/xzgrep.in
contrib/xz/src/xz/args.c
contrib/xz/src/xz/coder.c
contrib/xz/src/xz/list.c
contrib/xz/src/xz/message.c
contrib/xz/src/xz/xz.1

index 63a9815..bda8797 100644 (file)
@@ -16,11 +16,11 @@ Authors of XZ Utils
 
     Some scripts have been adapted from gzip. The original versions
     were written by Jean-loup Gailly, Charles Levert, and Paul Eggert.
-    Andrew Dudman helped adapting the script and their man pages for
+    Andrew Dudman helped adapting the scripts and their man pages for
     XZ Utils.
 
-    The GNU Autotools based build system contains files from many authors,
-    which I'm not trying list here.
+    The GNU Autotools-based build system contains files from many authors,
+    which I'm not trying to list here.
 
     Several people have contributed fixes or reported bugs. Most of them
     are mentioned in the file THANKS.
index e3ea498..4420b6a 100644 (file)
@@ -2,6 +2,43 @@
 XZ Utils Release Notes
 ======================
 
+5.0.4 (2012-06-22)
+
+    * liblzma:
+
+        - Fix lzma_index_init(). It could crash if memory allocation
+          failed.
+
+        - Fix the possibility of an incorrect LZMA_BUF_ERROR when a BCJ
+          filter is used and the application only provides exactly as
+          much output space as is the uncompressed size of the file.
+
+        - Fix a bug in doc/examples_old/xz_pipe_decompress.c. It didn't
+          check if the last call to lzma_code() really returned
+          LZMA_STREAM_END, which made the program think that truncated
+          files are valid.
+
+        - New example programs in doc/examples (old programs are now in
+          doc/examples_old). These have more comments and more detailed
+          error handling.
+
+    * Fix "xz -lvv foo.xz". It could crash on some corrupted files.
+
+    * Fix output of "xz --robot -lv" and "xz --robot -lvv" which
+      incorrectly printed the filename also in the "foo (x/x)" format.
+
+    * Fix exit status of "xzdiff foo.xz bar.xz".
+
+    * Fix exit status of "xzgrep foo binary_file".
+
+    * Fix portability to EBCDIC systems.
+
+    * Fix a configure issue on AIX with the XL C compiler. See INSTALL
+      for details.
+
+    * Update French, German, Italian, and Polish translations.
+
+
 5.0.3 (2011-05-21)
 
     * liblzma fixes:
index d6cfda7..1b02f05 100644 (file)
@@ -5,7 +5,7 @@ XZ Utils
     0. Overview
     1. Documentation
        1.1. Overall documentation
-       1.2. Documentation for command line tools
+       1.2. Documentation for command-line tools
        1.3. Documentation for liblzma
     2. Version numbering
     3. Reporting bugs
@@ -17,21 +17,21 @@ XZ Utils
 0. Overview
 -----------
 
-    XZ Utils provide a general-purpose data compression library and
-    command line tools. The native file format is the .xz format, but
+    XZ Utils provide a general-purpose data-compression library plus
+    command-line tools. The native file format is the .xz format, but
     also the legacy .lzma format is supported. The .xz format supports
-    multiple compression algorithms, which are called "filters" in
+    multiple compression algorithms, which are called "filters" in the
     context of XZ Utils. The primary filter is currently LZMA2. With
     typical files, XZ Utils create about 30 % smaller files than gzip.
 
     To ease adapting support for the .xz format into existing applications
     and scripts, the API of liblzma is somewhat similar to the API of the
-    popular zlib library. For the same reason, the command line tool xz
-    has similar command line syntax than that of gzip.
+    popular zlib library. For the same reason, the command-line tool xz
+    has a command-line syntax similar to that of gzip.
 
-    When aiming for the highest compression ratio, LZMA2 encoder uses
+    When aiming for the highest compression ratio, the LZMA2 encoder uses
     a lot of CPU time and may use, depending on the settings, even
-    hundreds of megabytes of RAM. However, in fast modes, LZMA2 encoder
+    hundreds of megabytes of RAM. However, in fast modes, the LZMA2 encoder
     competes with bzip2 in compression speed, RAM usage, and compression
     ratio.
 
@@ -44,8 +44,8 @@ XZ Utils
     since that needs to be done only once to benefit many people.
 
     With some file types, combining (or "chaining") LZMA2 with an
-    additional filter can improve compression ratio. A filter chain may
-    contain up to four filters, although usually only one two is used.
+    additional filter can improve the compression ratio. A filter chain may
+    contain up to four filters, although usually only one or two are used.
     For example, putting a BCJ (Branch/Call/Jump) filter before LZMA2
     in the filter chain can improve compression ratio of executable files.
 
@@ -88,9 +88,9 @@ XZ Utils
     packages.
 
 
-1.2. Documentation for command line tools
+1.2. Documentation for command-line tools
 
-    The command line tools are documented as man pages. In source code
+    The command-line tools are documented as man pages. In source code
     releases (and possibly also in some binary packages), the man pages
     are also provided in plain text (ASCII only) and PDF formats in the
     directory "doc/man" to make the man pages more accessible to those
@@ -109,8 +109,8 @@ XZ Utils
     written yet.
 
     For now, if you have never used liblzma, libbzip2, or zlib, I
-    recommend learning *basics* of zlib API. Once you know that, it
-    should be easier to learn liblzma.
+    recommend learning the *basics* of the zlib API. Once you know that,
+    it should be easier to learn liblzma.
 
         http://zlib.net/manual.html
         http://zlib.net/zlib_how.html
@@ -124,23 +124,27 @@ XZ Utils
       - X is the major version. When this is incremented, the library
         API and ABI break.
 
-      - Y is the minor version. It is incremented when new features are
-        added without breaking existing API or ABI. Even Y indicates
-        stable release and odd Y indicates unstable (alpha or beta
-        version).
+      - Y is the minor version. It is incremented when new features
+        are added without breaking the existing API or ABI. An even Y
+        indicates a stable release and an odd Y indicates unstable
+        (alpha or beta version).
 
-      - Z is the revision. This has different meaning for stable and
+      - Z is the revision. This has different meaning for stable and
         unstable releases:
+
           * Stable: Z is incremented when bugs get fixed without adding
-            any new features.
+            any new features. This is intended to be convenient for
+            downstream distributors that want bug fixes but don't want
+            any new features to minimize the risk of introducing new bugs.
+
           * Unstable: Z is just a counter. API or ABI of features added
             in earlier unstable releases having the same X.Y may break.
 
       - S indicates stability of the release. It is missing from the
-        stable releases where Y is an even number. When Y is odd, S
+        stable releases, where Y is an even number. When Y is odd, S
         is either "alpha" or "beta" to make it very clear that such
         versions are not stable releases. The same X.Y.Z combination is
-        not used for more than one stability level i.e. after X.Y.Zalpha,
+        not used for more than one stability level, i.e. after X.Y.Zalpha,
         the next version can be X.Y.(Z+1)beta but not X.Y.Zbeta.
 
 
@@ -176,7 +180,7 @@ XZ Utils
     Don't send core dump files or any executables. If you have a small
     example file(s) (total size less than 256 KiB), please include
     it/them as an attachment. If you have bigger test files, put them
-    online somewhere and include an URL to the file(s) in the bug report.
+    online somewhere and include a URL to the file(s) in the bug report.
 
     Always include the exact version number of XZ Utils in the bug report.
     If you are using a snapshot from the git repository, use "git describe"
@@ -193,7 +197,7 @@ XZ Utils
 
     The messages from the xz tool have been translated into a few
     languages. Before starting to translate into a new language, ask
-    the author that someone else hasn't already started working on it.
+    the author whether someone else hasn't already started working on it.
 
     Test your translation. Testing includes comparing the translated
     output to the original English version by running the same commands
@@ -214,7 +218,7 @@ XZ Utils
     Note especially the following:
 
       - The output of --help and --long-help must look nice on
-        a 80-column terminal. It's OK to add extra lines if needed.
+        an 80-column terminal. It's OK to add extra lines if needed.
 
       - In contrast, don't add extra lines to error messages and such.
         They are often preceded with e.g. a filename on the same line,
index 69370ba..5ea6bda 100644 (file)
 #      define UINT64_MAX UINT64_C(18446744073709551615)
 #endif
 
-// Interix has broken header files, which typedef size_t to unsigned long,
-// but a few lines later define SIZE_MAX to INT32_MAX.
-#ifdef __INTERIX
+// Incorrect(?) SIZE_MAX:
+//   - Interix headers typedef size_t to unsigned long,
+//     but a few lines later define SIZE_MAX to INT32_MAX.
+//   - SCO OpenServer (x86) headers typedef size_t to unsigned int
+//     but define SIZE_MAX to INT32_MAX.
+#if defined(__INTERIX) || defined(_SCO_DS)
 #      undef SIZE_MAX
 #endif
 
index 08bc60d..26702a6 100644 (file)
@@ -39,12 +39,14 @@ tuklib_open_stdxxx(int err_status)
                                        | (i == 0 ? O_WRONLY : O_RDONLY));
 
                        if (fd != i) {
+                               if (fd != -1)
+                                       (void)close(fd);
+
                                // Something went wrong. Exit with the
                                // exit status we were given. Don't try
                                // to print an error message, since stderr
                                // may very well be non-existent. This
                                // error should be extremely rare.
-                               (void)close(fd);
                                exit(err_status);
                        }
                }
index 9226663..629e8e1 100644 (file)
@@ -22,7 +22,7 @@
  */
 #define LZMA_VERSION_MAJOR 5
 #define LZMA_VERSION_MINOR 0
-#define LZMA_VERSION_PATCH 3
+#define LZMA_VERSION_PATCH 4
 #define LZMA_VERSION_STABILITY LZMA_VERSION_STABILITY_STABLE
 
 #ifndef LZMA_VERSION_COMMIT
index ddb9d36..9af4bc1 100644 (file)
@@ -398,10 +398,13 @@ extern LZMA_API(lzma_index *)
 lzma_index_init(lzma_allocator *allocator)
 {
        lzma_index *i = index_init_plain(allocator);
+       if (i == NULL)
+               return NULL;
+
        index_stream *s = index_stream_init(0, 0, 1, 0, allocator);
-       if (i == NULL || s == NULL) {
-               index_stream_end(s, allocator);
+       if (s == NULL) {
                lzma_free(i, allocator);
+               return NULL;
        }
 
        index_tree_append(&i->streams, &s->node);
index c398d7d..342a333 100644 (file)
@@ -39,7 +39,7 @@
 // Endianness doesn't matter in hash_2_calc() (no effect on the output).
 #ifdef TUKLIB_FAST_UNALIGNED_ACCESS
 #      define hash_2_calc() \
-               const uint32_t hash_value = *(const uint16_t *)(cur);
+               const uint32_t hash_value = *(const uint16_t *)(cur)
 #else
 #      define hash_2_calc() \
                const uint32_t hash_value \
index 37de7fa..a02b039 100644 (file)
@@ -35,9 +35,6 @@ copy_or_code(lzma_coder *coder, lzma_allocator *allocator,
 
        } else {
                // Call the next coder in the chain to provide us some data.
-               // We don't care about uncompressed_size here, because
-               // the next filter in the chain will do it for us (since
-               // we don't change the size of the data).
                const lzma_ret ret = coder->next.code(
                                coder->next.coder, allocator,
                                in, in_pos, in_size,
@@ -110,7 +107,7 @@ simple_code(lzma_coder *coder, lzma_allocator *allocator,
        // filtered if the buffer sizes used by the application are reasonable.
        const size_t out_avail = out_size - *out_pos;
        const size_t buf_avail = coder->size - coder->pos;
-       if (out_avail > buf_avail) {
+       if (out_avail > buf_avail || buf_avail == 0) {
                // Store the old position so that we know from which byte
                // to start filtering.
                const size_t out_start = *out_pos;
index a69f827..fcf9f7c 100644 (file)
@@ -22,8 +22,7 @@ struct lzma_coder_s {
        /// Next filter in the chain
        lzma_next_coder next;
 
-       /// True if the next coder in the chain has returned LZMA_STREAM_END
-       /// or if we have processed uncompressed_size bytes.
+       /// True if the next coder in the chain has returned LZMA_STREAM_END.
        bool end_was_reached;
 
        /// True if filter() should encode the data; false to decode.
index 45633e0..deec3eb 100644 (file)
@@ -120,10 +120,12 @@ elif test $# -eq 2; then
                 ( ($xz2 -cdfq -- "$2" 4>&-; echo $? >&4) 3>&- 5<&- </dev/null |
                 eval "$cmp" /dev/fd/5 - >&3) 5<&0
             )
+            cmp_status=$?
             case $xz_status in
               *[1-9]*) xz_status=1;;
               *) xz_status=0;;
             esac
+            (exit $cmp_status)
           else
             F=`expr "/$2" : '.*/\(.*\)[-.][ablmtxz2]*$'` || F=$prog
             tmp=
index ae30725..515b516 100644 (file)
@@ -194,7 +194,8 @@ for i; do
     fi >&3 5>&-
   )
   r=$?
-  test "$xz_status" -eq 0 || test "$xz_status" -eq 2 || r=2
+  test "$xz_status" -eq 0 || test "$xz_status" -eq 2 \
+      || test "$(kill -l "$xz_status" 2> /dev/null)" = "PIPE" || r=2
   test $res -lt $r && res=$r
 done
 exit $res
index 4bd84a0..34761d4 100644 (file)
@@ -438,7 +438,7 @@ parse_environment(args_info *args, char *argv0, const char *varname)
                } else if (prev_was_space) {
                        prev_was_space = false;
 
-                       // Keep argc small enough to fit into a singed int
+                       // Keep argc small enough to fit into a signed int
                        // and to keep it usable for memory allocation.
                        if (++argc == my_min(
                                        INT_MAX, SIZE_MAX / sizeof(char *)))
index b123ec5..69b1225 100644 (file)
@@ -284,7 +284,10 @@ coder_set_compression_settings(void)
 static bool
 is_format_xz(void)
 {
-       return strm.avail_in >= 6 && memcmp(in_buf.u8, "\3757zXZ", 6) == 0;
+       // Specify the magic as hex to be compatible with EBCDIC systems.
+       static const uint8_t magic[6] = { 0xFD, 0x37, 0x7A, 0x58, 0x5A, 0x00 };
+       return strm.avail_in >= sizeof(magic)
+                       && memcmp(in_buf.u8, magic, sizeof(magic)) == 0;
 }
 
 
index 1c93718..98307eb 100644 (file)
@@ -382,14 +382,9 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
        if (buf.u8[0] == 0)
                goto data_error;
 
-       lzma_block block;
-       lzma_filter filters[LZMA_FILTERS_MAX + 1];
-
-       // Initialize the pointers so that they can be passed to free().
-       for (size_t i = 0; i < ARRAY_SIZE(filters); ++i)
-               filters[i].options = NULL;
-
        // Initialize the block structure and decode Block Header Size.
+       lzma_filter filters[LZMA_FILTERS_MAX + 1];
+       lzma_block block;
        block.version = 0;
        block.check = iter->stream.flags->check;
        block.filters = filters;
@@ -437,6 +432,10 @@ parse_block_header(file_pair *pair, const lzma_index_iter *iter,
                break;
 
        case LZMA_DATA_ERROR:
+               // Free the memory allocated by lzma_block_header_decode().
+               for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
+                       free(filters[i].options);
+
                goto data_error;
 
        default:
@@ -466,14 +465,6 @@ data_error:
        // Show the error message.
        message_error("%s: %s", pair->src_name,
                        message_strm(LZMA_DATA_ERROR));
-
-       // Free the memory allocated by lzma_block_header_decode().
-       // This is truly needed only if we get here after a succcessful
-       // call to lzma_block_header_decode() but it doesn't hurt to
-       // always do it.
-       for (size_t i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
-               free(filters[i].options);
-
        return true;
 }
 
index 80c86a4..0a7a522 100644 (file)
@@ -211,7 +211,7 @@ message_set_files(unsigned int files)
 static void
 print_filename(void)
 {
-       if (files_total != 1 || filename != stdin_filename) {
+       if (!opt_robot && (files_total != 1 || filename != stdin_filename)) {
                signals_block();
 
                FILE *file = opt_mode == MODE_LIST ? stdout : stderr;
@@ -859,6 +859,17 @@ message_mem_needed(enum message_verbosity v, uint64_t memusage)
        // the user might need to +1 MiB to get high enough limit.)
        memusage = round_up_to_mib(memusage);
 
+       uint64_t memlimit = hardware_memlimit_get(opt_mode);
+
+       // Handle the case when there is no memory usage limit.
+       // This way we don't print a weird message with a huge number.
+       if (memlimit == UINT64_MAX) {
+               message(v, _("%s MiB of memory is required. "
+                               "The limiter is disabled."),
+                               uint64_to_str(memusage, 0));
+               return;
+       }
+
        // With US-ASCII:
        // 2^64 with thousand separators + " MiB" suffix + '\0' = 26 + 4 + 1
        // But there may be multibyte chars so reserve enough space.
@@ -867,7 +878,6 @@ message_mem_needed(enum message_verbosity v, uint64_t memusage)
        // Show the memory usage limit as MiB unless it is less than 1 MiB.
        // This way it's easy to notice errors where one has typed
        // --memory=123 instead of --memory=123MiB.
-       uint64_t memlimit = hardware_memlimit_get(opt_mode);
        if (memlimit < (UINT32_C(1) << 20)) {
                snprintf(memlimitstr, sizeof(memlimitstr), "%s B",
                                uint64_to_str(memlimit, 1));
index f1c9135..8edc456 100644 (file)
@@ -5,7 +5,7 @@
 .\" This file has been put into the public domain.
 .\" You can do whatever you want with this file.
 .\"
-.TH XZ 1 "2010-10-04" "Tukaani" "XZ Utils"
+.TH XZ 1 "2012-05-27" "Tukaani" "XZ Utils"
 .
 .SH NAME
 xz, unxz, xzcat, lzma, unlzma, lzcat \- Compress or decompress .xz and .lzma files
@@ -1836,6 +1836,25 @@ headers.
 .PD
 .PP
 The columns of the
+.B summary
+lines:
+.PD 0
+.RS
+.IP 2. 4
+Amount of memory (in bytes) required to decompress
+this file with this
+.B xz
+version
+.IP 3. 4
+.B yes
+or
+.B no
+indicating if all block headers have both compressed size and
+uncompressed size stored in them
+.RE
+.PD
+.PP
+The columns of the
 .B totals
 line:
 .PD 0