Bonjour

J'aurais aimé faire mieux (voir http://www.developpez.net/forums/d11...copie-fichier/ ), mais encore faudrait-il que ce que je fais déjà marche correctement !

Voici mon code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
    fichier=enregistre_tmp_xml(ooo);
    tmp1=chemin_exe();
    sprintf(affichage,"%s%cLibO%cfeuille.zip",tmp1,SEPARATEUR,SEPARATEUR);
    sprintf(aff,"%s%c%s.odt",((char **)param)[CHEMIN],SEPARATEUR,((char **)param)[NOM]);
    copie_fichier(aff,affichage);
    f_zip=zip_open(aff,ZIP_CREATE,NULL); /* lignes (1) */
    n_zip=zip_source_filep(f_zip,fichier,0,0); /* récupération du fichier sous forme FILE * sans avoir à le copier sur le disque */ /* lignes (1) */
    zip_replace(f_zip,zip_name_locate(f_zip,"content.xml",ZIP_FL_NOCASE) ,n_zip); /* on l'injecte dans l'archive en lui donnant un nom */ /* lignes (1) */
    zip_close(f_zip);   /* on ferme l'archive */ /* lignes (1) */
    free(tmp1);
    fclose(fichier);
La première ligne récupère un file * ouvert avec "FILE * sortie=tmpfile();"
Lors de la fermeture de ce fichier (dernière ligne), j'ai un plantage du programme :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
*** glibc detected *** ./perso: double free or corruption (!prev): 0x0000000001024100 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x78a96)[0x7f826a132a96]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f826a136d7c]
/lib/x86_64-linux-gnu/libc.so.6(fclose+0x155)[0x7f826a122715]
Ce que je ne comprends pas, c'est que si je commente les 4 lignes marquées en fin avec /* lignes (1) */, je n'ai plus ce plantage

Le problème est encore simplifiable en remplaçant la première ligne par "fichier=tmpfile(); //enregistre_tmp_xml(ooo);", ça plante encore !

Le plantage a bien lieu lors du "fclose(fichier)" et tout ce qui a été fait avant a bien été fait (fichier de sortie vérifié).

J'avoue ne pas comprendre la raison de ce plantage testé sous ubuntu 11.10 et mageia 2.