ERROR: (gdb)
#0 0x00007ffff7a66067 in __GI_raise (sig=sig@entry=6)
at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007ffff7a67448 in __GI_abort () at abort.c:89
#2 0x00007ffff7aa41b4 in __libc_message (do_abort=do_abort@entry=1,
fmt=fmt@entry=0x7ffff7b99530 "*** Error in '%s': %s: 0x%s ***\n")
at ../sysdeps/posix/libc_fatal.c:175
#3 0x00007ffff7aa998e in malloc_printerr (action=1,
str=0x7ffff7b95646 "free(): invalid pointer", ptr=<optimized out>)
at malloc.c:4996
#4 0x00007ffff7aaa696 in _int_free (av=<optimized out>, p=<optimized out>,
have_lock=0) at malloc.c:3840
#5 0x0000000000400bb9 in free_all_filenames_array (all_files=0x605010, len=1)
at directorio.c:24
#6 0x00000000004028a0 in add_all_directory ()
#7 0x0000000000401967 in main (argc=1, argv=0x7fffffffe288) at programa.c:30
this is my function:
void free_all_filenames_array(char **all_files, int len){
int i;
for (i = 0; i<len; i++){
if(all_files[i] != NULL){
free(all_files[i]); // linea 24
all_files[i] = NULL;
}
}
if(all_files != NULL){
free(all_files);
all_files = NULL;
}
}
int read_all_filenames_array(char *path, char ***all_files, int *error){
void ** ptr;
char **nombres = NULL;
struct dirent *contenido;
char realPath[PATH_MAX];
static int num_nombres = 0;
DIR *dir = opendir(path);
if(dir == NULL){
printf(" ERROR");
free(path);
*error = errno;
closedir(dir);
return -1;
}
//
realpath(path,realPath);
while ((contenido = readdir(dir)) != NULL){
if( contenido->d_type == DT_REG){// si es regular
ptr = realloc(nombres, (num_nombres + 1) * sizeof(char *));
if (ptr == NULL){
printf("ERROR couldnt reallocate the memory");
*error = errno;
free_all_filenames_array(nombres,num_nombres);
closedir(dir);
return -1;
}
nombres = (char **)ptr;
strcat(realPath,contenido->d_name);
nombres[num_nombres] = strdup(realPath);
if(nombres[num_nombres] == NULL){
free_all_filenames_array(nombres,num_nombres + 1);
*error = errno;
closedir(dir);
return -1;
}
num_nombres++;
}
}
if (nombres != NULL){
*all_files = nombres;
free_all_filenames_array(nombres,num_nombres); // AQUI ME SUELE DAR EL ERROR
nombres = NULL;
}
else printf("Sin ficheros regulares");
*error = errno;
closedir(dir);
return num_nombres;
}