Насколько я понял, эта ошибка - не редкость.
http://www.nigma.ru/?s=malloc.c%3A3096%3A+...;t=web&sf=1
https://bugzilla.redhat.com/show_bug.cgi?id=585689
https://bugs.launchpad.net/ubuntu/+source/i...ync/+bug/541980
Что это значит, так и не понял.
Вот еще нашел ссылку:
http://bytes.com/topic/c/answers/887963-allocate-memory-heap
Там говорится о множественном освобождении, но я не понял, где там его увидели.
Вот проблемный код, ошибка происходит на первом malloc()
Ошибка происходит после очередного вызова procfs_get_process_file(), если не освобождать ее результат.
Если освобождать, количнство успешных вызовов увеличивается где-то в 1,5 раза, но происходит "Double free or corruption".
Работа не моя - просто я вовлечен в этот проект.
Код: Выделить всё
#define BUFFER_SIZE 4096
static char g_buffer[BUFFER_SIZE];
bool
procfs_get_process_file(
unsigned long long pid,
const char * filename,
char ** buffer_ptr_ptr,
size_t * size_ptr)
{
printf("\\ procfs_get_process_file\n");
int fd;
ssize_t ret;
size_t max;
char * buffer_ptr;
char * read_ptr;
size_t buffer_size;
size_t used_size;
sprintf(g_buffer, "/proc/%llu/%s", pid, filename);
printf("Get file descriptor\n");
fd = open(g_buffer, O_RDONLY);
if (fd == -1)
{
return false;
}
buffer_size = BUFFER_SIZE;
printf("Allocate buffer with size %u\n", (unsigned)buffer_size);
buffer_ptr = malloc(buffer_size);
printf("Checking, wether it is allocated\n");
if (buffer_ptr == NULL)
{
log_error("malloc failed to allocate buffer with size %zu", buffer_size);
return false;
}
unsigned iteration = 0;
used_size = 0;
read_ptr = buffer_ptr;
loop:
printf("procfs_get_process_file: loop: iteration = %u\n", iteration++);
max = buffer_size - used_size;
if (max < BUFFER_SIZE / 4)
{
buffer_size = used_size + BUFFER_SIZE;
read_ptr = realloc(buffer_ptr, buffer_size);
if (read_ptr == NULL)
{
log_error("realloc failed to allocate buffer with size %zu", buffer_size);
free(buffer_ptr);
close(fd);
return false;
}
buffer_ptr = read_ptr;
read_ptr = buffer_ptr + used_size;
max = BUFFER_SIZE;
}
ret = read(fd, read_ptr, max);
if (ret > 0)
{
ASSERT(ret <= max);
read_ptr += ret;
used_size += ret;
ASSERT(used_size <= buffer_size);
goto loop;
}
close(fd);
if (ret < 0)
{
ASSERT(ret == -1);
close(fd);
return false;
}
if (used_size == buffer_size)
{
buffer_ptr = realloc(buffer_ptr, buffer_size + 1);
if (buffer_ptr == NULL)
{
log_error("realloc failed to allocate buffer with size %zu", buffer_size + 1);
free(buffer_ptr);
return false;
}
}
buffer_ptr[buffer_size] = 0;
*buffer_ptr_ptr = buffer_ptr;
*size_ptr = used_size;
printf("/ procfs_get_process_file\n");
return true;
}