Browse code

fixing decompression hack for LZX since we increased CAB_BLOCKMAX. adding some debug messages and eliminating one that no longer makes sense.

Micah Snyder authored on 2017/10/11 03:19:18
Showing 2 changed files
... ...
@@ -68,6 +68,7 @@
68 68
  * block seen in the wild is 337 bytes above uncompressed size.
69 69
  */
70 70
 #define CAB_BLOCKMAX (65535)
71
+#define CAB_BLOCKSTD (32768)
71 72
 #define CAB_INPUTMAX (CAB_BLOCKMAX+6144)
72 73
 
73 74
 /* There are no more than 65535 data blocks per folder, so a folder cannot
... ...
@@ -346,20 +346,20 @@ static int cabd_read_headers(struct mspack_system *sys,
346 346
   /* get the number of folders */
347 347
   num_folders = EndGetI16(&buf[cfhead_NumFolders]);
348 348
   if (num_folders == 0) {
349
-    if (!quiet) sys->message(fh, "no folders in cabinet.");
349
+    sys->message(fh, "no folders in cabinet.");
350 350
     return MSPACK_ERR_DATAFORMAT;
351 351
   }
352 352
 
353 353
   /* get the number of files */
354 354
   num_files = EndGetI16(&buf[cfhead_NumFiles]);
355 355
   if (num_files == 0) {
356
-    if (!quiet) sys->message(fh, "no files in cabinet.");
356
+    sys->message(fh, "no files in cabinet.");
357 357
     return MSPACK_ERR_DATAFORMAT;
358 358
   }
359 359
 
360 360
   /* check cabinet version */
361 361
   if ((buf[cfhead_MajorVersion] != 1) && (buf[cfhead_MinorVersion] != 3)) {
362
-    if (!quiet) sys->message(fh, "WARNING; cabinet version is not 1.3");
362
+    sys->message(fh, "WARNING; unexpected cabinet version %d.%d (expected 1.3)", buf[cfhead_MajorVersion], buf[cfhead_MinorVersion]);
363 363
   }
364 364
 
365 365
   /* read the reserved-sizes part of header, if present */
... ...
@@ -458,7 +458,7 @@ static int cabd_read_headers(struct mspack_system *sys,
458 458
 
459 459
       if (!ifol) {
460 460
 	sys->free(file);
461
-	D(("invalid folder index"))
461
+	sys->message(NULL, "invalid folder index: %d", x);
462 462
 	return MSPACK_ERR_DATAFORMAT;
463 463
       }
464 464
     }
... ...
@@ -551,6 +551,7 @@ static char *cabd_read_string(struct mspack_system *sys,
551 551
   for (i = 1, ok = 0; i < len; i++) if (!buf[i]) { ok = 1; break; }
552 552
   if (!ok) {
553 553
     *error = MSPACK_ERR_DATAFORMAT;
554
+    sys->message(NULL, "Unable to find null terminator for string read in buffer of len %d", len);
554 555
     return NULL;
555 556
   }
556 557
 
... ...
@@ -873,6 +874,7 @@ static int cabd_merge(struct mscab_decompressor *base,
873 873
   else {
874 874
     /* folder merge required - do the files match? */
875 875
     if (! cabd_can_merge_folders(sys, lfol, rfol)) {
876
+      sys->message(NULL, "Failed to merge folders");
876 877
       return self->error = MSPACK_ERR_DATAFORMAT;
877 878
     }
878 879
 
... ...
@@ -1142,27 +1144,32 @@ static int cabd_init_decomp(struct mscab_decompressor_p *self, unsigned int ct)
1142 1142
 
1143 1143
   switch (ct & cffoldCOMPTYPE_MASK) {
1144 1144
   case cffoldCOMPTYPE_NONE:
1145
+    self->d->sys.message(NULL, "Detected CAB Compression Type: None (%x)", ct & cffoldCOMPTYPE_MASK);
1145 1146
     self->d->decompress = (int (*)(void *, off_t)) &noned_decompress;
1146 1147
     self->d->state = noned_init(&self->d->sys, fh, fh,
1147 1148
 				self->param[MSCABD_PARAM_DECOMPBUF]);
1148 1149
     break;
1149 1150
   case cffoldCOMPTYPE_MSZIP:
1151
+    self->d->sys.message(NULL, "Detected CAB Compression Type: MSZIP (%x)", ct & cffoldCOMPTYPE_MASK);
1150 1152
     self->d->decompress = (int (*)(void *, off_t)) &mszipd_decompress;
1151 1153
     self->d->state = mszipd_init(&self->d->sys, fh, fh,
1152 1154
 				 self->param[MSCABD_PARAM_DECOMPBUF],
1153 1155
 				 self->param[MSCABD_PARAM_FIXMSZIP]);
1154 1156
     break;
1155 1157
   case cffoldCOMPTYPE_QUANTUM:
1158
+    self->d->sys.message(NULL, "Detected CAB Compression Type: QUANTUM (%x)", ct & cffoldCOMPTYPE_MASK);
1156 1159
     self->d->decompress = (int (*)(void *, off_t)) &qtmd_decompress;
1157 1160
     self->d->state = qtmd_init(&self->d->sys, fh, fh, (int) (ct >> 8) & 0x1f,
1158 1161
 			       self->param[MSCABD_PARAM_DECOMPBUF]);
1159 1162
     break;
1160 1163
   case cffoldCOMPTYPE_LZX:
1164
+    self->d->sys.message(NULL, "Detected CAB Compression Type: LZX (%x)", ct & cffoldCOMPTYPE_MASK);
1161 1165
     self->d->decompress = (int (*)(void *, off_t)) &lzxd_decompress;
1162 1166
     self->d->state = lzxd_init(&self->d->sys, fh, fh, (int) (ct >> 8) & 0x1f, 0,
1163 1167
 			       self->param[MSCABD_PARAM_DECOMPBUF], (off_t)0,0);
1164 1168
     break;
1165 1169
   default:
1170
+    self->d->sys.message(NULL, "Unsupported compression type for CAB: %x", ct & cffoldCOMPTYPE_MASK);
1166 1171
     return self->error = MSPACK_ERR_DATAFORMAT;
1167 1172
   }
1168 1173
   return self->error = (self->d->state) ? MSPACK_ERR_OK : MSPACK_ERR_NOMEMORY;
... ...
@@ -1220,6 +1227,7 @@ static int cabd_sys_read(struct mspack_file *file, void *buffer, int bytes) {
1220 1220
 
1221 1221
       /* check if we're out of input blocks, advance block counter */
1222 1222
       if (self->d->block++ >= self->d->folder->base.num_blocks) {
1223
+  sys->message(NULL, "Ran out of CAB input blocks prematurely");
1223 1224
 	self->read_error = MSPACK_ERR_DATAFORMAT;
1224 1225
 	break;
1225 1226
       }
... ...
@@ -1242,15 +1250,11 @@ static int cabd_sys_read(struct mspack_file *file, void *buffer, int bytes) {
1242 1242
 	  /* special LZX hack -- on the last block, inform LZX of the
1243 1243
 	   * size of the output data stream. */
1244 1244
 	  lzxd_set_output_length((struct lzxd_stream *) self->d->state, (off_t)
1245
-				 ((self->d->block-1) * CAB_BLOCKMAX + outlen));
1245
+				 ((self->d->block-1) * CAB_BLOCKSTD + outlen));
1246 1246
 	}
1247 1247
       }
1248 1248
       else {
1249
-	/* not the last block */
1250
-	if (outlen < CAB_BLOCKMAX) {
1251
-	  self->system->message(self->d->infh,
1252
-				"WARNING; non-maximal data block");
1253
-	}
1249
+        /* not the last block */
1254 1250
       }
1255 1251
     } /* if (avail) */
1256 1252
   } /* while (todo > 0) */
... ...
@@ -1351,7 +1355,7 @@ static int cabd_sys_read_block(struct mspack_system *sys,
1351 1351
 
1352 1352
     /* advance to next member in the cabinet set */
1353 1353
     if (!(d->data = d->data->next)) {
1354
-      D(("ran out of splits in cabinet set"))
1354
+      sys->message(NULL, "ran out of splits in cabinet set");
1355 1355
       return MSPACK_ERR_DATAFORMAT;
1356 1356
     }
1357 1357