Browse Source

Pointer cleaning. ok ian@, tedu@, krw@

OPENBSD_3_4
tdeval 21 years ago
parent
commit
0106adef12
1 changed files with 67 additions and 66 deletions
  1. +67
    -66
      src/lib/libc/stdlib/malloc.c

+ 67
- 66
src/lib/libc/stdlib/malloc.c View File

@ -8,7 +8,7 @@
*/ */
#if defined(LIBC_SCCS) && !defined(lint) #if defined(LIBC_SCCS) && !defined(lint)
static char rcsid[] = "$OpenBSD: malloc.c,v 1.54 2003/01/14 02:27:16 millert Exp $";
static char rcsid[] = "$OpenBSD: malloc.c,v 1.55 2003/05/14 15:41:51 tdeval Exp $";
#endif /* LIBC_SCCS and not lint */ #endif /* LIBC_SCCS and not lint */
/* /*
@ -237,7 +237,7 @@ static char *malloc_func;
/* Macro for mmap */ /* Macro for mmap */
#define MMAP(size) \ #define MMAP(size) \
mmap((void *)0, (size), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, \ mmap((void *)0, (size), PROT_READ|PROT_WRITE, MAP_ANON|MAP_PRIVATE, \
MMAP_FD, (off_t)0);
MMAP_FD, (off_t)0)
/* /*
* Necessary function declarations * Necessary function declarations
@ -363,7 +363,7 @@ malloc_exit()
{ {
FILE *fd = fopen("malloc.out", "a"); FILE *fd = fopen("malloc.out", "a");
char *q = "malloc() warning: Couldn't dump stats.\n"; char *q = "malloc() warning: Couldn't dump stats.\n";
if (fd) {
if (fd != NULL) {
malloc_dump(fd); malloc_dump(fd);
fclose(fd); fclose(fd);
} else } else
@ -387,24 +387,24 @@ map_pages(pages)
#ifdef MALLOC_EXTRA_SANITY #ifdef MALLOC_EXTRA_SANITY
wrterror("(ES): overflow in map_pages fails\n"); wrterror("(ES): overflow in map_pages fails\n");
#endif /* MALLOC_EXTRA_SANITY */ #endif /* MALLOC_EXTRA_SANITY */
return 0;
return (NULL);
} }
tail = result + pages; tail = result + pages;
if (brk(tail)) {
if ((int)brk(tail) == -1) {
#ifdef MALLOC_EXTRA_SANITY #ifdef MALLOC_EXTRA_SANITY
wrterror("(ES): map_pages fails\n"); wrterror("(ES): map_pages fails\n");
#endif /* MALLOC_EXTRA_SANITY */ #endif /* MALLOC_EXTRA_SANITY */
return 0;
return (NULL);
} }
last_index = ptr2index(tail) - 1; last_index = ptr2index(tail) - 1;
malloc_brk = tail; malloc_brk = tail;
if ((last_index+1) >= malloc_ninfo && !extend_pgdir(last_index))
return 0;
if ((last_index+1) >= malloc_ninfo && extend_pgdir(last_index) == NULL)
return (NULL);
return result;
return (result);
} }
/* /*
@ -443,7 +443,7 @@ extend_pgdir(index)
/* Get new pages */ /* Get new pages */
new = (struct pginfo**) MMAP(i * malloc_pagesize); new = (struct pginfo**) MMAP(i * malloc_pagesize);
if (new == MAP_FAILED) if (new == MAP_FAILED)
return 0;
return (0);
/* Copy the old stuff */ /* Copy the old stuff */
memcpy(new, page_dir, memcpy(new, page_dir,
@ -458,7 +458,7 @@ extend_pgdir(index)
/* Now free the old stuff */ /* Now free the old stuff */
munmap(old, oldlen); munmap(old, oldlen);
return 1;
return (1);
} }
/* /*
@ -494,7 +494,7 @@ malloc_init ()
} else if (i == 2) { } else if (i == 2) {
p = malloc_options; p = malloc_options;
} }
for (; p && *p; p++) {
for (; p != NULL && *p != '\0'; p++) {
switch (*p) { switch (*p) {
case '>': malloc_cache <<= 1; break; case '>': malloc_cache <<= 1; break;
case '<': malloc_cache >>= 1; break; case '<': malloc_cache >>= 1; break;
@ -586,14 +586,14 @@ static void *
malloc_pages(size) malloc_pages(size)
size_t size; size_t size;
{ {
void *p, *delay_free = 0;
void *p, *delay_free = NULL;
int i; int i;
struct pgfree *pf; struct pgfree *pf;
u_long index; u_long index;
size = pageround(size); size = pageround(size);
p = 0;
p = NULL;
/* Look for free pages before asking for more */ /* Look for free pages before asking for more */
for(pf = free_list.next; pf; pf = pf->next) { for(pf = free_list.next; pf; pf = pf->next) {
@ -619,7 +619,7 @@ malloc_pages(size)
if (pf->size == size) { if (pf->size == size) {
p = pf->page; p = pf->page;
if (pf->next)
if (pf->next != NULL)
pf->next->prev = pf->prev; pf->next->prev = pf->prev;
pf->prev->next = pf->next; pf->prev->next = pf->next;
delay_free = pf; delay_free = pf;
@ -633,17 +633,17 @@ malloc_pages(size)
} }
#ifdef MALLOC_EXTRA_SANITY #ifdef MALLOC_EXTRA_SANITY
if (p && page_dir[ptr2index(p)] != MALLOC_FREE)
if (p != NULL && page_dir[ptr2index(p)] != MALLOC_FREE)
wrterror("(ES): allocated non-free page on free-list\n"); wrterror("(ES): allocated non-free page on free-list\n");
#endif /* MALLOC_EXTRA_SANITY */ #endif /* MALLOC_EXTRA_SANITY */
size >>= malloc_pageshift; size >>= malloc_pageshift;
/* Map new pages */ /* Map new pages */
if (!p)
if (p == NULL)
p = map_pages(size); p = map_pages(size);
if (p) {
if (p != NULL) {
index = ptr2index(p); index = ptr2index(p);
page_dir[index] = MALLOC_FIRST; page_dir[index] = MALLOC_FIRST;
@ -655,13 +655,13 @@ malloc_pages(size)
} }
if (delay_free) { if (delay_free) {
if (!px)
if (px == NULL)
px = delay_free; px = delay_free;
else else
ifree(delay_free); ifree(delay_free);
} }
return p;
return (p);
} }
/* /*
@ -678,8 +678,8 @@ malloc_make_chunks(bits)
/* Allocate a new bucket */ /* Allocate a new bucket */
pp = malloc_pages((size_t)malloc_pagesize); pp = malloc_pages((size_t)malloc_pagesize);
if (!pp)
return 0;
if (pp == NULL)
return (0);
/* Find length of admin structure */ /* Find length of admin structure */
l = sizeof *bp - sizeof(u_long); l = sizeof *bp - sizeof(u_long);
@ -697,9 +697,9 @@ malloc_make_chunks(bits)
bp = (struct pginfo *)pp; bp = (struct pginfo *)pp;
} else { } else {
bp = (struct pginfo *)imalloc(l); bp = (struct pginfo *)imalloc(l);
if (!bp) {
if (bp == NULL) {
ifree(pp); ifree(pp);
return 0;
return (0);
} }
} }
@ -718,7 +718,7 @@ malloc_make_chunks(bits)
if (k < 0) { if (k < 0) {
ifree(pp); ifree(pp);
ifree(bp); ifree(bp);
return 0;
return (0);
} }
} else { } else {
bp->size = (1UL<<bits); bp->size = (1UL<<bits);
@ -757,7 +757,7 @@ malloc_make_chunks(bits)
/* MALLOC_UNLOCK */ /* MALLOC_UNLOCK */
return 1;
return (1);
} }
/* /*
@ -789,8 +789,8 @@ malloc_bytes(size)
} }
/* If it's empty, make a page more of that size chunks */ /* If it's empty, make a page more of that size chunks */
if (!page_dir[j] && !malloc_make_chunks(j))
return 0;
if (page_dir[j] == NULL && malloc_make_chunks(j) == NULL)
return (NULL);
bp = page_dir[j]; bp = page_dir[j];
@ -810,7 +810,7 @@ malloc_bytes(size)
/* If there are no more free, remove from free-list */ /* If there are no more free, remove from free-list */
if (!--bp->free) { if (!--bp->free) {
page_dir[j] = bp->next; page_dir[j] = bp->next;
bp->next = 0;
bp->next = NULL;
} }
/* Adjust to the real offset of that chunk */ /* Adjust to the real offset of that chunk */
@ -820,7 +820,7 @@ malloc_bytes(size)
if (malloc_junk && bp->size != 0) if (malloc_junk && bp->size != 0)
memset((char *)bp->page + k, SOME_JUNK, bp->size); memset((char *)bp->page + k, SOME_JUNK, bp->size);
return (u_char *)bp->page + k;
return ((u_char *)bp->page + k);
} }
/* /*
@ -839,19 +839,19 @@ imalloc(size)
abort(); abort();
if ((size + malloc_pagesize) < size) /* Check for overflow */ if ((size + malloc_pagesize) < size) /* Check for overflow */
result = 0;
result = NULL;
else if (size <= malloc_maxsize) else if (size <= malloc_maxsize)
result = malloc_bytes(size); result = malloc_bytes(size);
else else
result = malloc_pages(size); result = malloc_pages(size);
if (malloc_abort && !result)
if (malloc_abort && result == NULL)
wrterror("allocation failed.\n"); wrterror("allocation failed.\n");
if (malloc_zero && result)
if (malloc_zero && result != NULL)
memset(result, 0, size); memset(result, 0, size);
return result;
return (result);
} }
/* /*
@ -872,19 +872,19 @@ irealloc(ptr, size)
if (!malloc_started) { if (!malloc_started) {
wrtwarning("malloc() has never been called.\n"); wrtwarning("malloc() has never been called.\n");
return 0;
return (NULL);
} }
index = ptr2index(ptr); index = ptr2index(ptr);
if (index < malloc_pageshift) { if (index < malloc_pageshift) {
wrtwarning("junk pointer, too low to make sense.\n"); wrtwarning("junk pointer, too low to make sense.\n");
return 0;
return (NULL);
} }
if (index > last_index) { if (index > last_index) {
wrtwarning("junk pointer, too high to make sense.\n"); wrtwarning("junk pointer, too high to make sense.\n");
return 0;
return (NULL);
} }
mp = &page_dir[index]; mp = &page_dir[index];
@ -894,11 +894,11 @@ irealloc(ptr, size)
/* Check the pointer */ /* Check the pointer */
if ((u_long)ptr & malloc_pagemask) { if ((u_long)ptr & malloc_pagemask) {
wrtwarning("modified (page-) pointer.\n"); wrtwarning("modified (page-) pointer.\n");
return 0;
return (NULL);
} }
/* Find the size in bytes */ /* Find the size in bytes */
for (osize = malloc_pagesize; *++mp == MALLOC_FOLLOW;)
for (osize = malloc_pagesize; *(++mp) == MALLOC_FOLLOW;)
osize += malloc_pagesize; osize += malloc_pagesize;
if (!malloc_realloc && /* Unless we have to, */ if (!malloc_realloc && /* Unless we have to, */
@ -906,7 +906,7 @@ irealloc(ptr, size)
size > (osize - malloc_pagesize)) { /* .. or can free a page, */ size > (osize - malloc_pagesize)) { /* .. or can free a page, */
if (malloc_junk) if (malloc_junk)
memset((char *)ptr + size, SOME_JUNK, osize-size); memset((char *)ptr + size, SOME_JUNK, osize-size);
return ptr; /* ..don't do anything else. */
return (ptr); /* ..don't do anything else. */
} }
} else if (*mp >= MALLOC_MAGIC) { /* Chunk allocation */ } else if (*mp >= MALLOC_MAGIC) { /* Chunk allocation */
@ -914,7 +914,7 @@ irealloc(ptr, size)
/* Check the pointer for sane values */ /* Check the pointer for sane values */
if ((u_long)ptr & ((1UL<<((*mp)->shift))-1)) { if ((u_long)ptr & ((1UL<<((*mp)->shift))-1)) {
wrtwarning("modified (chunk-) pointer.\n"); wrtwarning("modified (chunk-) pointer.\n");
return 0;
return (NULL);
} }
/* Find the chunk index in the page */ /* Find the chunk index in the page */
@ -923,7 +923,7 @@ irealloc(ptr, size)
/* Verify that it isn't a free chunk already */ /* Verify that it isn't a free chunk already */
if ((*mp)->bits[i/MALLOC_BITS] & (1UL<<(i%MALLOC_BITS))) { if ((*mp)->bits[i/MALLOC_BITS] & (1UL<<(i%MALLOC_BITS))) {
wrtwarning("chunk is already free.\n"); wrtwarning("chunk is already free.\n");
return 0;
return (NULL);
} }
osize = (*mp)->size; osize = (*mp)->size;
@ -934,17 +934,17 @@ irealloc(ptr, size)
osize == malloc_minsize)) { /* ..(if there is one) */ osize == malloc_minsize)) { /* ..(if there is one) */
if (malloc_junk) if (malloc_junk)
memset((char *)ptr + size, SOME_JUNK, osize-size); memset((char *)ptr + size, SOME_JUNK, osize-size);
return ptr; /* ..don't do anything else. */
return (ptr); /* ..don't do anything else. */
} }
} else { } else {
wrtwarning("pointer to wrong page.\n"); wrtwarning("pointer to wrong page.\n");
return 0;
return (NULL);
} }
p = imalloc(size); p = imalloc(size);
if (p) {
if (p != NULL) {
/* copy the lesser of the two sizes, and free the old one */ /* copy the lesser of the two sizes, and free the old one */
/* Don't move from/to 0 sized region !!! */ /* Don't move from/to 0 sized region !!! */
if (osize != 0 && size != 0) { if (osize != 0 && size != 0) {
@ -955,7 +955,7 @@ irealloc(ptr, size)
} }
ifree(ptr); ifree(ptr);
} }
return p;
return (p);
} }
/* /*
@ -969,7 +969,7 @@ free_pages(ptr, index, info)
struct pginfo *info; struct pginfo *info;
{ {
int i; int i;
struct pgfree *pf, *pt=0;
struct pgfree *pf, *pt=NULL;
u_long l; u_long l;
void *tail; void *tail;
@ -1006,26 +1006,27 @@ free_pages(ptr, index, info)
tail = (char *)ptr+l; tail = (char *)ptr+l;
/* add to free-list */ /* add to free-list */
if (!px)
if (px == NULL)
px = imalloc(sizeof *px); /* This cannot fail... */ px = imalloc(sizeof *px); /* This cannot fail... */
px->page = ptr; px->page = ptr;
px->end = tail; px->end = tail;
px->size = l; px->size = l;
if (!free_list.next) {
if (free_list.next == NULL) {
/* Nothing on free list, put this at head */ /* Nothing on free list, put this at head */
px->next = free_list.next; px->next = free_list.next;
px->prev = &free_list; px->prev = &free_list;
free_list.next = px; free_list.next = px;
pf = px; pf = px;
px = 0;
px = NULL;
} else { } else {
/* Find the right spot, leave pf pointing to the modified entry. */ /* Find the right spot, leave pf pointing to the modified entry. */
tail = (char *)ptr+l;
for(pf = free_list.next; pf->end < ptr && pf->next; pf = pf->next)
for(pf = free_list.next; pf->end < ptr && pf->next != NULL;
pf = pf->next)
; /* Race ahead here */ ; /* Race ahead here */
if (pf->page > tail) { if (pf->page > tail) {
@ -1035,38 +1036,38 @@ free_pages(ptr, index, info)
pf->prev = px; pf->prev = px;
px->prev->next = px; px->prev->next = px;
pf = px; pf = px;
px = 0;
px = NULL;
} else if (pf->end == ptr ) { } else if (pf->end == ptr ) {
/* Append to the previous entry */ /* Append to the previous entry */
pf->end = (char *)pf->end + l; pf->end = (char *)pf->end + l;
pf->size += l; pf->size += l;
if (pf->next && pf->end == pf->next->page ) {
if (pf->next != NULL && pf->end == pf->next->page ) {
/* And collapse the next too. */ /* And collapse the next too. */
pt = pf->next; pt = pf->next;
pf->end = pt->end; pf->end = pt->end;
pf->size += pt->size; pf->size += pt->size;
pf->next = pt->next; pf->next = pt->next;
if (pf->next)
if (pf->next != NULL)
pf->next->prev = pf; pf->next->prev = pf;
} }
} else if (pf->page == tail) { } else if (pf->page == tail) {
/* Prepend to entry */ /* Prepend to entry */
pf->size += l; pf->size += l;
pf->page = ptr; pf->page = ptr;
} else if (!pf->next) {
} else if (pf->next == NULL) {
/* Append at tail of chain */ /* Append at tail of chain */
px->next = 0;
px->next = NULL;
px->prev = pf; px->prev = pf;
pf->next = px; pf->next = px;
pf = px; pf = px;
px = 0;
px = NULL;
} else { } else {
wrterror("freelist is destroyed.\n"); wrterror("freelist is destroyed.\n");
} }
} }
/* Return something to OS ? */ /* Return something to OS ? */
if (!pf->next && /* If we're the last one, */
if (pf->next == NULL && /* If we're the last one, */
pf->size > malloc_cache && /* ..and the cache is full, */ pf->size > malloc_cache && /* ..and the cache is full, */
pf->end == malloc_brk && /* ..and none behind us, */ pf->end == malloc_brk && /* ..and none behind us, */
malloc_brk == sbrk(0)) { /* ..and it's OK to do... */ malloc_brk == sbrk(0)) { /* ..and it's OK to do... */
@ -1090,7 +1091,7 @@ free_pages(ptr, index, info)
/* XXX: We could realloc/shrink the pagedir here I guess. */ /* XXX: We could realloc/shrink the pagedir here I guess. */
} }
if (pt)
if (pt != NULL)
ifree(pt); ifree(pt);
} }
@ -1181,7 +1182,7 @@ ifree(ptr)
int index; int index;
/* This is legal */ /* This is legal */
if (!ptr)
if (ptr == NULL)
return; return;
if (!malloc_started) { if (!malloc_started) {
@ -1231,13 +1232,13 @@ malloc(size_t size)
wrtwarning("recursive call.\n"); wrtwarning("recursive call.\n");
malloc_active--; malloc_active--;
_MALLOC_UNLOCK(); _MALLOC_UNLOCK();
return (0);
return (NULL);
} }
r = imalloc(size); r = imalloc(size);
UTRACE(0, size, r); UTRACE(0, size, r);
malloc_active--; malloc_active--;
_MALLOC_UNLOCK(); _MALLOC_UNLOCK();
if (malloc_xmalloc && !r)
if (malloc_xmalloc && r == NULL)
wrterror("out of memory.\n"); wrterror("out of memory.\n");
return (r); return (r);
} }
@ -1271,9 +1272,9 @@ realloc(void *ptr, size_t size)
wrtwarning("recursive call.\n"); wrtwarning("recursive call.\n");
malloc_active--; malloc_active--;
_MALLOC_UNLOCK(); _MALLOC_UNLOCK();
return (0);
return (NULL);
} }
if (!ptr) {
if (ptr == NULL) {
r = imalloc(size); r = imalloc(size);
} else { } else {
r = irealloc(ptr, size); r = irealloc(ptr, size);
@ -1281,7 +1282,7 @@ realloc(void *ptr, size_t size)
UTRACE(ptr, size, r); UTRACE(ptr, size, r);
malloc_active--; malloc_active--;
_MALLOC_UNLOCK(); _MALLOC_UNLOCK();
if (malloc_xmalloc && !r)
if (malloc_xmalloc && r == NULL)
wrterror("out of memory.\n"); wrterror("out of memory.\n");
return (r); return (r);
} }

Loading…
Cancel
Save