Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: caronte en Octubre 25, 2014, 05:40:47 pm

Título: Punteros y strtok
Publicado por: caronte en Octubre 25, 2014, 05:40:47 pm
Hola a todos

Estoy usando unos punteros  en una funcion strtok ej. ( ptr=strtok( cadena,"tok");
a los que previamente les he dado tamaño con malloc.
El caso es que a la hora de liberarlos (free( ptr); ) me dan errores del tipo de "double free" o invalid pointer...
trabajo con mas punteros en ese codigo y solo fallan los que uso con strtok.

Alguien sabe por que??

Ggracias de antemano.
Título: Re:Punteros y strtok
Publicado por: C_printfer en Octubre 25, 2014, 07:24:34 pm
Pufff, pues no sabía de esa función hasta que la acabo de buscar en Google, si nos pasas parte del código en la que declares los punteros, trabajes con ellos y los liberes igual te podemos echar una mano.


S2!
Título: Re:Punteros y strtok
Publicado por: caronte en Octubre 25, 2014, 07:45:17 pm
Código: C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <fcntl.h>
  6. #include <sys/stat.h>
  7.  
  8. void *aloja_memoria(unsigned int cantidad);
  9. void selecciona(char *archivo);
  10.  
  11. int main()
  12. {
  13.         selecciona("lista");
  14. return 0;
  15. }
  16.  
  17. void selecciona(char *archivo)
  18. {
  19.         int fd,l;
  20.         char r;
  21.         char *linea, *r2, *ip, *puerto;
  22.         linea = (char *) aloja_memoria(200);
  23.         r2=(char *) aloja_memoria(10);
  24.         ip = (char *) aloja_memoria(100);
  25.         puerto = (char *) aloja_memoria(50);
  26.         r2[1]='\0';
  27.         fd=open(archivo,O_RDONLY);
  28.         if (fd==-1)
  29.                 printf("[!] ERROR ABRIENDO ARCHIVO: %s", archivo);
  30.         l=read(fd ,&r, sizeof(r));
  31.         if(l==-1)
  32.                 printf("[!] ERROR AL INTENTAR LEER ARCHIVO: %s", archivo);
  33.         while(l!=0)
  34.         {
  35.                 if(r=='\n')
  36.                 {
  37.                         printf("%s\n",linea);
  38.                         ip=strtok(linea,":");
  39.                         puerto=strtok(NULL,"\t");
  40.                         printf("ip: %s\n",ip);
  41.                         printf("puerto: %s\n",puerto);
  42.                         memset(linea,'\0', strlen (linea));
  43.                 }
  44.                 r2[0]=r;
  45.                 strcat(linea,r2);
  46.                 l=read(fd ,&r, sizeof(r));
  47.         }
  48.         free(linea);
  49.         free(r2);
  50.         free(ip);
  51.         free(puerto);
  52.         close(fd);
  53. }
  54. //-------------------MALLOC-------------------------
  55. void *aloja_memoria(unsigned int cantidad)
  56. {
  57.         void *ptr;
  58.         ptr=malloc(cantidad);
  59.         if (ptr== NULL)
  60.                 printf("[!] ERROR ALOJANDO MEMORIA!");
  61.         return ptr;
  62. }
Título: Re:Punteros y strtok
Publicado por: C_printfer en Octubre 26, 2014, 08:23:39 pm
Lo que no entiendo es para qué reservas memoria con malloc si en el momento de compilación del programa conoces los tamaños que van a tener tus variables.

Por ejemplo, ¿qué es lo que pretendes almacenar en la variable linea?
Título: Re:Punteros y strtok
Publicado por: caronte en Octubre 26, 2014, 09:28:13 pm
....pues eso, una línea de un archivo, que a posteriori trocearé con strtok en busca de una ip y un puerto.

Uso malloc por antojo. Por trabajar con esa función y ver como se comporta, adquirir soltura, etc.
Título: Re:Punteros y strtok
Publicado por: ravenheart en Octubre 27, 2014, 07:58:33 am
Aquí estás reservando memoria con malloc:
Código: C
  1.         linea = (char *) aloja_memoria(200);
  2.         r2=(char *) aloja_memoria(10);
  3.         ip = (char *) aloja_memoria(100);
  4.         puerto = (char *) aloja_memoria(50);
  5.  

Pero aquí estás machacando las variables, perdiendo la memoria que tenías reservada:
Código: C
  1.                         ip=strtok(linea,":");
  2.                         puerto=strtok(NULL,"\t");
  3.  

Por eso al intentar liberarlas te da error.
Título: Re:Punteros y strtok
Publicado por: C_printfer en Octubre 27, 2014, 11:00:33 pm
Como pilota el amigo Raven jejeje, menos mal que lo sabía él jeje. De todos modos, que quede claro que no es necesario malloc en ese caso, si es por practicar vale  :P

Gracias Ravenheart por la aclaración.

Un saludo.
Título: Re:Punteros y strtok
Publicado por: caronte en Octubre 28, 2014, 06:28:49 pm
Aquí estás reservando memoria con malloc:
Código: C
  1.         linea = (char *) aloja_memoria(200);
  2.         r2=(char *) aloja_memoria(10);
  3.         ip = (char *) aloja_memoria(100);
  4.         puerto = (char *) aloja_memoria(50);
  5.  

Pero aquí estás machacando las variables, perdiendo la memoria que tenías reservada:
Código: C
  1.                         ip=strtok(linea,":");
  2.                         puerto=strtok(NULL,"\t");
  3.  

Por eso al intentar liberarlas te da error.
OKK!!
Creo que ya lo he entendido! Y la pregunta va a ser redundante, pero:
¿Es por que el puntero devuelto por strtok trunca el que yo he declarado a su tamaño,verdad?
Es mas, deja de ser mi puntero para convertirse en el que devuelve strtok, no?
Título: Re:Punteros y strtok
Publicado por: ravenheart en Octubre 28, 2014, 11:33:35 pm
¿Es por que el puntero devuelto por strtok trunca el que yo he declarado a su tamaño,verdad?
No.


Citar
Es mas, deja de ser mi puntero para convertirse en el que devuelve strtok, no?
Efectivamente.

Un puntero en realidad no es más que un entero, que contiene un número que indica la dirección de memoria donde se guarda la variable.
Si sobreescribes tu puntero con el que te devuelve strtok, no tienes forma de liberar tu memoria, así que la pierdes (lo que se llama un memory leak).
Título: Re:Punteros y strtok
Publicado por: caronte en Octubre 29, 2014, 06:37:42 pm
Thank you soo much!