X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=hivex%2Fhivex.c;h=e47dd2324089b4a84e441c646a0447e819cdd385;hp=85d6c7bee9c0097435a595ba5cd359914a98b260;hb=1b4bab6db252abcc3daab11159b0e45862c10b4c;hpb=a4e27cdf4d3b831792dd20d796dc98a5bc684290 diff --git a/hivex/hivex.c b/hivex/hivex.c index 85d6c7b..e47dd23 100644 --- a/hivex/hivex.c +++ b/hivex/hivex.c @@ -30,7 +30,6 @@ #include #include #include -#include #ifdef HAVE_ENDIAN_H #include #endif @@ -45,9 +44,15 @@ #ifndef be64toh #define be64toh(x) __bswap_64 (x) #endif +#ifndef le16toh +#define le16toh(x) (x) +#endif #ifndef le32toh #define le32toh(x) (x) #endif +#ifndef le64toh +#define le64toh(x) (x) +#endif #else #ifndef be32toh #define be32toh(x) (x) @@ -55,9 +60,15 @@ #ifndef be64toh #define be64toh(x) (x) #endif +#ifndef le16toh +#define le16toh(x) __bswap_16 (x) +#endif #ifndef le32toh #define le32toh(x) __bswap_32 (x) #endif +#ifndef le64toh +#define le64toh(x) __bswap_64 (x) +#endif #endif #include "hivex.h" @@ -132,7 +143,7 @@ struct ntreg_hbin_block { } __attribute__((__packed__)); #define BLOCK_ID_EQ(h,offs,eqid) \ - (strncmp (((struct ntreg_hbin_block *)((h)->addr + (offs)))->id, (eqid), 2) == 0) + (STREQLEN (((struct ntreg_hbin_block *)((h)->addr + (offs)))->id, (eqid), 2)) static size_t block_len (hive_h *h, size_t blkoff, int *used) @@ -224,7 +235,7 @@ hivex_open (const char *filename, int flags) h->msglvl = flags & HIVEX_OPEN_MSGLVL_MASK; const char *debug = getenv ("HIVEX_DEBUG"); - if (debug && strcmp (debug, "1") == 0) + if (debug && STREQ (debug, "1")) h->msglvl = 2; if (h->msglvl >= 2) @@ -259,6 +270,8 @@ hivex_open (const char *filename, int flags) } h->bitmap = calloc (1 + h->size / 32, 1); + if (h->bitmap == NULL) + goto error; #if 0 /* Doesn't work. */ /* Header checksum. */ @@ -712,7 +725,7 @@ hivex_node_get_child (hive_h *h, hive_node_h node, const char *nname) for (i = 0; children[i] != 0; ++i) { name = hivex_node_name (h, children[i]); if (!name) goto error; - if (strcasecmp (name, nname) == 0) { + if (STRCASEEQ (name, nname)) { ret = children[i]; break; } @@ -843,7 +856,7 @@ hivex_node_get_value (hive_h *h, hive_node_h node, const char *key) for (i = 0; values[i] != 0; ++i) { name = hivex_value_key (h, values[i]); if (!name) goto error; - if (strcasecmp (name, key) == 0) { + if (STRCASEEQ (name, key)) { ret = values[i]; break; } @@ -1019,9 +1032,12 @@ windows_utf16_to_utf8 (/* const */ char *input, size_t len) size_t r = iconv (ic, &inp, &inlen, &outp, &outlen); if (r == (size_t) -1) { if (errno == E2BIG) { + size_t prev = outalloc; /* Try again with a larger output buffer. */ free (out); outalloc *= 2; + if (outalloc < prev) + return NULL; goto again; } else {