sisoputnfrba / foro

Foro de consultas para el trabajo práctico
148 stars 6 forks source link

Valgrind Memory leak string_from_format de las commons #4201

Closed SantiagoDopazo closed 1 month ago

SantiagoDopazo commented 1 month ago

Estamos teniendo un problema con la funcion string_from_format de las commons lo usamos para generar los path en el FS pero creemos liberarlo cuando hacemos free(path) pero valgrind nos dice que lo estamos perdiendo .

en esta funcion al usar char* path=obtenerInfoDeArchivo(nombre,&bloqueInicial,&tamanioEnbytes);

  char* nombre =peticion->nombreArchivo;
    DIR *dir=opendir(interfaz_DialFS.pathBaseDialfs);
    struct dirent *entry;
    while ((entry = readdir(dir)) != NULL)
    {
        if(strcmp(entry->d_name,nombre)==0){
            off_t bloqueInicial;
            int tamanioEnbytes;
            char* path=obtenerInfoDeArchivo(nombre,&bloqueInicial,&tamanioEnbytes);

            int cantBloques=(tamanioEnbytes/interfaz_DialFS.blockSize)+1;
            int bloqueFinal=cantBloques+bloqueInicial;
            for(;bloqueInicial<bloqueFinal;bloqueInicial++){
                liberarBloque(bloqueInicial);
            }

            remove(path);

            log_info(loggerIO,"PID: %d - Eliminar Archivo: %s",peticion->PID,nombre);
            closedir(dir);
            terminoEjecucionInterfaz(interfaz_DialFS.nombre,peticion->PID);
            free(path);
            return;
        }
    }
    log_info(loggerIO,"No existe el archivo en el FS");
    closedir(dir);
    avisarErrorAKernel(interfaz_DialFS.nombre,peticion->PID);

Implementacion de obtenerInfoArchivo:

char* obtenerInfoDeArchivo(char* nombreArchivo,off_t* offset,int* tamanioEnBytes){
    char* path= generarPathAArchivoFS(nombreArchivo);
    t_config* archivo=config_create(path);
    if(offset!=NULL){obtenerInfoDeArchivoOffset(nombreArchivo,offset);}
    if(tamanioEnBytes!=NULL){obtenerInfoDeArchivoTamanio(nombreArchivo,tamanioEnBytes);}
    config_destroy(archivo);
    return path;
}
void obtenerInfoDeArchivoOffset(char* nombreArchivo,off_t* offset){
    char* path= generarPathAArchivoFS(nombreArchivo);
    t_config* archivo=config_create(path);
    *offset = config_get_long_value(archivo,"BLOQUE_INICIAL");
    config_destroy(archivo);
}
void obtenerInfoDeArchivoTamanio(char* nombreArchivo,int* tamanioEnBytes){
    char* path= generarPathAArchivoFS(nombreArchivo);
    t_config* archivo=config_create(path);
    *tamanioEnBytes = config_get_int_value(archivo,"TAMANIO_ARCHIVO");
    config_destroy(archivo);
}

implementacion generarPathAArchivoFS:

char* generarPathAArchivoFS(char* nombreArchivo){
    char* aDevolver =NULL;
    aDevolver=string_from_format("%s%s",interfaz_DialFS.pathBaseDialfs,nombreArchivo);
    return aDevolver;
}

Lo corremos con valgrind y nos da esto :

==42245== 29 bytes in 1 blocks are definitely lost in loss record 16 of 22
==42245==    at 0x484DCD3: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==42245==    by 0x486F64B: string_append (in /usr/lib/libcommons.so)
==42245==    by 0x4870461: _string_append_with_format_list (in /usr/lib/libcommons.so)
==42245==    by 0x486F83F: string_from_vformat (in /usr/lib/libcommons.so)
==42245==    by 0x486F7D0: string_from_format (in /usr/lib/libcommons.so)
==42245==    by 0x10ECEA: generarPathAArchivoFS (interfazDialFS.c:801)
==42245==    by 0x10E061: obtenerInfoDeArchivoOffset (interfazDialFS.c:562)
==42245==    by 0x10E015: obtenerInfoDeArchivo (interfazDialFS.c:556)
==42245==    by 0x10CD5C: borrarFile (interfazDialFS.c:213)
==42245==    by 0x10C75F: EJECUTAR_INTERFAZ_DialFS (interfazDialFS.c:111)
==42245==    by 0x10C267: manejo_interfaz_DialFS (interfazDialFS.c:27)
==42245==    by 0x490AAC2: start_thread (pthread_create.c:442)
LeandroCarbajales commented 1 month ago

Buenas! Por lo que veo que marca el stacktrace de Valgrind, el "path" que se está perdiendo es el que se crea cuando llaman a obtenerInfoDeArchivoOffset el cual nunca se libera, el path que se termina liberando es el original que se había creado en la función anterior obtenerInfoDeArchivo. Si estoy en lo correcto, es probable que Valgrind marque otro "definitely lost" similar pero de la función obtenerInfoDeArchivoTamanio

RaniAgus commented 1 month ago

¡Buenas @SantiagoDopazo! ¿Pudieron revisar lo que les comentó Lean? Saludos

RaniAgus commented 1 month ago

¡Buenas! Cierro el issue por inactividad, si les quedó alguna duda pueden abrir uno nuevo referenciando éste. Saludos