• [^] # Re: Encore un WU-gruyere !

    Posté par . En réponse à la dépêche wu-imapd. Évalué à 6.

    strcpy, strcat,... sont DANGEREUX.

    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.