]> granicus.if.org Git - file/commitdiff
- add float and double types
authorChristos Zoulas <christos@zoulas.com>
Fri, 17 Feb 2012 05:27:45 +0000 (05:27 +0000)
committerChristos Zoulas <christos@zoulas.com>
Fri, 17 Feb 2012 05:27:45 +0000 (05:27 +0000)
- fix debug printf formats
- fix short stream sizes
- don't fail if we don't know about a type

src/cdf.c
src/cdf.h
src/readcdf.c

index c18ab9a5a49531cd7328d0f1d88907df1812b0e1..08255d79a235d1a9e5aac4d7fa711e7b52a041bd 100644 (file)
--- a/src/cdf.c
+++ b/src/cdf.c
@@ -35,7 +35,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: cdf.c,v 1.46 2011/09/16 21:23:59 christos Exp $")
+FILE_RCSID("@(#)$File: cdf.c,v 1.47 2012/02/17 04:23:30 christos Exp $")
 #endif
 
 #include <assert.h>
@@ -351,11 +351,13 @@ ssize_t
 cdf_read_short_sector(const cdf_stream_t *sst, void *buf, size_t offs,
     size_t len, const cdf_header_t *h, cdf_secid_t id)
 {
-       size_t ss = CDF_SHORT_SEC_SIZE(h);
+       size_t ss = CDF_SEC_SIZE(h);
        size_t pos = CDF_SHORT_SEC_POS(h, id);
        assert(ss == len);
-       if (sst->sst_len < (size_t)id) {
-               DPRINTF(("bad sector id %d > %d\n", id, sst->sst_len));
+       if (pos > ss * sst->sst_len) {
+               DPRINTF(("Out of bounds read %" SIZE_T_FORMAT "u > %"
+                   SIZE_T_FORMAT "u\n",
+                   pos, ss * sst->sst_len));
                return -1;
        }
        (void)memcpy(((char *)buf) + offs,
@@ -426,8 +428,8 @@ cdf_read_sat(const cdf_info_t *info, cdf_header_t *h, cdf_sat_t *sat)
                        if (sec < 0)
                                goto out;
                        if (i >= sat->sat_len) {
-                           DPRINTF(("Out of bounds reading MSA %u >= %u",
-                               i, sat->sat_len));
+                           DPRINTF(("Out of bounds reading MSA %" SIZE_T_FORMAT
+                               "u >= %" SIZE_T_FORMAT "u", i, sat->sat_len));
                            errno = EFTYPE;
                            goto out2;
                        }
@@ -500,7 +502,8 @@ cdf_read_long_sector_chain(const cdf_info_t *info, const cdf_header_t *h,
                }
                if (i >= scn->sst_len) {
                        DPRINTF(("Out of bounds reading long sector chain "
-                           "%u > %u\n", i, scn->sst_len));
+                           "%" SIZE_T_FORMAT "u > %" SIZE_T_FORMAT "u\n", i,
+                           scn->sst_len));
                        errno = EFTYPE;
                        goto out;
                }
@@ -526,7 +529,7 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
     const cdf_sat_t *ssat, const cdf_stream_t *sst,
     cdf_secid_t sid, size_t len, cdf_stream_t *scn)
 {
-       size_t ss = CDF_SHORT_SEC_SIZE(h), i, j;
+       size_t ss = CDF_SEC_SIZE(h), i, j;
        scn->sst_len = cdf_count_chain(ssat, sid, CDF_SEC_SIZE(h));
        scn->sst_dirlen = len;
 
@@ -545,7 +548,8 @@ cdf_read_short_sector_chain(const cdf_header_t *h,
                }
                if (i >= scn->sst_len) {
                        DPRINTF(("Out of bounds reading short sector chain "
-                           "%u > %u\n", i, scn->sst_len));
+                           "%" SIZE_T_FORMAT "u > %" SIZE_T_FORMAT "u\n",
+                           i, scn->sst_len));
                        errno = EFTYPE;
                        goto out;
                }
@@ -653,7 +657,8 @@ cdf_read_ssat(const cdf_info_t *info, const cdf_header_t *h,
                }
                if (i >= ssat->sat_len) {
                        DPRINTF(("Out of bounds reading short sector chain "
-                           "%u > %u\n", i, ssat->sat_len));
+                           "%" SIZE_T_FORMAT "u > %" SIZE_T_FORMAT "u\n", i,
+                           ssat->sat_len));
                        errno = EFTYPE;
                        goto out;
                }
@@ -802,8 +807,9 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
                }
                inp[i].pi_id = CDF_GETUINT32(p, i << 1);
                inp[i].pi_type = CDF_GETUINT32(q, 0);
-               DPRINTF(("%d) id=%x type=%x offs=%x,%d\n", i, inp[i].pi_id,
-                   inp[i].pi_type, q - p, CDF_GETUINT32(p, (i << 1) + 1)));
+               DPRINTF(("%" SIZE_T_FORMAT "u) id=%x type=%x offs=%tx,%d\n", i,
+                   inp[i].pi_id, inp[i].pi_type, q - p,
+                   CDF_GETUINT32(p, (i << 1) + 1)));
                if (inp[i].pi_type & CDF_VECTOR) {
                        nelements = CDF_GETUINT32(q, 1);
                        o = 2;
@@ -849,6 +855,20 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
                        (void)memcpy(&u64, &q[o4], sizeof(u64));
                        inp[i].pi_u64 = CDF_TOLE8((uint64_t)u64);
                        break;
+               case CDF_FLOAT:
+                       if (inp[i].pi_type & CDF_VECTOR)
+                               goto unknown;
+                       (void)memcpy(&u32, &q[o4], sizeof(u32));
+                       u32 = CDF_TOLE4(u32);
+                       memcpy(&inp[i].pi_f, &u32, sizeof(inp[i].pi_f));
+                       break;
+               case CDF_DOUBLE:
+                       if (inp[i].pi_type & CDF_VECTOR)
+                               goto unknown;
+                       (void)memcpy(&u64, &q[o4], sizeof(u64));
+                       u64 = CDF_TOLE8((uint64_t)u64);
+                       memcpy(&inp[i].pi_d, &u64, sizeof(inp[i].pi_d));
+                       break;
                case CDF_LENGTH32_STRING:
                case CDF_LENGTH32_WSTRING:
                        if (nelements > 1) {
@@ -864,13 +884,15 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
                                *info = inp;
                                inp = *info + nelem;
                        }
-                       DPRINTF(("nelements = %d\n", nelements));
+                       DPRINTF(("nelements = %" SIZE_T_FORMAT "u\n",
+                           nelements));
                        for (j = 0; j < nelements; j++, i++) {
                                uint32_t l = CDF_GETUINT32(q, o);
                                inp[i].pi_str.s_len = l;
                                inp[i].pi_str.s_buf = (const char *)
                                    (const void *)(&q[o4 + sizeof(l)]);
-                               DPRINTF(("l = %d, r = %d, s = %s\n", l,
+                               DPRINTF(("l = %d, r = %" SIZE_T_FORMAT
+                                   "u, s = %s\n", l,
                                    CDF_ROUND(l, sizeof(l)),
                                    inp[i].pi_str.s_buf));
                                l = 4 + (uint32_t)CDF_ROUND(l, sizeof(l));
@@ -895,7 +917,7 @@ cdf_read_property_info(const cdf_stream_t *sst, const cdf_header_t *h,
                unknown:
                        DPRINTF(("Don't know how to deal with %x\n",
                            inp[i].pi_type));
-                       goto out;
+                       break;
                }
        }
        return 0;
@@ -934,8 +956,9 @@ cdf_unpack_summary_info(const cdf_stream_t *sst, const cdf_header_t *h,
                        return -1;
                }
                if (cdf_read_property_info(sst, h, CDF_TOLE4(sd->sd_offset),
-                   info, count, &maxcount) == -1)
+                   info, count, &maxcount) == -1) {
                        return -1;
+               }
        }
        return 0;
 }
@@ -1060,14 +1083,14 @@ cdf_dump_sat(const char *prefix, const cdf_sat_t *sat, size_t size)
        size_t i, j, s = size / sizeof(cdf_secid_t);
 
        for (i = 0; i < sat->sat_len; i++) {
-               (void)fprintf(stderr, "%s[%" SIZE_T_FORMAT "u]:\n%.6d: ",
-                   prefix, i, i * s);
+               (void)fprintf(stderr, "%s[%" SIZE_T_FORMAT "u]:\n%.6"
+                   SIZE_T_FORMAT "u: ", prefix, i, i * s);
                for (j = 0; j < s; j++) {
                        (void)fprintf(stderr, "%5d, ",
                            CDF_TOLE4(sat->sat_tab[s * i + j]));
                        if ((j + 1) % 10 == 0)
-                               (void)fprintf(stderr, "\n%.6d: ",
-                                   i * s + j + 1);
+                               (void)fprintf(stderr, "\n%.6" SIZE_T_FORMAT
+                                   "u: ", i * s + j + 1);
                }
                (void)fprintf(stderr, "\n");
        }
@@ -1086,7 +1109,8 @@ cdf_dump(void *v, size_t len)
                if (j == 16) {
                        j = 0;
                        abuf[15] = '\0';
-                       (void)fprintf(stderr, "%s\n%.4x: ", abuf, i + 1);
+                       (void)fprintf(stderr, "%s\n%.4" SIZE_T_FORMAT "x: ",
+                           abuf, i + 1);
                }
        }
        (void)fprintf(stderr, "\n");
@@ -1184,6 +1208,14 @@ cdf_dump_property_info(const cdf_property_info_t *info, size_t count)
                        (void)fprintf(stderr, "unsigned 32 [%u]\n",
                            info[i].pi_u32);
                        break;
+               case CDF_FLOAT:
+                       (void)fprintf(stderr, "float [%g]\n",
+                           info[i].pi_f);
+                       break;
+               case CDF_DOUBLE:
+                       (void)fprintf(stderr, "double [%g]\n",
+                           info[i].pi_d);
+                       break;
                case CDF_LENGTH32_STRING:
                        (void)fprintf(stderr, "string %u [%.*s]\n",
                            info[i].pi_str.s_len,
index 7f3126b83d4216fb2594dd9266de0a618c8a6643..a025202f543f40dd9ba6638ee8980bf2230a2985 100644 (file)
--- a/src/cdf.h
+++ b/src/cdf.h
@@ -76,9 +76,9 @@ typedef struct {
         cdf_secid_t    h_master_sat[436/4];
 } cdf_header_t;
 
-#define CDF_SEC_SIZE(h)        (1 << (h)->h_sec_size_p2)
+#define CDF_SEC_SIZE(h)        ((size_t)(1 << (h)->h_sec_size_p2))
 #define CDF_SEC_POS(h, secid) (CDF_SEC_SIZE(h) + (secid) * CDF_SEC_SIZE(h))
-#define CDF_SHORT_SEC_SIZE(h)  (1 << (h)->h_short_sec_size_p2)
+#define CDF_SHORT_SEC_SIZE(h)  ((size_t)(1 << (h)->h_short_sec_size_p2))
 #define CDF_SHORT_SEC_POS(h, secid) ((secid) * CDF_SHORT_SEC_SIZE(h))
 
 typedef int32_t        cdf_dirid_t;
@@ -170,6 +170,8 @@ typedef struct {
                 uint64_t       _pi_u64;
                 int64_t                _pi_s64;
                 cdf_timestamp_t        _pi_tp;
+               float           _pi_f;
+               double          _pi_d;
                 struct {
                         uint32_t s_len;
                         const char *s_buf;
@@ -181,6 +183,8 @@ typedef struct {
 #define pi_s32 pi_val._pi_s32
 #define pi_u16 pi_val._pi_u16
 #define pi_s16 pi_val._pi_s16
+#define pi_f   pi_val._pi_f
+#define pi_d   pi_val._pi_d
 #define pi_tp  pi_val._pi_tp
 #define pi_str pi_val._pi_str
 } cdf_property_info_t;
index b5b6d3fb7c001cde15105a6e6861335c5a1312c9..8f439d5e48d655eb809931db3a1423ffb8c859f8 100644 (file)
@@ -26,7 +26,7 @@
 #include "file.h"
 
 #ifndef lint
-FILE_RCSID("@(#)$File: readcdf.c,v 1.26 2011/08/26 13:38:28 christos Exp $")
+FILE_RCSID("@(#)$File: readcdf.c,v 1.27 2011/09/28 13:30:10 christos Exp $")
 #endif
 
 #include <stdlib.h>
@@ -72,6 +72,16 @@ cdf_file_property_info(struct magic_set *ms, const cdf_property_info_t *info,
                             info[i].pi_u32) == -1)
                                 return -1;
                         break;
+                case CDF_FLOAT:
+                        if (NOTMIME(ms) && file_printf(ms, ", %s: %g", buf,
+                            info[i].pi_f) == -1)
+                                return -1;
+                        break;
+                case CDF_DOUBLE:
+                        if (NOTMIME(ms) && file_printf(ms, ", %s: %g", buf,
+                            info[i].pi_d) == -1)
+                                return -1;
+                        break;
                 case CDF_LENGTH32_STRING:
                 case CDF_LENGTH32_WSTRING:
                         len = info[i].pi_str.s_len;