Bonjour,
Je souhaiterai savoir si ma méthode pour saisir un nom de fichier au clavier est sécurisé.
Le but est de : en fonction du nombre de lettres taper, il y est un realloc tout les 25 caractères bien sûr l'utilisateur n'a pas connaissance de cela.
Si par exemple quelqu'un tape le nom de fichier : "Photo de vacances en bord de mer" alors il y aura un realloc.
Est-ce que cette méthode est dangereuse. Si oui dois-je plutôt passé par un tableau et est-ce qu'un tableau est sécuriser si on met je dis un chiffre au hasard 500 cases.
Voici mon code :
Le .h
Le .c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #ifndef __FILENAME_H__ #define __FILENAME_H__ #include <stdlib.h> #include <stdio.h> #include "ctypes.h" #define FILENAME_ALLOC_CARA 25 // Nbre de caractère alloué pour récupéré le nom de fichier. #define FILENAME_OutputLg 9+3 // +2 Le numéro du fichier et +1 pour cara fin de chaîne. struct SFilename{ char *pFilename; // Nom du fichier htm. s32 gnFilenameNbCaraMax; // Nb Max de caractère pour le nom de fichier. s32 gnFilenameNbCara; // Itérateur. FILE *pFile; // Pointeur sur le fichier. }; struct SFilename gFilename; // Init paramètre du nom du fichier. void Filename_Init(void); // Réallocation de la taille du buffer si nom du fichier trop grand. void Filename_Realloc(void); // Libération de la mémoire. void Filename_Release(void); // Récupération du nom du fichier avec stdin (saisie clavier), avant d'appuyer sur entré. void Filename_Recovery(void); #endif
Merci par avance.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 #include "filename.h" // Init paramètre du nom du fichier. void Filename_Init(void) { gFilename.pFilename = NULL; gFilename.gnFilenameNbCaraMax = 0; gFilename.gnFilenameNbCara = 0; } void Filename_Realloc(void) { if(gFilename.gnFilenameNbCara >= gFilename.gnFilenameNbCaraMax) { gFilename.gnFilenameNbCaraMax += FILENAME_ALLOC_CARA; gFilename.pFilename = (char *)realloc(gFilename.pFilename, gFilename.gnFilenameNbCaraMax*sizeof(char)); if(gFilename.pFilename == NULL) { printf("Une erreur inatendu est survenu. Nous nous excusons pour la géne occasionnée. Merci de relancer le programme.\n"); exit(1); } } } void Filename_Release(void) { free(gFilename.pFilename); gFilename.pFilename = NULL; } void Filename_Recovery(void) { s32 nCara = 0; do { Filename_Realloc(); gFilename.pFilename[gFilename.gnFilenameNbCara++] = nCara = fgetc(stdin); // stdin récupère la saisie clavier avant l'appel à entré. }while(nCara != 10); // 10 (caractère LF). gFilename.pFilename[--gFilename.gnFilenameNbCara] = '\0'; }
Partager