Subject: Re: sbrk(0) dumps a core??
To: Emmanuel Dreyfus <p99dreyf@criens.u-psud.fr>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: tech-userlevel
Date: 03/04/2001 02:34:12
>> Whoa Nelly!  You've just set the break to 0x4000; if you have any
>> data segment above that, it just went poof.
> Ok, [...].  [T]his still crashes, why?
[irrelevant lines snipped -dM]

>         end = sbrk (0);
>         printf ("end=0x%lx\n", (long)end);
>                 newend = (void*)((long)end + 4000);
>         end = sbrk (0);
>         printf ("end=0x%lx\n", (long)end);
>         res = brk (newend);
>         printf ("brk(0x%lx) returned %d\n", (long)newend, res);

(Well, you *should* be using %p and casting to void *, rather than %lx
and casting to long, but I don't think NetBSD currently runs on a
machine where the difference will bite you, and for machine-specific
debugging code this isn't really an issue...except that getting into
bad habits tends to lead to using them even when it *does* matter.)

> Ouput:
> end=0x1840e68
> new_end=0x1841e08
> end=0x1852000
> Memory fault (core dumped) 

> Is it that printf caused some allocation, hence a end move, and that
> I'm calling brk with and adress which is lower than end?

Yes.  Look at the value returned by sbrk(0) after the printf and before
you brk(): it was 0x1840e68 and then it moved to 1852000.  You then
brk() it back down to 1841e08, and all the memory between there and
1852000 goes poof.

Why are you adding a value to the break and using brk, anyway, rather
than just using sbrk?  It sure looks to me as though what you're trying
to do is a perfect match to sbrk()'s semantics.

					der Mouse

			       mouse@rodents.montreal.qc.ca
		     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B