Ton tampon peut etre alloue dynamiquement ca change rien. Si tu te trompes sur la taille de l'allocation ou si le string que tu passes n'as pas de '0' a la fin(bon ok c'est plus un string a ce moment...) tu risques un heap overflow et c'est aussi dangereux qu'un stack overflow(bien qu'un peu moins facile a exploiter, mais tres loin d'etre infaisable).
La regle c'est de limiter la copie a la taille du buffer, et ca tu peux pas le faire avec un strcpy ou un strcat. strncpy et strncat resolvent en partie ce probleme bien qu'ils ne soient pas parfait a 100%, mais c'est deja une tres grosse avancee.
Faut bien comprendre qu'aucune fonction sans bug n'est dangereuse d'elle meme, une fonction est dangereuse a partir du moment ou le dev l'utilise mal en lui passant des parametres a la con.
strncpy et strncat sont plus surs car en utilisant la simple technique de:
- allouer un buffer de <size>+1
- mettre buffer[size] a 0 avant l'appel a strncpy
- specifier le nombre max de char a copier
On est sur de ne pas eclater le buffer.
Ces etapes sont elles aussi sujettes a erreur, mais elles sont beaucoup plus simples a effecteur et bien moin sujettes a erreur que faire un strcpy en priant pour qu'on ne se soit pas trompes en calculant la taille du buffer.
[^] # Re: Encore un WU-gruyere !
Posté par pasBill pasGates . En réponse à la dépêche wu-imapd. Évalué à 6.
Ton tampon peut etre alloue dynamiquement ca change rien. Si tu te trompes sur la taille de l'allocation ou si le string que tu passes n'as pas de '0' a la fin(bon ok c'est plus un string a ce moment...) tu risques un heap overflow et c'est aussi dangereux qu'un stack overflow(bien qu'un peu moins facile a exploiter, mais tres loin d'etre infaisable).
La regle c'est de limiter la copie a la taille du buffer, et ca tu peux pas le faire avec un strcpy ou un strcat. strncpy et strncat resolvent en partie ce probleme bien qu'ils ne soient pas parfait a 100%, mais c'est deja une tres grosse avancee.
Si tu as:
char *monbuffer=(char*)malloc(SIZE+1);
//test alloc success
strcpy(monbuffer,thestring);
- T'as un BO si thestring n'est pas null terminated
- T'as un BO si tu t'es gourre de taille pour SIZE
si tu utilises
#define MyStrnCpy(X,Y,Size) X[Size]=0; \
strncpy(X,Y,Size);
MyStrnCpy(monbuffer, thestring, SIZE);
Tu elimines ces 2 risques.
Faut bien comprendre qu'aucune fonction sans bug n'est dangereuse d'elle meme, une fonction est dangereuse a partir du moment ou le dev l'utilise mal en lui passant des parametres a la con.
strncpy et strncat sont plus surs car en utilisant la simple technique de:
- allouer un buffer de <size>+1
- mettre buffer[size] a 0 avant l'appel a strncpy
- specifier le nombre max de char a copier
On est sur de ne pas eclater le buffer.
Ces etapes sont elles aussi sujettes a erreur, mais elles sont beaucoup plus simples a effecteur et bien moin sujettes a erreur que faire un strcpy en priant pour qu'on ne se soit pas trompes en calculant la taille du buffer.