Bonjour a tous, j'en suis toujours avec mon bot IRC et j'ai un petit soucis lorsque je le ferme, on m'annonce une erreure :
Je ne vois pas comment faire a part vous montrer tout mon code car je ne sais pas d'ou sa vient...(enfin si, surement de la fonction "range" vu que c'est elle qui touche a ce char* en dernier...).*** glibc detected *** ./a.out: double free or corruption (!prev): 0x09d7b040 ***
Edit : des petits détails de mon code mis a jour, mais j'ai toujours mon érreure, je sais que je donne pas mal de code a lire mais je ne vois pas pourquoi mon free plante :s
main.c
irc.h :
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> typedef int SOCKET; typedef struct sockaddr_in SOCKADDR_IN; typedef struct sockaddr SOCKADDR; #include "irc.h" #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(s) close(s) #define PORT 80 int main(int argc, char *argv[]) { int err; SOCKET serv = socket(AF_INET, SOCK_STREAM, 0); SOCKADDR_IN cserv; struct timeval temps; temps.tv_sec = 0; temps.tv_usec = 100; struct irc_msg ircmsg; ircmsg.serv = serv; ircmsg.nick = malloc(50 * sizeof(char)); ircmsg.text = malloc(500 * sizeof(char)); ircmsg.chaine = malloc(512 * sizeof(char)); ircmsg.name = malloc(50 * sizeof(char)); ircmsg.domain = malloc(50 * sizeof(char)); ircmsg.event = malloc(50 * sizeof(char)); pthread_t recevoir; struct hostent *adresse; fd_set read; if(argc == 1) { free(ircmsg.nick); free(ircmsg.text); free(ircmsg.chaine); free(ircmsg.domain); free(ircmsg.name); closesocket(serv); printf("Veuillez renseigner une adresse\n"); return 0; } adresse = gethostbyname(argv[1]); cserv.sin_addr = *((struct in_addr *)(adresse->h_addr)); cserv.sin_family = AF_INET; cserv.sin_port = htons(6667); err = connect(serv, (SOCKADDR*)&cserv, sizeof(cserv)); printf("Connexion a %s\n", inet_ntoa(cserv.sin_addr)); if(err == -1) { printf("Err connection\n"); return 0; } printf("Connécté au serveur %s\n", argv[1]); send_line(serv, "NICK Bot-fox \r\n\r\n"); send_line(serv, "PRIVMSG nickserv identify ganjaman\r\n\r\n"); send_line(serv, "USER a a a a \r\n\r\n"); // A remplir correctement meme si le serveur s'en charge généralement send_line(serv, "JOIN #romfox\r\n\r\n"); while(1) { pthread_create(&recevoir, NULL, recv_line, (void *)&ircmsg); pthread_join(recevoir, NULL); FD_ZERO(&read); FD_SET(STDIN_FILENO, &read); select(STDIN_FILENO+1, &read,NULL,NULL,&temps); if(FD_ISSET(STDIN_FILENO, &read)) { free(ircmsg.nick); printf("nick libéré\n"); free(ircmsg.text); printf("txt libéré\n"); free(ircmsg.chaine); printf("chaine libérée\n"); free(ircmsg.domain); printf("domain libéré\n"); free(ircmsg.name); printf("name libéré\n"); free(ircmsg.event); printf("event libéré\n"); closesocket(serv); return 0; } } 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99 struct irc_msg { SOCKET serv; char *nick; char *event; char *text; char *chaine; char *name; char *domain; }; void send_line(SOCKET Client, char* buffer) { int i = 0; while(i< strlen(buffer)) { send(Client, (char *)&buffer[i], 1, 0); i++; } } int range(struct irc_msg *ircmsg) { int ret, i = 0; char *txt = NULL; ret = sscanf(ircmsg->chaine, ":%s %s", ircmsg->nick, ircmsg->event); txt = strstr(ircmsg->nick, "!"); if(txt != NULL) { txt = NULL; ret = sscanf(ircmsg->chaine, ":%[^!]!%s %[^\n]", ircmsg->nick, ircmsg->domain, ircmsg->text); txt = strstr(ircmsg->text, ":"); if (txt != NULL && ret == 3) { while(txt[i+1] != '\n') { // Lecture du texte ircmsg->text[i] = txt[i+1]; i++; } } printf("%s : %s\n", ircmsg->nick, ircmsg->text); return 0; } printf("%s\n", ircmsg->chaine); return 0; } int fonctions(struct irc_msg *ircmsg) { char *txt = NULL; int t_buff = 0; FILE* bmots = NULL; char gro_mots[50] = ""; txt = strstr(ircmsg->chaine, "PING"); // PING if (txt != NULL && ircmsg->chaine[0] == 'P') { ircmsg->chaine[1] = 'O'; send_line(ircmsg->serv, ircmsg->chaine); send_line(ircmsg->serv, "\r\n\r\n"); return 0; } bmots = fopen("b_words.txt", "r"); while(fgets(gro_mots, 20, bmots) != NULL) { t_buff = strlen(gro_mots); gro_mots[t_buff - 1] = '\0'; txt = strstr(ircmsg->text, gro_mots); if (txt != NULL && strcmp(ircmsg->nick, "romfox") != 0) { // Kick sur grot mot de la liste send_line(ircmsg->serv, "KICK #romfox "); send_line(ircmsg->serv, ircmsg->nick); send_line(ircmsg->serv, "\r\n\r\n"); return 0; } // End while } // End gros mots fclose(bmots); if(strcmp(ircmsg->event, "JOIN") == 0 && strcmp(ircmsg->nick, "Bot-fox") != 0) { send_line(ircmsg->serv, "PRIVMSG #romfox :Bonjour "); send_line(ircmsg->serv, ircmsg->nick); send_line(ircmsg->serv, "\r\n\r\n"); } return 0; } void* recv_line(void* data) { int i = 0, t_buff; struct timeval temps; temps.tv_sec = 0; temps.tv_usec = 100; fd_set read; struct irc_msg *irc_mss = (struct irc_msg *)data; FD_ZERO(&read); FD_SET(irc_mss->serv, &read); select(irc_mss->serv+1, &read, NULL, NULL, &temps); if(FD_ISSET(irc_mss->serv, &read)) { t_buff = recv(irc_mss->serv, irc_mss->chaine, 512, 0); irc_mss->chaine[t_buff] = '\0'; range(irc_mss); fonctions(irc_mss); } }
Partager