(Courriels de diversion: <patinait@emanent-niiez.com> <controleur@economiserent-rabougrisse.com> <exposerez@inexperts-tacha.com> <phraseurs@hachoir-jeuneras.com> <dresseront@enchantez-ecorces.com> <alimenterez@premediterait-avorterez.com> <reduisais@pietina-horrifiait.com> <fourvoyant@degroupees-retribueras.com> <indexee@ensembliers-adresserions.com> <plantureux@reconquises-transposais.com> )


Selon Georges Favre :
> Le Mercredi 19 Octobre 2005 13:19, Baptiste MATHUS a écrit :
> > Le gros intérêt de fgets est qu'il est capable de limiter le nombre de
> > caractères saisis et donc éviter un buffer overflow si l'utilisateur tape
> plus
> > de caractères que la taille du buffer que tu as déclaré.
> >
> > http://www.lri.fr/~aze/page_c/aide_c/fgets.html
> >
> > Exemple d'utilisation si tu veux récupérer un caractère :
> >
> > char buf[10];
> > fgets(buf, 10, stdin);
> >
> > => Là tu vérifies buf[0] et si c'est autre chose que le caractère que tu
> veux,
> > tu engueules l'utilisateur et tu boucles.
> >
> Merci tout d'abord à tous ceux qui se sont penchés sur mon problème :
> Thomas, Guillaume, Tharibo et Baptiste.
> certains conseils dépassaient mon niveau de connaissance en C comme
> en Linux : NCurses (si quelqu'un connaît une bonne doc accessible, ça
> m'intéresse!) ou le "mode canonique" (?).
> Par contre plusieurs soulignaient le fonctionnement douteux de scanf
> avec des caractères. fgets me séduisait assez avec sa limitation de
> caractères saisis, mais je n'ai pas pu le faire fonctionner. Affaire
> de syntaxe ? j'avais utilisé : fgets(buffer,10,stdin);  sans succès.
> Finalement j'ai pris "gets(buffer);"  en dépit du warning de gcc.

Bizarre, bizarre. En fait, gcc demande de ne pas utiliser gets pour la simple
raison que comme je l'ai expliqué il n'y pas de limite de taille saisie.

Dans ton cas, nous sommes donc bien d'accord que ton code a vocation à être
jetable ? :). En effet, avec gets tu crées une énorme faille de sécurité
puisqu'il est simplissime de déclencher un buffer overflow à ton programme.

Par exemple, si je saisis 100 caractères dans ton buffer que tu aurais déclaré à
10 caractères, je vais écrire 90 caractères dans une zone non prévue à cet effet
:-\.

Je viens de vérifier le fonctionnement de fgets que je n'avais pas utilisé
depuis 1 an ou 2, ça marche comme je pensais :

#include <stdio.h>
int main(void)
{
        char buf[10+1];
        printf("Saisissez votre texte (maxi 10 caractères) : ");
        fgets(buf,10,stdin);

        printf("Chaine saisie : <%s>\n", buf);
}

C'est quoi l'erreur quand tu essaies de l'utiliser ?

@++

--
Baptiste <Batmat> Mathus
http://batmat.net - BMAthus at Free point fr
---------
Si chacun de nous a une idée et que nous les partageons, nous
repartirons tous les deux avec deux idées... C'est ça le Libre.

--------------------------------------------------------------------
Les listes de diffusion occultes: <URL:http://www.CULTe.org/listes/>