summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archival/lzop.c101
1 files changed, 49 insertions, 52 deletions
diff --git a/archival/lzop.c b/archival/lzop.c
index 419e1e2..e724b9e 100644
--- a/archival/lzop.c
+++ b/archival/lzop.c
@@ -448,7 +448,7 @@ typedef struct header_t {
uint16_t version_needed_to_extract_be16;
uint8_t method;
uint8_t level;
- uint32_t flags32; /* be32 on disk, but we keep them in native order */
+ uint32_t flags32; /* be32 on disk, but we keep this field in native order */
uint32_t mode_be32;
uint32_t mtime_be32;
uint32_t gmtdiff_be32;
@@ -577,18 +577,18 @@ static void f_read(void* buf, int cnt)
xread(0, buf, cnt);
add_bytes_to_chksum(buf, cnt);
}
-static int f_read8(void)
-{
- uint8_t v;
- f_read(&v, 1);
- return v;
-}
-static unsigned f_read16(void)
-{
- uint16_t v;
- f_read(&v, 2);
- return ntohs(v);
-}
+//static int f_read8(void)
+//{
+// uint8_t v;
+// f_read(&v, 1);
+// return v;
+//}
+//static unsigned f_read16(void)
+//{
+// uint16_t v;
+// f_read(&v, 2);
+// return ntohs(v);
+//}
static uint32_t f_read32(void)
{
uint32_t v;
@@ -928,66 +928,62 @@ static int read_header(header_t *h)
{
int l;
uint32_t checksum;
+ /* As it stands now, only h->flags32 is used by our caller.
+ * Therefore we don't store many fields in h->FIELD.
+ */
unsigned h_version;
- uint8_t h_method, h_level;
+ unsigned h_version_needed_to_extract;
init_chksum();
- /* As it stands now, only h->flags32 is used by our caller.
- * Therefore we don't store many fields in h->field.
+ /* We don't support versions < 0.94, since 0.94
+ * came only 2 months after 0.90:
+ * 0.90 (10 Aug 1997): First public release of lzop
+ * 0.94 (15 Oct 1997): Header format change
*/
- h_version = f_read16();
- if (h_version < 0x0900)
+
+ /* Read up to and including name length byte */
+ f_read(&h->version_be16, ((char*)&h->len_and_name[1]) - ((char*)&h->version_be16));
+
+ h_version = htons(h->version_be16);
+ if (h_version < 0x0940)
+ return 3;
+ h_version_needed_to_extract = htons(h->version_needed_to_extract_be16);
+ if (h_version_needed_to_extract > LZOP_VERSION)
+ return 16;
+ if (h_version_needed_to_extract < 0x0940)
return 3;
- /* UNUSED h->lib_version_be16 = */ f_read16();
- if (h_version >= 0x0940) {
- unsigned h_version_needed_to_extract = f_read16();
- if (h_version_needed_to_extract > LZOP_VERSION)
- return 16;
- if (h_version_needed_to_extract < 0x0900) /* first lzop version */
- return 3;
- }
- h_method = f_read8();
- if (h_method <= 0)
+ if (h->method <= 0)
return 14;
- h_level = 0;
- if (h_version >= 0x0940)
- h_level = f_read8();
/* former lzo_get_method(h): */
- if (h_method == M_LZO1X_1) {
- if (h_level == 0)
- h_level = 3;
- } else if (h_method == M_LZO1X_1_15) {
- if (h_level == 0)
- h_level = 1;
- } else if (h_method == M_LZO1X_999) {
- if (h_level == 0)
- h_level = 9;
+ if (h->method == M_LZO1X_1) {
+ if (h->level == 0)
+ h->level = 3;
+ } else if (h->method == M_LZO1X_1_15) {
+ if (h->level == 0)
+ h->level = 1;
+ } else if (h->method == M_LZO1X_999) {
+ if (h->level == 0)
+ h->level = 9;
} else
return -1; /* not a LZO method */
/* check compression level */
- if (h_level < 1 || h_level > 9)
+ if (h->level < 1 || h->level > 9)
return 15;
- h->flags32 = f_read32();
+ h->flags32 = ntohl(h->flags32);
if (h->flags32 & F_H_FILTER)
return 16; /* filter not supported */
/* check reserved flags */
if (h->flags32 & F_RESERVED)
return -13;
- /* UNUSED h->mode = */ f_read32();
- /* UNUSED h->mtime = */ f_read32();
- if (h_version >= 0x0940)
- /* UNUSED h->gmtdiff = */ f_read32();
-
- l = f_read8();
- /* UNUSED h->len_and_name[0] = l; */
- /* UNUSED h->len_and_name[1+l] = 0; */
+ l = h->len_and_name[0];
if (l > 0)
- f_read(h->len_and_name+1, l);
+ /* UNUSED */ f_read(h->len_and_name+1, l);
+ /* UNUSED h->len_and_name[1+l] = 0; */
checksum = chksum_getresult(h->flags32);
if (f_read32() != checksum)
@@ -998,12 +994,13 @@ static int read_header(header_t *h)
uint32_t extra_field_len;
uint32_t extra_field_checksum;
uint32_t k;
+ char dummy;
/* note: the checksum also covers the length */
init_chksum();
extra_field_len = f_read32();
for (k = 0; k < extra_field_len; k++)
- f_read8();
+ f_read(&dummy, 1);
checksum = chksum_getresult(h->flags32);
extra_field_checksum = f_read32();
if (extra_field_checksum != checksum)