lepreau@utah-cs.UUCP (Jay Lepreau) (11/16/83)
Index: lib/libc/gen/malloc.c 4.2BSD Fix Description: 1. When RCHECK is defined, realloc needs to move the trailing RMAGIC and adjust the recorded ov_size when it uses the same block. Otherwise got false assertion failures. Spencer Thomas found this one. 2. botch() printout needs cleaning up: it used to print to stdout and w/o an fflush (so never saw it), and it needs to bracket the msg with \r\n's cause terminal state may be funny. 3. If one defined RCHECK but not debug you didn't get any checking. 4. minor lint in morecore(). (5. There seems to be some redundant code in morecore(), i.e. "can't happen" stuff, but why mess with working code?) Repeat-By: Inspection (these arose in Gosling's emacs for us). Fix: The new one is monet:~lepreau/malloc.c. Here's the diff too. *** /tmp/,RCSt1006961 Wed Nov 9 21:45:03 1983 --- malloc.c Wed Nov 9 21:43:41 1983 *************** *** 2,3 static char sccsid[] = "@(#)malloc.c 4.3 (Berkeley) 9/16/83"; #endif --- 2,5 ----- static char sccsid[] = "@(#)malloc.c 4.3 (Berkeley) 9/16/83"; + static char RCSid[] = + "$Header: malloc.c,v 1.3 83/11/09 21:42:24 lepreau Exp $"; #endif *************** *** 71,73 ! #ifdef debug #define ASSERT(p) if (!(p)) botch("p"); else --- 73,75 ----- ! #if defined(debug) || defined(RCHECK) #define ASSERT(p) if (!(p)) botch("p"); else *************** *** 73,74 #define ASSERT(p) if (!(p)) botch("p"); else static --- 75,77 ----- #define ASSERT(p) if (!(p)) botch("p"); else + #include <stdio.h> static *************** *** 78,80 ! printf("assertion botched: %s\n", s); abort(); --- 81,84 ----- ! fprintf(stderr, "\r\nassertion botched: %s\r\n", s); ! (void) fflush(stderr); /* just in case user buffered it */ abort(); *************** *** 153,156 op = (union overhead *)sbrk(0); ! if ((int)op & 0x3ff) ! sbrk(1024 - ((int)op & 0x3ff)); /* take 2k unless the block is bigger than that */ --- 157,160 ----- op = (union overhead *)sbrk(0); ! if ((int)op & 0x3ff) /* if this sbrk fails next will too */ ! (void) sbrk(1024 - ((int)op & 0x3ff)); /* take 2k unless the block is bigger than that */ *************** *** 262,264 if (was_alloced && ! nbytes <= onb && nbytes > (onb >> 1) - sizeof(*op) - RSLOP) return(cp); --- 266,273 ----- if (was_alloced && ! nbytes <= onb && nbytes > (onb >> 1) - sizeof(*op) - RSLOP) { ! #ifdef RCHECK ! if (nbytes <= 0x10000) ! op->ov_size = nbytes - 1; ! *((u_int *)((caddr_t)op + nbytes - RSLOP)) = RMAGIC; ! #endif return(cp); *************** *** 264,265 return(cp); if ((res = malloc(nbytes)) == NULL) --- 273,275 ----- return(cp); + } if ((res = malloc(nbytes)) == NULL) *************** *** 268,269 bcopy(cp, res, (nbytes < onb) ? nbytes : onb); if (was_alloced) --- 278,286 ----- bcopy(cp, res, (nbytes < onb) ? nbytes : onb); + #ifdef RCHECK + else { + if (nbytes <= 0x10000) + op->ov_size = nbytes - 1; + *((u_int *)((caddr_t)op + nbytes - RSLOP)) = RMAGIC; + } + #endif if (was_alloced)