IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Fuite mémoire pointeur sur une structure bpf_program


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut Fuite mémoire pointeur sur une structure bpf_program
    Bonjour,
    Dans le but de créer un filtre pour filtrer les packets que reçoit mon traffic, j'ai besoin d'un pointeur sur une structure bpf_program, et c'est ici que tout se plante
    voici le code de la méthode que j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    pcap_t * PacketAfdx::OpenDev(pcap_if_t *alldevs, int inum) //return -1 if error and return 0 else
    {
    	pcap_t *adhandle;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	int i;
    	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
     
    	if ( (adhandle= pcap_open(d->name,          // name of the device
                                  65536,            // portion of the packet to capture. 
                                                    // 65536 guarantees that the whole packet will be captured on all the link layers
                                  PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                                  1000,             // read timeout
                                  NULL,             // authentication on the remote machine
                                  errbuf            // error buffer
                                  ) ) == NULL)
        {
     
            /* Free the device list */
    		//Console::WriteLine("errbuf:%s",errbuf); 
    		cout <<"Le bloccage est ici";
            pcap_freealldevs(alldevs);
     
        }
     
       cout <<"\nlistening on ...\n"<< d->description;
       if(pcap_datalink(adhandle) != DLT_EN10MB)
        {
            fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
     
        }
     
         bpf_u_int32 netmask;
     
       if (d->addresses != NULL)
     
            /* Retrieve the mask of the first address of the interface */
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            /* If the interface is without an address we suppose to be in a C class network */
            netmask=0xffffff; 
     
      struct bpf_program *fcode = (bpf_program *) malloc(sizeof(struct bpf_program));
     
    //compile the filter
        if (pcap_compile(adhandle, fcode, "udp src port 57344", 1, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
            /* Free the device list */
     
     
        }
     
    //set the filter
        if (pcap_setfilter(adhandle, fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
            /* Free the device list */
     
     
        }
    	free(fcode);
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs(alldevs);
    	return adhandle;
     
    }
    L'application crach à un moment donné et j'ai comme sortie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception de première chance à 0x00436d5c dans App.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccccd7.
    Exception non gérée à 0x00436d5c dans App.exe*: 0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0xccccccd7.
    J'ai utilisé malloc et free , je ne voit pas pourquoi ça crach, aidez moi s'il vous plait,
    Merci d'avance

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Si alldevs est NULL ça segfault dans le open.

    adhandle vaut n'importe quoi et donc lors du pcap_datalink(adhandle) ça segfault...

    Et quelques détails :

    Dans ton cas, je trouve que caster le retour du malloc diminue la lisibilité surtout que tu fais un (bpf_program *) alors que c'est struct bpf_program. Enfin si ça marche c'est qu'il y a un typedef et que tu peux enlever le struct partout.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Bonsoir,
    alldevs n'est pas null elle m'affiche une interface et commence déjà à afficher le contenu d'un paquet puis elle se crache quand on veut accéder au contenu de la structure ethernet

    voici le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    int _tmain(int argc, _TCHAR* argv[])
    {
     PacketAfdx P;
    	 pcap_if_t *alldevs;
    	  pcap_t *ad;
    	  int inum;
     
     
    	 alldevs=P.ChooseDev2();
    	  printf("Enter the interface number ");
        scanf("%d", &inum);
     
     
     
    	ad=P.OpenDev(alldevs,inum,fcode);
    	 P.ParseDataPacket(ad);
    	system("PAUSE");
    	getch();
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    pcap_t * PacketAfdx::OpenDev(pcap_if_t *alldevs, int inum,struct bpf_program * fcode) //return -1 if error and return 0 else
    {
    	pcap_t *adhandle;
    	pcap_if_t *d;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	int i;
    	for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
     
    	if ( (adhandle= pcap_open(d->name,          // name of the device
                                  65536,            // portion of the packet to capture. 
                                                    // 65536 guarantees that the whole packet will be captured on all the link layers
                                  PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                                  1000,             // read timeout
                                  NULL,             // authentication on the remote machine
                                  errbuf            // error buffer
                                  ) ) == NULL)
        {
     
            /* Free the device list */
    		//Console::WriteLine("errbuf:%s",errbuf); 
    		cout <<"Le bloccage est ici";
            pcap_freealldevs(alldevs);
     
        }
     
       cout <<"\nlistening on ...\n"<< d->description;
       if(pcap_datalink(adhandle) != DLT_EN10MB)
        {
            fprintf(stderr,"\nThis program works only on Ethernet networks.\n");
     
        }
     
         bpf_u_int32 netmask;
    	  struct bpf_program *fcode = (bpf_program *) malloc(sizeof(struct bpf_program));
       if (d->addresses != NULL)
     
            /* Retrieve the mask of the first address of the interface */
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            /* If the interface is without an address we suppose to be in a C class network */
            netmask=0xffffff; 
     
     
     
    //compile the filter
        if (pcap_compile(adhandle, fcode, "udp src port 57344", 1, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
            /* Free the device list */
     
     
        }
     
    //set the filter
        if (pcap_setfilter(adhandle, fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
            /* Free the device list */
     
     
        }
     
        /* At this point, we don't need any more the device list. Free it */
        pcap_freealldevs(alldevs);
    	return adhandle;
     
    }
     
    void PacketAfdx::print_Eth_header(const struct ether_header * ethernet){
     
    	fprintf(stdout,"-------------------[ETH HEADER]-----------\r\n");
        fprintf(stdout,"| %.2X:%.2X:%.2X:%.2X:%.2X:%.2X -> ",ethernet->ether_shost[0],ethernet->ether_shost[1], ethernet->ether_shost[2],ethernet->ether_shost[3],ethernet->ether_shost[4],ethernet->ether_shost[5]);
        fprintf(stdout,"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X |\r\n",ethernet->ether_dhost[0],ethernet->ether_dhost[1], ethernet->ether_dhost[2],ethernet->ether_dhost[3],ethernet->ether_dhost[4],ethernet->ether_dhost[5]);
        fprintf(stdout,"------------------------------------------\r\n");
    	fprintf(stdout,"Protocol: 0x%.4X\r\n", htons(ethernet->ether_type));
    }
    L'application se crache au niveau de la ligne 72

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    J'ai dit des bêtises dans le post du dessus j'avais pas vu que tu récupérais la valeur du open dans adhandler

    Mais si tu as une segfault à la ligne 72 c'est que ethernet est NULL donc vérifie bien lors de l'appel à cette fonction.

  5. #5
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 44
    Par défaut
    Je voudrais juste vous dire que l'application marche normalement sans l'ajout des filtres elle m'affiche le contenu des packets entrants c'est pour ça j'ai pensé que le problème réside dans la structure bpf_program*

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    tu codes en c++ et tu utilises des pointeurs sans vérifier leur contenu avant utilisation, là où des références seraient peut-être plus appropriées...

    tu retourne un pointeur avec 0 ou -1 dedans au lieu d'un booléen ou d'un int plus approprié? car après tu y colles même une structure... t'as pas l'impression que c'est un peu du n'importe quoi?

    soit tu retournes NULL si il y a un problème soit ta structure...

    ta méthode ParseDataPacket est celle qui pose problème... vu que print_Eth_header n'est jamais appelée dans ton code

    le for multiple, c'est beau mais si tu as un dépassement sur l'un de tes parcours c'est pas top à déboguer...

    stdout est défini où? dans ta classe? en externe dans ton .h ? c'est un tampon assez grand?

    j'ai l'impression que tu as du mal avec les pointeurs...


  7. #7
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Montre un peu le code de P.ParseDataPacket(ad); Voir ta classe en entier, ça sera plus simple pour nous.

    stdout est défini où? dans ta classe? en externe dans ton .h ? c'est un tampon assez grand?
    Non ça c'est bon, c'est juste la sortie standard...

    Par contre c'est pas du C++ que tu fais c'est du C auquel tu rajoutes les classes mais enfin bon.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2014, 09h56
  2. Réponses: 2
    Dernier message: 09/03/2014, 23h10
  3. tableau de pointeur sur une structure ?
    Par latitude38 dans le forum C
    Réponses: 8
    Dernier message: 17/01/2011, 18h58
  4. Pointeur sur une structure
    Par youssef222 dans le forum Débuter
    Réponses: 7
    Dernier message: 21/04/2008, 08h00
  5. Pointeur sur une structure
    Par Fred.77 dans le forum C
    Réponses: 19
    Dernier message: 11/11/2007, 13h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo