Search code examples
memory-managementglibc

What does 'corrupted double-linked list' mean


I've recently gotten the following error from my PHP:

WARNING: [pool www] child 42475 said into stderr: "*** glibc detected *** php-fpm: pool www: corrupted double-linked list: 0x00000000013fe680 ***"

I'm not very bothered by this issue, and not very interested in fixing it. But I'm very interested in understanding what this error 'corrupted double-linked list' actually means, because I haven't seen it before. I believe to know what a double-linked list is, but I failed to produce a program that triggers this error.

Could somebody provide me a short snippet of code that causes the glibc to say 'corrupted double-linked list' when I compile and execute it?


Solution

  • I have found the answer to my question myself:)

    So what I didn't understand was how the glibc could differentiate between a Segfault and a corrupted double-linked list, because according to my understanding, from perspective of glibc they should look like the same thing. Because if I implement a double-linked list inside my program, how could the glibc possibly know that this is a double-linked list, instead of any other struct? It probably can't, so thats why i was confused.

    Now I've looked at malloc/malloc.c inside the glibc's code, and I see the following:

    1543 /* Take a chunk off a bin list */
    1544 #define unlink(P, BK, FD) {                                            \
    1545   FD = P->fd;                                                          \
    1546   BK = P->bk;                                                          \
    1547   if (__builtin_expect (FD->bk != P || BK->fd != P, 0))                \
    1548     malloc_printerr (check_action, "corrupted double-linked list", P); \
    1549   else {                                                               \
    1550     FD->bk = BK;                                                       \
    1551     BK->fd = FD;                                                       \
    

    So now this suddenly makes sense. The reason why glibc can know that this is a double-linked list is because the list is part of glibc itself. I've been confused because I thought glibc can somehow detect that some programming is building a double-linked list, which I wouldn't understand how that works. But if this double-linked list that it is talking about, is part of glibc itself, of course it can know it's a double-linked list.

    I still don't know what has triggered this error. But at least I understand the difference between corrupted double-linked list and a Segfault, and how the glibc can know this struct is supposed to be a double-linked list:)