Author: myles Date: 2008-02-13 18:30:49 +0100 (Wed, 13 Feb 2008) New Revision: 592
Modified: coreboot-v3/util/lar/lar.h coreboot-v3/util/lar/lib.c coreboot-v3/util/lar/lib.h coreboot-v3/util/lar/stream.c coreboot-v3/util/lzma/minilzma.cc coreboot-v3/util/nrv2b/nrv2b.c Log: This patch fixes a memory corruption error in lar when compiled on a 64-bit architecture. The function prototypes had a size mismatch, which overwrote other things on the stack. Now the prototypes use int for lengths.
Signed-off-by: Myles Watson myles@pel.cs.byu.edu Acked-by: Ronald G. Minnich rminnich@gmail.com
Modified: coreboot-v3/util/lar/lar.h =================================================================== --- coreboot-v3/util/lar/lar.h 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/lar/lar.h 2008-02-13 17:30:49 UTC (rev 592) @@ -93,18 +93,18 @@
enum compalgo { none = 0, lzma = 1, nrv2b = 2 };
-typedef void (*compress_func) (char *, u32, char *, u32 *); -typedef void (*uncompress_func) (char *, char *, u32); +typedef void (*compress_func) (char *, int, char *, int *); +typedef void (*uncompress_func) (char *, char *, int);
-void compress_impossible(char *in, u32 in_len, char *out, u32 *out_len); -void do_no_compress(char *in, u32 in_len, char *out, u32 *out_len); -void do_lzma_compress(char *in, u32 in_len, char *out, u32 *out_len); -void do_nrv2b_compress(char *in, u32 in_len, char *out, u32 *out_len); +void compress_impossible(char *in, int in_len, char *out, int *out_len); +void do_no_compress(char *in, int in_len, char *out, int *out_len); +void do_lzma_compress(char *in, int in_len, char *out, int *out_len); +void do_nrv2b_compress(char *in, int in_len, char *out, int *out_len);
-void uncompress_impossible(char *, char *, u32); -void do_no_uncompress(char *, char *, u32); -void do_lzma_uncompress(char *, char *, u32); -void do_nrv2b_uncompress(char *, char *, u32); +void uncompress_impossible(char *, char *, int); +void do_no_uncompress(char *, char *, int); +void do_lzma_uncompress(char *, char *, int); +void do_nrv2b_uncompress(char *, char *, int);
static compress_func compress_functions[] = { do_no_compress,
Modified: coreboot-v3/util/lar/lib.c =================================================================== --- coreboot-v3/util/lar/lib.c 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/lar/lib.c 2008-02-13 17:30:49 UTC (rev 592) @@ -40,7 +40,7 @@ * The default "compress impossible" hook to call when no other compression * is used */ -void compress_impossible(char *in, u32 in_len, char *out, u32 *out_len) +void compress_impossible(char *in, int in_len, char *out, int *out_len) { fprintf(stderr, "The selected compression algorithm wasn't compiled in.\n"); @@ -50,7 +50,7 @@ /** * The default "compress" hook to call when no other compression is used */ -void do_no_compress(char *in, u32 in_len, char *out, u32 *out_len) +void do_no_compress(char *in, int in_len, char *out, int *out_len) { memcpy(out, in, in_len); out_len[0] = in_len; @@ -60,7 +60,7 @@ * The default "uncompress" hook to call when no other compression is used */
-void do_no_uncompress(char *dst, char *src, u32 len) +void do_no_uncompress(char *dst, char *src, int len) { memcpy(dst, src, len); } @@ -68,7 +68,7 @@ /** * The default "uncompress" hook to call when no other compression is used */ -void uncompress_impossible(char *dst, char *src, u32 len) +void uncompress_impossible(char *dst, char *src, int len) { fprintf(stderr, "Cannot uncompress data (algorithm not compiled in).\n");
Modified: coreboot-v3/util/lar/lib.h =================================================================== --- coreboot-v3/util/lar/lib.h 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/lar/lib.h 2008-02-13 17:30:49 UTC (rev 592) @@ -58,7 +58,7 @@ /* Prototypes for in-memory LAR operations */ int lar_process_name(char *name, char **pfilename, char **ppathname, enum compalgo *thisalgo); -u32 lar_compress(char *ptr, ssize_t size, char *temp, enum compalgo *thisalgo); +int lar_compress(char *ptr, int size, char *temp, enum compalgo *thisalgo); int hlen(char *name); int maxsize(struct lar *lar, char *name); int lar_add_entry(struct lar *lar, char *pathname, void *data,
Modified: coreboot-v3/util/lar/stream.c =================================================================== --- coreboot-v3/util/lar/stream.c 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/lar/stream.c 2008-02-13 17:30:49 UTC (rev 592) @@ -113,7 +113,7 @@ ehdr->e_type, ehdr->e_machine, ehdr->e_version, - (void *)ehdr->e_entry, + (void *)(unsigned long)ehdr->e_entry, ehdr->e_phoff, ehdr->e_shoff, ehdr->e_flags, @@ -155,7 +155,7 @@ size = shdr[i].sh_size; if (verbose()) { fprintf(stderr, "(cleaned up) New section addr %p size 0x%#x\n", - (void *)shdr[i].sh_addr, (u32)shdr[i].sh_size); + (void *)(unsigned long)shdr[i].sh_addr, (u32)shdr[i].sh_size); } /* ok, copy it out */ sprintf(ename, "%s/segment%d", name, segment++); @@ -193,9 +193,9 @@ } if (verbose()) { fprintf(stderr, "(cleaned up) New segment addr %p size 0x%#x offset 0x%x\n", - (void *)phdr[i].p_paddr, size, phdr[i].p_offset); + (void *)(unsigned long)phdr[i].p_paddr, size, phdr[i].p_offset); fprintf(stderr, "Copy to %p from %p for %d bytes\n", - (unsigned char *)phdr[i].p_paddr, + (unsigned char *)(unsigned long)phdr[i].p_paddr, &header[phdr[i].p_offset], size); fprintf(stderr, "entry %ux loadaddr %ux\n", entry, phdr[i].p_paddr); @@ -840,9 +840,9 @@ * @param thisalgo pointer to algorithm -- this can be modified * @return size of compressed data */ -u32 lar_compress(char *ptr, ssize_t size, char *temp, enum compalgo *thisalgo) +int lar_compress(char *ptr, int size, char *temp, enum compalgo *thisalgo) { - u32 complen; + int complen; compress_functions[*thisalgo](ptr, size, temp, &complen);
if (complen >= size && (*thisalgo != none)) {
Modified: coreboot-v3/util/lzma/minilzma.cc =================================================================== --- coreboot-v3/util/lzma/minilzma.cc 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/lzma/minilzma.cc 2008-02-13 17:30:49 UTC (rev 592) @@ -280,15 +280,15 @@ #else extern "C" {
-void do_lzma_compress(char *in, unsigned long in_len, char *out, - unsigned long *out_len) { +void do_lzma_compress(char *in, int in_len, char *out, + int *out_len) { std::vector<unsigned char> result; result = LZMACompress(std::vector<unsigned char>(in, in + in_len)); *out_len = result.size(); std::memcpy(out, &result[0], *out_len); }
-void do_lzma_uncompress(char *dst, char *src, unsigned long len) { +void do_lzma_uncompress(char *dst, char *src, int len) { std::vector<unsigned char> result; result = LZMADeCompress(std::vector<unsigned char>(src, src + len)); std::memcpy(dst, &result[0], result.size());
Modified: coreboot-v3/util/nrv2b/nrv2b.c =================================================================== --- coreboot-v3/util/nrv2b/nrv2b.c 2008-02-13 16:43:32 UTC (rev 591) +++ coreboot-v3/util/nrv2b/nrv2b.c 2008-02-13 17:30:49 UTC (rev 592) @@ -1304,10 +1304,11 @@ #endif
#ifdef COMPACT -void do_nrv2b_compress(uint8_t *in, unsigned long in_len, uint8_t *out, unsigned long *out_len) { - *out_len = in_len + (in_len/8) + 256; - out = malloc(*out_len); - ucl_nrv2b_99_compress(in, in_len, out, out_len, 0 ); +void do_nrv2b_compress(uint8_t *in, int in_len, uint8_t *out, int *out_len) { + unsigned long new_out_len = in_len + (in_len/8) + 256; + out = malloc(new_out_len); + ucl_nrv2b_99_compress(in, in_len, out, &new_out_len, 0 ); + *out_len = (int) new_out_len; } #endif
@@ -1346,7 +1347,7 @@ #endif
#ifdef COMPACT -void do_nrv2b_uncompress(uint8_t *dst, uint8_t *src, unsigned long len) { +void do_nrv2b_uncompress(uint8_t *dst, uint8_t *src, int len) { unsigned long ilen = 0, olen = 0, last_m_off = 1; uint32_t bb = 0; unsigned bc = 0;