diff options
author | John Gilmore <gnu@cygnus> | 1991-12-07 12:16:13 +0000 |
---|---|---|
committer | John Gilmore <gnu@cygnus> | 1991-12-07 12:16:13 +0000 |
commit | 1d0709e2a5f0eab3479845bef72a36a0ef17c314 (patch) | |
tree | 298dd8b471617faedc3a974de3bd4c3be5855e80 | |
parent | 0e0643c7a6aa4c31988d081081ec9b7f8d9a33b2 (diff) | |
download | binutils-1d0709e2a5f0eab3479845bef72a36a0ef17c314.zip binutils-1d0709e2a5f0eab3479845bef72a36a0ef17c314.tar.gz binutils-1d0709e2a5f0eab3479845bef72a36a0ef17c314.tar.bz2 |
* gmalloc.c: Fix bug that causes malloc & free to
fail on systems where pointers have the high bit set (0x800efcf0
for example). The problem is that the difference between two
pointers is a signed integer, so the computation
(char *) 0x800efcf0 - (char *) 0
yields a negative value. The sign of the result of the modulus
operator is machine dependent for negative operands, thus it is
possible for it to end up negative. From Fred Fish.
-rwxr-xr-x | gdb/gmalloc.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/gdb/gmalloc.c b/gdb/gmalloc.c index d533eaa..cfd6579 100755 --- a/gdb/gmalloc.c +++ b/gdb/gmalloc.c @@ -559,7 +559,7 @@ DEFUN(__free, (ptr), PTR ptr) prev = (struct list *) ptr; _heapinfo[block].busy.info.frag.nfree = 1; _heapinfo[block].busy.info.frag.first = (unsigned int) - (((char *) ptr - (char *) NULL) % BLOCKSIZE >> type); + (((unsigned int)((char *) ptr - (char *) NULL)) % BLOCKSIZE >> type); prev->next = _fraghead[type].next; prev->prev = &_fraghead[type]; prev->prev->next = prev; @@ -656,7 +656,7 @@ DEFUN(align, (size), size_t size) unsigned int adj; result = (*__morecore)(size); - adj = (unsigned int) ((char *) result - (char *) NULL) % BLOCKSIZE; + adj = (unsigned int) ((unsigned int)((char *) result - (char *) NULL)) % BLOCKSIZE; if (adj != 0) { adj = BLOCKSIZE - adj; @@ -770,7 +770,7 @@ DEFUN(malloc, (size), size_t size) block = BLOCK(result); if (--_heapinfo[block].busy.info.frag.nfree != 0) _heapinfo[block].busy.info.frag.first = (unsigned int) - (((char *) next->next - (char *) NULL) % BLOCKSIZE) >> log; + (((unsigned int)((char *) next->next - (char *) NULL)) % BLOCKSIZE) >> log; /* Update the statistics. */ ++_chunks_used; @@ -1145,7 +1145,7 @@ DEFUN(valloc, (size), size_t size) result = malloc(size + pagesize); if (result == NULL) return NULL; - adj = (unsigned int) ((char *) result - (char *) NULL) % pagesize; + adj = (unsigned int) ((unsigned int)((char *) result - (char *) NULL)) % pagesize; if (adj != 0) result = (char *) result + pagesize - adj; return result; |