+static int
+decompress_chunk(const void *cbuf, u32 chunk_csize, u8 *ubuf, u32 chunk_usize,
+ struct wimlib_decompressor *decompressor, bool recover_data)
+{
+ int res = wimlib_decompress(cbuf, chunk_csize, ubuf, chunk_usize,
+ decompressor);
+ if (likely(res == 0))
+ return 0;
+
+ if (recover_data) {
+ WARNING("Failed to decompress data! Continuing anyway since data recovery mode is enabled.");
+
+ /* Continue on with *something*. In the worst case just use a
+ * zeroed buffer. But, try to fill as much of it with
+ * decompressed data as we can. This works because if the
+ * corruption isn't located right at the beginning of the
+ * compressed chunk, wimlib_decompress() may write some correct
+ * output at the beginning even if it fails later. */
+ memset(ubuf, 0, chunk_usize);
+ (void)wimlib_decompress(cbuf, chunk_csize, ubuf,
+ chunk_usize, decompressor);
+ return 0;
+ }
+ ERROR("Failed to decompress data!");
+ errno = EINVAL;
+ return WIMLIB_ERR_DECOMPRESSION;
+}
+