viejas sistemas sistema servidores servidor para operativos operativo los definicion como caracteristicas cambiar actuales c segmentation-fault pcap sniffer

sistemas - ¿Por qué mi programa no funciona con diferentes distribuciones de Linux?



sistemas operativos para servidores pdf (1)

Sospecho que su programa se está bloqueando porque ip_header-> source_addr_ip apunta a la memoria a la que no tiene acceso. Debería poder usar GDB para determinar si este es el caso.

Estoy trabajando en un sniffer de paquetes. El gran problema es que mi código funciona perfectamente solo con Backtrack 5 R3, ¡pero no funciona en otras distribuciones! De hecho, en Ubuntu 12.10 y ArchLinux, cuando el sniffer obtiene el primer paquete, experimento un error de segmentación (me sale "segmentation fault core dumped"). Al principio, pensé que la falla radicaba en las bibliotecas o el compilador, pero después de algunas pruebas, ¡creo que puedo excluirlas! Esta es la situación:

  • Backtrack 5 R3 usa gcc 4.4.3 y libpcap 1.0.0
  • Ubuntu 12.10 usa Gcc 4.7.2 y Libpcap 1.3.0
  • ArchLinux lo mismo que Ubuntu

Así que traté de degradar en Arch a gcc 4.4.3 e libpcap 1.0.0, pero me sale el mismo error. Tengo algunas advertencias al compilar el código, pero nada realmente importante, ¡y sin embargo funciona perfectamente en retroceso! Ese es el gran misterio.

Aquí está el código que causa el problema:

void packet_dump(unsigned char *arguments, const struct pcap_pkthdr *pcap_data, const unsigned char *packet) { int packet_data_len, tcp_header_size=0, total_header_size; unsigned char *packet_data; const unsigned char *ip_src_dest; const struct header_ip *ip_header; //Calculate the value of variables ip_src_dest = (packet+LUNGHEZZA_INTESTAZIONE_ETH); ip_header = (const struct header_ip *)ip_src_dest; total_header_size = LUNGHEZZA_INTESTAZIONE_ETH+sizeof(struct header_ip)+tcp_header_size; packet_data = (unsigned char *)packet + total_header_size; packet_data_len = pcap_data->len - total_header_size; //THIS CAUSE THE PROBLEM (Solved removing inet_ntoa and converting it manually) printf("[ %s ] ============> ", inet_ntoa(ip_header->source_addr_ip)); printf("[ %s ] /n", inet_ntoa(ip_header->destination_addr_ip)); }