Probleme de corruption de mémoire

Résolu
Allian -  
 Allian -
Bonjour,
je suis en train de programmer un serveur web en C. Le tout fonctionne à peu prés bien mais je rencontre un problème dans une de mes fonctions. En effet j'ai besoin de lister le contenu d'un dossier si celui ci ne contient pas de fichier index.html

Voila ma fonction censé faire ceci

char *listFolder(char *path) //liste le contenu d'un dossier grace à son chemin
{
	char hostNerrorP[32];
	char *listFolderDef;
	char pageAppend[]="</html>";
	gethostname(hostNerrorP,sizeof(hostNerrorP));
	char bodyList[]="<html><center><h1>Liste des fichiers du r&eacute;p&eacute;rtoire<h1></center><hr>";
	char *startLink;
	startLink = realloc(NULL, strlen("") + 1);
	sprintf(startLink, "");
	char href[] = "<a href=\"";
	char middleLink[] = "\">";
	char endLink[] = "</a>";
	char br[] = "<br/>";
	char *huh = strstr(path, "/www/");
	huh = strstr(huh, "www/");
	huh = strstr(huh, "/");
	
	if(huh[strlen(huh)-1] != '/'){
		strcat(huh, "/");  
	}
		
	printf("%s\n", huh);
	
	struct dirent *lecture;
    DIR *rep;
    rep = opendir((char *)path);
    
    while ((lecture = readdir(rep))) {
		
			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
			strcat(startLink, tmp);
		
			
    }

    closedir(rep);
	
	listFolderDef=malloc((sizeof(bodyList)+sizeof(startLink)+sizeof(pageAppend))*(sizeof(char)));
	sprintf(listFolderDef,"%s%s%s",bodyList,startLink,pageAppend);
	
	return listFolderDef;
}


Je lui passe le chemin du dossier et elle me retourne le texte que j'écris ensuite dans ma socket. La fonction fonctionne mais dans ma console j'ai une erreur mémoire.

*** glibc detected *** ./test: malloc(): memory corruption: 0x08dbe080 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xc0dff1]
/lib/tls/i686/cmov/libc.so.6[0xc10bb3]
/lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x58)[0xc12868]
/lib/tls/i686/cmov/libc.so.6[0xbfeddf]
/lib/tls/i686/cmov/libc.so.6(fopen+0x2c)[0xbfeeac]
./test[0x804991a]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xbb9b56]
./test[0x8048c01]
======= Memory map: ========
00689000-0068a000 r-xp 00000000 00:00 0          [vdso]
00a16000-00a31000 r-xp 00000000 08:05 186741     /lib/ld-2.10.1.so
00a31000-00a32000 r--p 0001a000 08:05 186741     /lib/ld-2.10.1.so
00a32000-00a33000 rw-p 0001b000 08:05 186741     /lib/ld-2.10.1.so
00ba3000-00ce1000 r-xp 00000000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
00ce1000-00ce3000 r--p 0013e000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
00ce3000-00ce4000 rw-p 00140000 08:05 397518     /lib/tls/i686/cmov/libc-2.10.1.so
00ce4000-00ce7000 rw-p 00000000 00:00 0 
00dd1000-00ded000 r-xp 00000000 08:05 170831     /lib/libgcc_s.so.1
00ded000-00dee000 r--p 0001b000 08:05 170831     /lib/libgcc_s.so.1
00dee000-00def000 rw-p 0001c000 08:05 170831     /lib/libgcc_s.so.1
08048000-0804a000 r-xp 00000000 08:05 495498     /home/allian/Bureau/server/test
0804a000-0804b000 r--p 00001000 08:05 495498     /home/allian/Bureau/server/test
0804b000-0804c000 rw-p 00002000 08:05 495498     /home/allian/Bureau/server/test
08dbe000-08ddf000 rw-p 00000000 00:00 0          [heap]
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b77dc000-b77dd000 rw-p 00000000 00:00 0 
b77ed000-b77f0000 rw-p 00000000 00:00 0 
bff7f000-bff94000 rw-p 00000000 00:00 0          [stack]


Ceci indique un mauvais accès mémoire au niveau de cette ligne je pense.
			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];
			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
			strcat(startLink, tmp);


Quelqu'un pourrait il m'éclairer sur les raisons de cette erreur
Merci.

4 réponses

Pacorabanix Messages postés 3248 Date d'inscription   Statut Membre Dernière intervention   663
 
je t'avoue ne pas bien voir où est le problème, mais fait attention au fait que pour les chaines de caractères il faut prévoir de l'espace pour le caractère "nul" de fin de chaine.
0
Allian
 
oui je sais c'est pour cela que je fais un + 1 à chaque alloc mais cela ne résout pas le problème
0
grou29 Messages postés 39 Date d'inscription   Statut Membre Dernière intervention   9
 
je pense qu'il manque un +1 pour le \0 de fin de chaine sur

char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)];

pour etre

char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)+1];


idem pour
listFolderDef=malloc((sizeof(bodyList)+sizeof(startLink)+sizeof(pageAppend)+1)*(sizeof(char)));
-
Grou29
http://lienssanslien.free.fr
0
myckie08 Messages postés 114 Date d'inscription   Statut Membre Dernière intervention   5
 
slt excuse moi si je fais erreur car vu l'heure j'ai pas trop les yeux en face des trous mais ton tableau tmp n'est initialiser null part non ? tu devrai essaye de l'initialiser vu seque tu as a mettre dedans peut etre dejasa 255 pour voir si l'erreur disparait
0
Allian
 
J'ai réussi à résoudre le problème en faisant ceci

  while ((lecture = readdir(rep))) {
		
			char tmp[strlen(href)+strlen(huh)+ strlen(lecture->d_name)+strlen(middleLink)+strlen(lecture->d_name)+strlen(endLink)+strlen(br)+1];
			sprintf(tmp, "%s%s%s%s%s%s%s", href, huh, lecture->d_name, middleLink, lecture->d_name, endLink, br);
			startLink = realloc(startLink, strlen(tmp) + strlen(startLink) + 1);
			strcat(startLink, tmp);
		
			
    }

    closedir(rep);
	
	listFolderDef=malloc((strlen(bodyList)+strlen(startLink)+strlen(pageAppend) + 1)*(sizeof(char)));
	sprintf(listFolderDef,"%s%s%s",bodyList,startLink,pageAppend);


C'est donc bien la place pour le \0 qu'il manquait en plus des sizeof() à remplacer par les strlen car sinon j'avais la taille du pointeur et non pas de la chaine de caracteres
0