Bonjour,

Je developpe en ce moment un server de Tchat compatible avec AJAX, enfin bref

Le server étant fini et encore en beta je le laisse tourner et invite pas mal de monde à venir dessus.
Je laisse donc un "ulimit -c unlimited" en cas d'un eventuel segfault.
Après quelque jour sans problème le server a segfault.

Je lance le fichier core qui a été généré :

"gdb monprog -c core"

Je fait un backtrace (bt) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
 
(gdb) bt
#0  0xb7e8e060 in free () from /lib/tls/libc.so.6
#1  0xb7e8fc4f in malloc () from /lib/tls/libc.so.6
#2  0x0804afb2 in adduser (nick=0x807133e "yobakan", chan=0x8071346 "Ace", fdclient=4, ace_tables=0x804e008) at src/users.c:61
#3  0x0804ab16 in raw_connect (param=0xbf86af30, fdclient=4, call_user=0x0, ace_tables=0x804e008) at src/raw.c:154
#4  0x0804a8b4 in checkraw (cget=0x8070840, ace_tables=0x804e008) at src/raw.c:102
#5  0x0804a417 in checkrecv (pSock=0x8071330 "GET", fdclient=4, ip=0xb7df603c "127.0.0.1", ace_tables=0x804e008) at src/kernel.c:124
#6  0x08049a54 in sockroutine (port=6969, ace_tables=0x804e008) at src/sock.c:262
#7  0x08048d72 in main (argc=1, argv=0xbf8750c4) at src/main.c:131
Donc je me rend à la ligne 61 de users.c :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
nuser = (USERS *)malloc(sizeof(*nuser));
Voici ma structure :

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
 
typedef struct USERS
{
	unsigned int fdclient;
	unsigned int state;
	unsigned int nraw;
 
	char nick[MAX_NICK_LEN+1];
	char sessid[33];
	char chan[33];
	char ip[32];
 
	long int idle;
 
	struct USERS *next;
	struct USERS *prev;
 
	struct RAW *rawhead;
	struct RAW *rawfoot;
} USERS;
Qu'est ce qui a pu provoquer un segfault ici ? Un overflow ailleur ?

Merci à vous