This is the mail archive of the newlib@sources.redhat.com mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libc/stdlib/mallocr.c (unlink)


I mean circular in that you do not traverse the list
until you reach a NULL pointer as one should not exist.  The last element
will end up pointing forward to the first and vice-versa.  If there is one element,
it should point to itself and cannot be removed via unlink.

Take a look at the first() and last() operators for bins.

/* field-extraction macros */

#define first(b) ((b)->fd)
#define last(b)  ((b)->bk)

There is also a comment about the chunk list being circular:

    Chunks always begin on even word boundries, so the mem portion
    (which is returned to the user) is also on an even word boundary, and
    thus double-word aligned.

Free chunks are stored in circular doubly-linked lists, and look like this:

As Chris has pointed out, we need to understand why you are seeing a NULL
pointer in the list.  There may be a serious logic flaw occuring or something
in your program may be stepping on storage.

-- Jeff J.



Earnie Boyd wrote:
What do you mean by ``circular''? If the pointer value is capable of being zero it will SIGSEGV, on some systems, if referenced.

Earnie.

J. Johnston wrote:

Actually, you are entirely correct. I had forgotten that "both" the chunk
and bin lists were circular. The change will be reverted.


Earnie, you are going to have to do some more investigating.

-- Jeff J.

Christopher Faylor wrote:

On Tue, Feb 18, 2003 at 05:35:14PM -0500, J. Johnston wrote:

Patch checked in, thanks.




Isn't this a "why is the pointer NULL?" type of situation? It seems like
checking for null is papering over a possible problem.


cgf


------------------------------------------------------------------------


2003.02.18 Earnie Boyd <earnie at users dot sf dot net>


* libc/stdlib/mallocr.c (unlink): Don't assign a value to a pointer
with a NULL value.


Index: mallocr.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/stdlib/mallocr.c,v
retrieving revision 1.9
diff -u -3 -p -r1.9 mallocr.c
--- mallocr.c 11 Oct 2002 10:28:30 -0000 1.9
+++ mallocr.c 18 Feb 2003 21:40:05 -0000
@@ -1936,8 +1936,8 @@ static void do_check_malloced_chunk(p, s
{ \
BK = P->bk; \
FD = P->fd; \
- FD->bk = BK; \
- BK->fd = FD; \
+ if (FD) FD->bk = BK; \
+ if (BK) BK->fd = FD; \
} \


/* Place p as the last remainder */









Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]