Package: unshield
Version: 0.6-2
Followup-For: Bug #580470

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

This bug has been fixed upstream for quite a while and makes unshield pretty
useless on a number of newer archives:

bjorn@nemi:~/docs/hardware/ZTE/MF60$ unshield -D3 l /mnt/temp/Data/data2.cab 
[unshield_read_headers:226] Reading header from .hdr file 1.
[unshield_read_headers:281] Version 0x02000578 handled as major version 0
[unshield_get_cab_descriptor:81] Cabinet descriptor: 00002610 00002eb4 00002eb4 
00000014
[unshield_get_cab_descriptor:83] Directory count: 5
[unshield_get_cab_descriptor:84] File count: 129
Aborted

The generic solution provided as an attachment to
http://sourceforge.net/tracker/?func=detail&aid=3163039&group_id=30550&atid=399603
has been integrated upstream as commit 0c81b16e in the git repo at
git://github.com/twogood/unshield.git

The patch is based on the previous hacky workaround for specific versions
so it needs minor cleanup to apply to the current Debian package.  I've
attached a cleaned up patch which has been tested an verified on top of
the Debian unshield version 0.6-2.  Please either apply this patch or
update to current git head.

Thanks,
Bjørn


- -- System Information:
Debian Release: wheezy/sid
  APT prefers testing
  APT policy: (990, 'testing'), (700, 'stable'), (600, 'unstable'), (500, 
'stable-updates'), (1, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 3.2.0-1-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages unshield depends on:
ii  libc6         2.13-26
ii  libunshield0  0.6-2
ii  zlib1g        1:1.2.6.dfsg-1

unshield recommends no packages.

unshield suggests no packages.

- -- no debconf information

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)

iEYEARECAAYFAk9R/0MACgkQ10rqkowbIsm4TQCeMaaNka6KkzN5I2DM/dcuvz1m
siUAnRmtiXer3wYY5C22c2J9M9OCw7y8
=Ijyc
-----END PGP SIGNATURE-----
diff -urN unshield-0.6.old/lib/component.c unshield-0.6/lib/component.c
--- unshield-0.6.old/lib/component.c	2012-03-03 11:57:55.000000000 +0100
+++ unshield-0.6/lib/component.c	2012-03-03 11:58:54.000000000 +0100
@@ -40,11 +40,13 @@
     case 7:
     case 8:
     case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    default:
       p += 0x6b;
       break;
-
-    default:
-      abort();
   }
 
   self->file_group_count = READ_UINT16(p); p += 2;
diff -urN unshield-0.6.old/lib/file.c unshield-0.6/lib/file.c
--- unshield-0.6.old/lib/file.c	2012-03-03 11:57:55.000000000 +0100
+++ unshield-0.6/lib/file.c	2012-03-03 11:58:54.000000000 +0100
@@ -77,6 +77,11 @@
     case 7:
     case 8:
     case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    default:
       saved_p = p = header->data +
           header->common.cab_descriptor_offset +
           header->cab.file_table_offset +
@@ -117,10 +122,6 @@
 
       assert((p - saved_p) == 0x57);
       break;
-
-    default:
-      unshield_error("Unknown major version: %i", header->major_version);
-      abort();
   }
 
   if (!(fd->flags & FILE_COMPRESSED) &&
@@ -363,6 +364,11 @@
     case 7:
     case 8:
     case 9:
+    case 10:
+    case 11:
+    case 12:
+    case 13:
+    default:
       {
         uint8_t six_header[VOLUME_HEADER_SIZE_V6];
         uint8_t* p = six_header;
@@ -389,10 +395,6 @@
         reader->volume_header.last_file_size_compressed_high    = READ_UINT32(p); p += 4;
       }
       break;
-
-    default:
-      abort();
-      goto exit;
   }
   
 #if VERBOSE >= 2
diff -urN unshield-0.6.old/lib/libunshield.c unshield-0.6/lib/libunshield.c
--- unshield-0.6.old/lib/libunshield.c	2012-03-03 11:57:55.000000000 +0100
+++ unshield-0.6/lib/libunshield.c	2012-03-03 12:01:22.000000000 +0100
@@ -205,7 +205,7 @@
 /**
   Read all header files
  */
-static bool unshield_read_headers(Unshield* unshield)/*{{{*/
+static bool unshield_read_headers(Unshield* unshield, int version)/*{{{*/
 {
   int i;
   bool iterate = true;
@@ -269,7 +269,20 @@
         goto error;
       }
       
-      header->major_version = (header->common.version >> 12) & 0xf;
+      if (version != -1)
+      {
+        header->major_version = version;
+      }
+      else if (header->common.version >> 24 == 1)
+      {
+        header->major_version = (header->common.version >> 12) & 0xf;
+      }
+      else if (header->common.version >> 24 == 2)
+      {
+        header->major_version = (header->common.version & 0xffff);
+        if (header->major_version != 0)
+          header->major_version = header->major_version / 100;
+      }
 
 #if 0
       if (header->major_version < 5)
@@ -326,6 +339,11 @@
 
 Unshield* unshield_open(const char* filename)/*{{{*/
 {
+  return unshield_open_force_version(filename, -1);
+}/*}}}*/
+
+Unshield* unshield_open_force_version(const char* filename, int version)/*{{{*/
+{
   Unshield* unshield = NEW1(Unshield);
   if (!unshield)
   {
@@ -339,7 +357,7 @@
     goto error;
   }
 
-  if (!unshield_read_headers(unshield))
+  if (!unshield_read_headers(unshield, version))
   {
     unshield_error("Failed to read header files");
     goto error;
diff -urN unshield-0.6.old/lib/libunshield.h unshield-0.6/lib/libunshield.h
--- unshield-0.6.old/lib/libunshield.h	2012-03-03 11:57:55.000000000 +0100
+++ unshield-0.6/lib/libunshield.h	2012-03-03 11:58:54.000000000 +0100
@@ -33,6 +33,7 @@
  */
 
 Unshield* unshield_open(const char* filename);
+Unshield* unshield_open_force_version(const char* filename, int version);
 void unshield_close(Unshield* unshield);
 
 /*
diff -urN unshield-0.6.old/src/unshield.c unshield-0.6/src/unshield.c
--- unshield-0.6.old/src/unshield.c	2012-03-03 11:57:55.000000000 +0100
+++ unshield-0.6/src/unshield.c	2012-03-03 11:58:54.000000000 +0100
@@ -58,6 +58,7 @@
 static int log_level                  = UNSHIELD_LOG_LEVEL_LOWEST;
 static int exit_status                = 0;
 static FORMAT format                  = FORMAT_NEW;
+static int is_version                 = -1;
 
 static bool make_sure_directory_exists(const char* directory)/*{{{*/
 {
@@ -108,7 +109,7 @@
   fprintf(stderr,
       "Syntax:\n"
       "\n"
-      "\t%s [-c COMPONENT] [-d DIRECTORY] [-D LEVEL] [-g GROUP] [-GhlOrV] c|g|l|t|x CABFILE\n"
+      "\t%s [-c COMPONENT] [-d DIRECTORY] [-D LEVEL] [-g GROUP] [-i VERSION] [-GhlOrV] c|g|l|t|x CABFILE\n"
       "\n"
       "Options:\n"
       "\t-c COMPONENT  Only list/extract this component\n"
@@ -120,6 +121,7 @@
       "\t                3 - Errors, warnings and debug messages\n"
       "\t-g GROUP      Only list/extract this file group\n"
       "\t-h            Show this help message\n"
+      "\t-i VERSION    Force InstallShield version number (don't autodetect)\n"
       "\t-j            Junk paths (do not make directories)\n"
       "\t-L            Make file and directory names lowercase\n"
       "\t-O            Use old compression\n"
@@ -152,7 +154,7 @@
 {
 	int c;
 
-	while ((c = getopt(argc, argv, "c:d:D:g:hjLnoOrV")) != -1)
+	while ((c = getopt(argc, argv, "c:d:D:g:hi:jLnoOrV")) != -1)
 	{
 		switch (c)
     {
@@ -172,6 +174,10 @@
         file_group_name = optarg;
         break;
 
+      case 'i':
+        is_version = atoi(optarg);
+        break;
+
       case 'j':
         junk_paths = true;
         break;
@@ -532,7 +538,7 @@
 
   cabfile = argv[last_optind];
 
-  unshield = unshield_open(cabfile);
+  unshield = unshield_open_force_version(cabfile, is_version);
   if (!unshield)
   {
     fprintf(stderr, "Failed to open %s as an InstallShield Cabinet File\n", cabfile);

Reply via email to