Any idea why I’m getting the error, realloc(): invalid next size ?
while (loc) {
char nextLine[MAX_PATH_LEN + 30];
sprintf(nextLine, "<p>%s:%d</p>", loc->item.pathname,
loc->item.offset);
DPRINTF('h', ("Next line is: %s, length: %d\n", nextLine, strlen(nextLine))\
);
DPRINTF('h', ("spaceUsedUp is %d\n", spaceUsedUp));
while (spaceUsedUp + strlen(nextLine) > allocatedSize) {
printf("Allocated size is now %d\n", allocatedSize);
allocatedSize *= 2;
}
DPRINTF('h', ("Will realloc size %d\n", allocatedSize));
char *tmp = (char *)realloc(result, allocatedSize);
DPRINTF('h', ("Done with the realloc.\n"));
fflush(stdout);
if (tmp == NULL) {
perror("realloc");
}
result = tmp;
tmp = NULL;
int theOne = (spaceUsedUp == 0) ? 0 : 1;
memcpy(result+spaceUsedUp-theOne, nextLine, sizeof(nextLine));
spaceUsedUp += strlen(nextLine) - theOne;
loc = loc->nextLocation;
}
The output is:
Next line is: <p>/dirA/f3:6162</p>, length: 20
spaceUsedUp is 0
Will realloc size 100
Done with the realloc.
Next line is: <p>/dirA/f3:6038</p>, length: 20
spaceUsedUp is 19
Will realloc size 100
*** glibc detected *** ./proj3/disksearch: realloc(): invalid next size: 0x0000000001797fa0 ***
It’s because you memcpy sizeof(nextLine) bytes, clobbering outside the memory you have allocated. Instead of sizeof(nextLine) you should use strlen(nextLine) and things should be fine.
Realloc errors like this generally indicate that the memory heap has been corrupted, which usually occurs because of out-of-bounds writes or reusing freed pointers.
Valgrind is your friend for problems like these.