Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/03/2008, 10:42
Leber
 
Fecha de Ingreso: marzo-2008
Mensajes: 37
Antigüedad: 16 años, 2 meses
Puntos: 0
Error con free

Buenas, estaba haciendo un programilla que buscara ficheros acabdos en ~, pero hay un problema. Primero les enganchare el codigo y luego lo comento:

Código:
void buscar(char *home,const char *destino)
{
  DIR *dirp;
  struct dirent *dir;
  int fd,i,de,ds,nbytes;
  char *duplicado;
  char *pathdest;
  char *pathhome;
  char buffer[BUFSIZ];

                        if((dirp=opendir(home))==NULL)
                          {
                            perror(home);
                            exit(-1);
                          }

            
        
          if((pathdest=(char *)calloc(80,sizeof(char)))==NULL)
                           {
                              perror("malloc");
                              exit(-1);
                           }

                         if((pathhome=(char *)calloc(80,sizeof(char)))==NULL)
                           {
                              perror("malloc home");
                              exit(-1);
                           }
                     printf("memoria reservada\n");
     
                    while((dir=readdir(dirp))!=NULL)
                      {
       
                         
                
               printf("empezando while\n");
       
                         duplicado=strdup(dir->d_name);

                            for(i=strlen(dir->d_name)-1;i>0;i--)
                               if(duplicado[i]=='~')
	                         {
                                  
	                          pathhome=(char *)realloc(pathhome,((strlen(home))+((strlen(dir->d_name)))));
                                  pathdest=(char *)realloc(pathdest,((strlen(destino))+((strlen(duplicado)))));
             
                                  
                                   sprintf(pathhome,"%s/%s",home,duplicado);
	                           sprintf(pathdest,"%s/%s",destino,duplicado);
                                   
                
                                    if((fd=creat(pathdest,0666))==-1)
         	                     {
	                              perror(pathdest);
		                      exit(-1);
		                     }
            
		                   if((de=open(pathhome,O_RDONLY))==-1)
                                     {
			              perror(pathhome);
                                      exit(-1);
		                     }
                   
		                   if((ds=open(pathdest,O_WRONLY))==-1)
		                     {
                                      perror(pathdest);
                                      exit(-1);
                                     }
                      
		                 while((nbytes=read(de,buffer,sizeof(buffer)))>0)
		                   if((write(ds,buffer,nbytes))!=nbytes)
                                   fprintf(stderr,"Error de escritura en %s\n",ds);
          
        
		                    close(de);
                                    close(ds);

		                   if((unlink(pathhome))==-1)
		                    {
                                      perror(pathhome);
                                      exit(-1);
                                    }
                        // printf("petando aqui\n");
                                      
            
	                      }
                               //printf("hola\n");
                                
                   printf("repitiendo while\n");
	           }
      printf("acabando\n");
      
  
  closedir(dirp);
  free(source);
 printf("source liberado\n");
  free(destdir);
  printf("des liberado\n");
  free(pathdest);
  printf("pathdest liberado\n");
  free(duplicado);
  printf("duplicado liberado\n");
  free(pathhome);
  printf("pathhome liberado\n"); 
  }
El error esta en free(pathhome), ya que me peta ahi, cuando libero la memoria de pathhome. Como ven primero le asigno 80 bytes al empezar el programa, luego cada vez que se encuentra un fichero acabado en ~, le reasigno la lontigud del directorio mas la del nombre del fichero, y bueno, todo va bien hasta el momento de liberar la memoria que acaba con un:

*** glibc detected *** ./backups: free(): invalid next size (fast): 0x0804c0c8 ***
======= Backtrace: =========
/lib/i686/cmov/libc.so.6[0xb7e9b915]
/lib/i686/cmov/libc.so.6(cfree+0x90)[0xb7e9f380]
./backups[0x8049092]
./backups[0x8048cb0]
/lib/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7e46450]
./backups[0x80487f1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:06 639238 /home/null/mis_programas/backups
0804a000-0804b000 rw-p 00001000 08:06 639238 /home/null/mis_programas/backups
0804b000-0806c000 rw-p 0804b000 00:00 0 [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0
b7d21000-b7e00000 ---p b7d21000 00:00 0
b7e15000-b7e21000 r-xp 00000000 08:02 354860 /lib/libgcc_s.so.1
b7e21000-b7e22000 rw-p 0000b000 08:02 354860 /lib/libgcc_s.so.1
b7e2f000-b7e30000 rw-p b7e2f000 00:00 0
b7e30000-b7f77000 r-xp 00000000 08:02 370991 /lib/i686/cmov/libc-2.7.so
b7f77000-b7f78000 r--p 00147000 08:02 370991 /lib/i686/cmov/libc-2.7.so
b7f78000-b7f7a000 rw-p 00148000 08:02 370991 /lib/i686/cmov/libc-2.7.so
b7f7a000-b7f7d000 rw-p b7f7a000 00:00 0
b7f89000-b7f8c000 rw-p b7f89000 00:00 0
b7f8c000-b7fa8000 r-xp 00000000 08:02 354818 /lib/ld-2.7.so
b7fa8000-b7faa000 rw-p 0001b000 08:02 354818 /lib/ld-2.7.so
bfb95000-bfbaa000 rw-p bfb95000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
Abortado


El error es : " free(): invalid next size (fast): 0x0804c0c8", y como ven todo va bien hasta que se intenta liberar su memoria:

acabando
source liberado
des liberado
pathdest liberado
duplicado liberado


Peta ahi. La verdad no se que estoy haciendo mal, si alguien pudiera ayudarme... se lo agradeceria mucho.

Gracias de antemano