[Linux-bruxelles] segfault dans evolution-vcard-importer
Stan Pinte
stanpinte at fastmail.fm
Ven 21 Mai 10:05:48 CEST 2004
Frederic Peters wrote:
>Dany De Bontridder écrivait :
>
>
>
>>Les problèmes est si len devient > à 65536 alors plantage, car buf
>>limité à 65536 (et dernier char doit être égal à \0)
>>
>>Que faire ?
>>ajouter un test : if ( (len += strlen(line) ) > sizeof (buf) )
>> g_error("File too big !!!");
>>
>>
>
>Pas du tout, c'est de l'amputage inutile. Pourquoi partir en pleurant
>des points d'exclamation alors qu'il est tout à fait possible de gérer
>les fichiers de toute taille ?
>
>
>Le code pourrait ainsi devenir:
>
>char* read_file (char *name)
>{
> char *buf;
> size_t len;
> FILE *f;
>
> f = fopen(name, "r");
> if (f == NULL) {
> g_error ("Unable to open %s!\n", name);
> }
>
> fseek(f, 0, SEEK_END);
> len = ftell(f);
> buf = g_malloc(len+1);
> /* non, ne venez pas dire que la valeur de buf devrait
> * être vérifiée ici avant d'avoir lu g_malloc() */
> fseek(f, 0, SEEK_SET);
>
>
petite question, fred: fread, il devine l'encodage de ton fichier?
> fread(buf, len, 1, f);
>
>
merci,
Stan.
> fclose(f);
>
> return buf;
>}
>
>Et puis, on peut continuer à explorer la GLib et découvrir qu'il y a
>moyen de faire:
>
>char* readfile (char *name)
>{
> gboolean rc;
> gsize len;
> gchar *contents;
> GError *errors;
>
> rc = g_file_get_contents(name, &contents, &len, &errors);
>
>
trop beau!!
Stan.
> if ( rc == FALSE ) {
> /* ici, on pourrait regarder dans errors pour dire ce
> * qui s'est mal passé */
> g_error("badaboom\n");
> }
>
> return contents;
>}
>
>
>
> Frédéric
>
>
>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: signature.asc
Type: application/pgp-signature
Taille: 261 octets
Desc: OpenPGP digital signature
URL: </pipermail/linux-bruxelles/attachments/20040521/630c7edb/attachment-0001.sig>
Plus d'informations sur la liste de diffusion Linux-bruxelles