[C]Core dump inspiegabile

di il
5 risposte

[C]Core dump inspiegabile

Salve sono nuovo in questo forum è da un po che è ho questo problema , ho il seguente codice per uno sniffer local:
#include <stdio.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <netdb.h>
#include "inet_structures.h"
#define IFACE "eth0"
//prototipi
int Inet_OpenRawSock(void);
int Inet_SetPromisc(char *iface);
int main() {
int sock, bytes_recieved, fromlen;
char buffer[65535];
char *nameaddress;
struct sockaddr_in from;
struct hostent *site;
IP_Header *ip;
TCP_Header *tcp;
//Creiamo la socket e mettiamola in promiscuo
sock=Inet_SetPromisc(IFACE);
while(1)
{
fromlen = sizeof from;
bytes_recieved = recvfrom(sock, buffer, sizeof(buffer),
0, (struct sockaddr *)&from, &fromlen);
if (bytes_recieved < 0){
printf("sock=%d",sock);
perror("Errore recv");
exit(1);
}
site=gethostbyaddr((const char *)&from.sin_addr.s_addr,sizeof(from.sin_addr.s_addr),AF_INET);
if(!site){
printf("Host address: %s\n",ntohl(from.sin_addr.s_addr));
}else{
printf("Host name: %s\n",site->h_name);
}
ip = (IP_Header *)buffer;
//Guardo se e’ un paccheto TCP
if(ip->proto == 6) {
printf("Lunghezza Header = %d\n",ip->h_len);
printf("Protocollo = %d\n",ip->proto);
printf("Buffer:%s\n",buffer);
tcp = (TCP_Header *)(buffer + (4*ip->h_len));
printf("Porta Sorgente = %d\n",ntohs(tcp->source));
printf("Porta Destinazione = %d\n",ntohs(tcp->dest));
}
}
}

int Inet_OpenRawSock() {
int sock;
if((sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0) {
perror("Errore creazione socket");
exit(0);
};
return(sock);
}


int Inet_SetPromisc(char *iface) {
int sock;
struct ifreq ifr;
sock = Inet_OpenRawSock();
printf("sock promisc=%d\n",sock);
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
if((ioctl(sock, SIOCGIFFLAGS, &ifr) < 0)) {
perror("Errore Interfaccia\n");
exit(0);
}
printf("Interfaccia: %s\n", iface);
//Setto l’interfaccia in modalita’ promiscua
if (!(ifr.ifr_flags & IFF_PROMISC))
{
ifr.ifr_flags |= IFF_PROMISC;
if ( ioctl(sock, SIOCSIFFLAGS, &ifr) < 0 ){ // promisc mode
perror("Errore non riesco a settare la modalita’ promiscua");
exit(0);
}
}
printf("Interfaccia %s settata in modo promiscuo", iface);
return(sock);
}
Mi da un core dump dove aver eseguito la funzione. Perche?
Grazie in anticipo per le risposte.

5 Risposte

  • Re: [C]Core dump inspiegabile

    Su quale funzione o di quale funzione ti fa il core dump?
  • Re: [C]Core dump inspiegabile

    Ciao, ti ringrazio immensamente per la risposta . Il core dump me lo da secondo alcune prove quando devo dare in output il nome dell'host . Pensavo che forse era un puntatore nullo , e ci ho messo la condizione. Non so come risolvere , attendo tue risposte.
  • Re: [C]Core dump inspiegabile

    Tutto mi fa pensare ad uno sfondamento della struttura site
    mi potresti far vedere la definizione della struttura site?
  • Re: [C]Core dump inspiegabile

    Site è una semplice struttura hostent , non credo sia possbile , comunque questa è la difinizione di hostent
    
    struct hostent {
    char*    h_name;       
    char**   h_aliases;    
     int      h_addrtype;   ;; host address type 
    int      h_length;     ;; length of address 
    char**   h_addr_list;  ;; list of addresses 
    }
    
  • Re: [C]Core dump inspiegabile

    Dalla struttura che mi hai mostrato non si evincono sfondamenti.
    se il programma produce dei risultati e poi va in dump core
    allora la causa all'80% dipende dal fatto che non controlli che la lista degli host sia vuota o che sia finita.
    in questo caso verifica che il puntatore sia a null e chiudi la lista.
    l'istruzione if(!site) non verifica che site sia a null ma verifica solo se ci sono problemi.
    ti consiglio di aggiungere
    if (site==nullptr) { procedura di chiusura delle comunicazioni } 
Devi accedere o registrarti per scrivere nel forum
5 risposte