Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/05/2013, 15:11
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Sockets y debugger

Buenos días, tengo un problemas con una función, todo funciona perfecto, pero cuando lo paso por valgrind me da un error con la función 'send' supuestamente. Así que no sé realmente, ya me cansé de verificar y por eso pido su ayuda.

Función:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4.  
  5. #include <sys/socket.h>
  6. #include <sys/types.h>
  7. #include <netdb.h>
  8.  
  9. extern struct {
  10.   int res_http;
  11.   int long size_f;
  12. } http_header;
  13.  
  14. int download_package (const char * name_package, const char * dir_package, const char * server_mirror, const char * protocol)
  15. {
  16.   int long total_size_bytes = 0;
  17.   int size_bytes;
  18.   int sockfd;
  19.  
  20.   char header[strlen(name_package)+strlen(server_mirror)+68];
  21.   char buffer[1024];
  22.  
  23.   struct addrinfo *recv_s;
  24.   struct addrinfo *result;
  25.   struct addrinfo hints;
  26.  
  27.   bzero(&(hints), 8);
  28.  
  29.   hints.ai_family = AF_UNSPEC;
  30.   hints.ai_socktype = SOCK_STREAM;
  31.   hints.ai_protocol = IPPROTO_TCP;
  32.  
  33.   if (getaddrinfo(server_mirror, protocol, &hints, &recv_s) < 0) {
  34.     printf("%c[%d;%dm[Error]%c[%dm Error al resolver el DNS de %s\n", 27, 1, 31, 27, 0, server_mirror);
  35.     return -1;
  36.   }
  37.  
  38.   for (result = recv_s ; result != NULL ; result = result->ai_next) {
  39.     if ((sockfd = socket(result->ai_family, result->ai_socktype, result->ai_protocol)) < 0)
  40.       continue;
  41.    
  42.     if (connect(sockfd, result->ai_addr, result->ai_addrlen) < 0) {
  43.       close(sockfd);
  44.       continue;
  45.     }
  46.    
  47.     break;
  48.     freeaddrinfo(recv_s);
  49.   }
  50.  
  51.   if (result == NULL) {
  52.     printf("%c[%d;%dm[Error]%c[%dm No se pudo conectar al servidor. \n", 27, 1, 31, 27, 0);
  53.     return -1;
  54.   }
  55.  
  56.   snprintf(header, sizeof(header), "GET /package/%c/%s.tar HTTP/1.1\r\nHost: %s\r\nConnection: close\r\n\r\n", name_package[0], name_package, server_mirror);
  57.  
  58.   if (send(sockfd, header, sizeof(header), result->ai_flags) < 0) {
  59.     printf("%c[%d;%dm[Error]%c[%dm No se pudo enviar la petición al servidor.\n", 27, 1, 31, 27, 0);
  60.    
  61.     freeaddrinfo(result);
  62.     close(sockfd);
  63.    
  64.     return -1;
  65.   }
  66.  
  67.   bzero(&buffer, sizeof(buffer));
  68.  
  69.     /* Esto envia la primera petición, no sé
  70.      * si funcionará así. Ya veremos... */
  71.  
  72.   if ((size_bytes = recv(sockfd, buffer, sizeof(buffer)-1, 0)) > 0) {
  73.     if (!strstr(buffer, "HTTP/1.1 200 OK")) {
  74.      
  75.       close(sockfd);
  76.       freeaddrinfo(result);
  77.      
  78.       return -1;
  79.     }
  80.   }
  81.  
  82.   do {
  83.     total_size_bytes += size_bytes;
  84.    
  85.   } while ((size_bytes = recv(sockfd, buffer, sizeof(buffer)-1, 0)) > 0);
  86.  
  87.   /* Aquí toda falta, guardar los datos
  88.    * y hacer la verificación de tamaño
  89.    * según HTTP y SHA256
  90.    */
  91.  
  92.   freeaddrinfo(result);
  93.  
  94.   return -2;
  95. }

Lo que me envía valgrind es

Código C:
Ver original
  1. [guzzano@localhost src]$ valgrind -v --track-origins=yes ./w0rm
  2. [...]
  3.  
  4. --25703-- Discarding syms at 0x442ea40-0x4435e9c in /usr/lib/libnss_files-2.16.so due to munmap()
  5. --25703-- Discarding syms at 0x443a8a0-0x443b674 in /usr/lib/libnss_mdns4_minimal.so.2 due to munmap()
  6. --25703-- Discarding syms at 0x443ec40-0x4442318 in /usr/lib/libnss_dns-2.16.so due to munmap()
  7. --25703-- Discarding syms at 0x4777f700-0x4778e0c4 in /usr/lib/libresolv-2.16.so due to munmap()
  8. ==25703==
  9. ==25703== HEAP SUMMARY:
  10. ==25703==     in use at exit: 0 bytes in 0 blocks
  11. ==25703==   total heap usage: 78 allocs, 78 frees, 6,722 bytes allocated
  12. ==25703==
  13. ==25703== All heap blocks were freed -- no leaks are possible
  14. ==25703==
  15. ==25703== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
  16. ==25703==
  17. ==25703== 1 errors in context 1 of 1:
  18. ==25703== Syscall param socketcall.send(msg) points to uninitialised byte(s)
  19. ==25703==    at 0x47587821: send (in /usr/lib/libc-2.16.so)
  20. ==25703==    by 0x804886B: download_package (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  21. ==25703==    by 0x8048980: main (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  22. ==25703==  Address 0xbecdda5e is on thread 1s stack
  23. ==25703==  Uninitialised value was created by a stack allocation
  24. ==25703==    at 0x8048655: download_package (in /home/guzzano/Escritorio/w0rm/src/w0rm)
  25. ==25703==
  26. ==25703== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Muchas gracias.