X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=hivex%2Fhivex.c;h=ac463465c487b13bd2184314e954a6311bf8efd7;hb=a25d175cf6e8283288fd6d209b37b09ffee0dcf3;hp=16be753b3c404c9a498f91a656021847b4634251;hpb=792c5283009ed6753239a14df9a6e9c71bea35fd;p=libguestfs.git diff --git a/hivex/hivex.c b/hivex/hivex.c index 16be753..ac46346 100644 --- a/hivex/hivex.c +++ b/hivex/hivex.c @@ -18,11 +18,12 @@ * See file LICENSE for the full license. */ +#include + #include #include #include #include -#include #include #include #include @@ -30,6 +31,46 @@ #include #include #include +#ifdef HAVE_ENDIAN_H +#include +#endif +#ifdef HAVE_BYTESWAP_H +#include +#endif + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#ifndef be32toh +#define be32toh(x) __bswap_32 (x) +#endif +#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) +#endif +#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" @@ -230,6 +271,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. */ @@ -990,9 +1033,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 {