Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
__CODE__
#include<stdio.h>
main( int argc, char **argv, char **env ) {
// Header HTTP obligatoire
printf("Content-type: text/htmlnn");
FILE *f1, *f2;
char path[255];
char ligne[255];
f1 = fopen( "stats.txt" );
if ( f1 != NULL ) {
while( ! feof( f1 ) ) {
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f1 );
}
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
if ( f2 == NULL ) {
printf("Erreur d'ouverture du fichier.");
return 1;
}
while( ! feof( f2 ) ) {
fscanf( f2, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f2 );
}
__CODE__
Je crains le buffer overflow avec la variable buffer. Je pense qu'il y a
aussi un problème lorsqu'une ligne contient plus de 255 caratères.
Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
__CODE__
#include<stdio.h>
main( int argc, char **argv, char **env ) {
// Header HTTP obligatoire
printf("Content-type: text/htmlnn");
FILE *f1, *f2;
char path[255];
char ligne[255];
f1 = fopen( "stats.txt" );
if ( f1 != NULL ) {
while( ! feof( f1 ) ) {
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f1 );
}
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
if ( f2 == NULL ) {
printf("Erreur d'ouverture du fichier.");
return 1;
}
while( ! feof( f2 ) ) {
fscanf( f2, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f2 );
}
__CODE__
Je crains le buffer overflow avec la variable buffer. Je pense qu'il y a
aussi un problème lorsqu'une ligne contient plus de 255 caratères.
Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
__CODE__
#include<stdio.h>
main( int argc, char **argv, char **env ) {
// Header HTTP obligatoire
printf("Content-type: text/htmlnn");
FILE *f1, *f2;
char path[255];
char ligne[255];
f1 = fopen( "stats.txt" );
if ( f1 != NULL ) {
while( ! feof( f1 ) ) {
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f1 );
}
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
if ( f2 == NULL ) {
printf("Erreur d'ouverture du fichier.");
return 1;
}
while( ! feof( f2 ) ) {
fscanf( f2, "%sn", ligne);
printf("%sn", ligne);
}
fclose( f2 );
}
__CODE__
Je crains le buffer overflow avec la variable buffer. Je pense qu'il y a
aussi un problème lorsqu'une ligne contient plus de 255 caratères.
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
f1 = fopen( "stats.txt" );
manque le deuxieme parametre : "r" ou "rb" si le fichier est binaire.
if ( f1 != NULL ) {
pas de diagnostique si le fichier n'existe pas ?
while( ! feof( f1 ) ) {
NON, cette boucle ne fonctionne pas, le test feof(f1) est inapproprié
fscanf( f1, "%sn", ligne);
catastrophe : buffer overflow, faille de sécurité...printf("%sn", ligne);
d'ailleurs cela ne fonctionne pas sur la derniere ligne d'un fichier ne se
terminant pas par un n
voici une alternative simple :
#include <stdio.h>
int catfile(const char *filename, const char *err1, const char *err2) {
FILE *fp;
int c;
if (filename == NULL) {
if (err1)
printf("%s", err1);
return 1;
}
if ((fp = fopen(filename, "rb")) == NULL) {
if (err2)
printf(err2, filename);
return 2;
}
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
/* Header HTTP obligatoire */
printf("Content-type: text/htmlnn");
catfile("stats.txt", NULL, NULL);
catfile(getenv("PATH_TRANSLATED",
"variable PATH_TRANSLATED non définie.n",
"Erreur d'ouverture du fichier %s.n"));
return 0;
}
Comme tu le constates, il est préférable de définir des fonctions pour des
tâches de base, plutôt que de dupliquer le code.
Contrairement aux idées reçues, la boucle de lecture getc()/putc() n'est pas
pénalisante, en particulier si ces fonctions sont implementées par des macros ou
inline comme il se doit.
Chqrlie.
PS: je n'ai pas compilé ce code.
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
f1 = fopen( "stats.txt" );
manque le deuxieme parametre : "r" ou "rb" si le fichier est binaire.
if ( f1 != NULL ) {
pas de diagnostique si le fichier n'existe pas ?
while( ! feof( f1 ) ) {
NON, cette boucle ne fonctionne pas, le test feof(f1) est inapproprié
fscanf( f1, "%sn", ligne);
catastrophe : buffer overflow, faille de sécurité...
printf("%sn", ligne);
d'ailleurs cela ne fonctionne pas sur la derniere ligne d'un fichier ne se
terminant pas par un n
voici une alternative simple :
#include <stdio.h>
int catfile(const char *filename, const char *err1, const char *err2) {
FILE *fp;
int c;
if (filename == NULL) {
if (err1)
printf("%s", err1);
return 1;
}
if ((fp = fopen(filename, "rb")) == NULL) {
if (err2)
printf(err2, filename);
return 2;
}
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
/* Header HTTP obligatoire */
printf("Content-type: text/htmlnn");
catfile("stats.txt", NULL, NULL);
catfile(getenv("PATH_TRANSLATED",
"variable PATH_TRANSLATED non définie.n",
"Erreur d'ouverture du fichier %s.n"));
return 0;
}
Comme tu le constates, il est préférable de définir des fonctions pour des
tâches de base, plutôt que de dupliquer le code.
Contrairement aux idées reçues, la boucle de lecture getc()/putc() n'est pas
pénalisante, en particulier si ces fonctions sont implementées par des macros ou
inline comme il se doit.
Chqrlie.
PS: je n'ai pas compilé ce code.
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
f1 = fopen( "stats.txt" );
manque le deuxieme parametre : "r" ou "rb" si le fichier est binaire.
if ( f1 != NULL ) {
pas de diagnostique si le fichier n'existe pas ?
while( ! feof( f1 ) ) {
NON, cette boucle ne fonctionne pas, le test feof(f1) est inapproprié
fscanf( f1, "%sn", ligne);
catastrophe : buffer overflow, faille de sécurité...printf("%sn", ligne);
d'ailleurs cela ne fonctionne pas sur la derniere ligne d'un fichier ne se
terminant pas par un n
voici une alternative simple :
#include <stdio.h>
int catfile(const char *filename, const char *err1, const char *err2) {
FILE *fp;
int c;
if (filename == NULL) {
if (err1)
printf("%s", err1);
return 1;
}
if ((fp = fopen(filename, "rb")) == NULL) {
if (err2)
printf(err2, filename);
return 2;
}
while ((c = getc(fp)) != EOF)
putchar(c);
fclose(fp);
return 0;
}
int main(int argc, char **argv) {
/* Header HTTP obligatoire */
printf("Content-type: text/htmlnn");
catfile("stats.txt", NULL, NULL);
catfile(getenv("PATH_TRANSLATED",
"variable PATH_TRANSLATED non définie.n",
"Erreur d'ouverture du fichier %s.n"));
return 0;
}
Comme tu le constates, il est préférable de définir des fonctions pour des
tâches de base, plutôt que de dupliquer le code.
Contrairement aux idées reçues, la boucle de lecture getc()/putc() n'est pas
pénalisante, en particulier si ces fonctions sont implementées par des macros ou
inline comme il se doit.
Chqrlie.
PS: je n'ai pas compilé ce code.
Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux
fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
char path[255];
C'est un peu petit pour un path, il est de toute manière préférable de
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
Je crains le buffer overflow
Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux
fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
char path[255];
C'est un peu petit pour un path, il est de toute manière préférable de
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
Je crains le buffer overflow
Bonjour,
Je suis novice sur le forum, et pour cause, je ne connais strictement
rien en C. J'ai besoin d'un petit script CGI qui concatène deux
fichiers.
J'ai fait ça ce week end, ça compile, ça fonctionne mais je voudrais
l'avis de spécialistes sur le code.
char path[255];
C'est un peu petit pour un path, il est de toute manière préférable de
fscanf( f1, "%sn", ligne);
printf("%sn", ligne);
sprintf(path,"%s",getenv("PATH_TRANSLATED"));
f2 = fopen( path, "r" );
Je crains le buffer overflow
f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
shrom wrote on 30/03/05 :
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
#include <stdio.h>
#include <string.h>
int main (void)
{
int ret = EXIT_SUCCESS;
static char const F_STAT[] = "stats.txt";
static char const VAR[] = "PATH_TRANSLATED";
/* Header HTTP obligatoire */
printf ("Content-type: text/htmlnn");
{
FILE *f1 = fopen (F_STAT, "r");
if (f1 != NULL)
{
char ligne[255];
while (fgets (ligne, sizeof ligne, f1))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f1), f1 = NULL;
{
char *path = getenv (VAR);
if (path != NULL)
{
FILE *f2 = fopen (path, "r");
if (f2 != NULL)
{
while (fgets (ligne, sizeof ligne, f2))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f2), f2 = NULL;
}
else
{
printf ("Fichier %s inconnun", path);
ret = EXIT_FAILURE;
}
}
else
{
printf ("Variable %s inconnuen", VAR);
}
}
}
else
{
printf ("Fichier %s inconnun", F_STAT);
ret = EXIT_FAILURE;
}
}
return ret;
}
shrom wrote on 30/03/05 :
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
#include <stdio.h>
#include <string.h>
int main (void)
{
int ret = EXIT_SUCCESS;
static char const F_STAT[] = "stats.txt";
static char const VAR[] = "PATH_TRANSLATED";
/* Header HTTP obligatoire */
printf ("Content-type: text/htmlnn");
{
FILE *f1 = fopen (F_STAT, "r");
if (f1 != NULL)
{
char ligne[255];
while (fgets (ligne, sizeof ligne, f1))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f1), f1 = NULL;
{
char *path = getenv (VAR);
if (path != NULL)
{
FILE *f2 = fopen (path, "r");
if (f2 != NULL)
{
while (fgets (ligne, sizeof ligne, f2))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f2), f2 = NULL;
}
else
{
printf ("Fichier %s inconnun", path);
ret = EXIT_FAILURE;
}
}
else
{
printf ("Variable %s inconnuen", VAR);
}
}
}
else
{
printf ("Fichier %s inconnun", F_STAT);
ret = EXIT_FAILURE;
}
}
return ret;
}
shrom wrote on 30/03/05 :
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
#include <stdio.h>
#include <string.h>
int main (void)
{
int ret = EXIT_SUCCESS;
static char const F_STAT[] = "stats.txt";
static char const VAR[] = "PATH_TRANSLATED";
/* Header HTTP obligatoire */
printf ("Content-type: text/htmlnn");
{
FILE *f1 = fopen (F_STAT, "r");
if (f1 != NULL)
{
char ligne[255];
while (fgets (ligne, sizeof ligne, f1))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f1), f1 = NULL;
{
char *path = getenv (VAR);
if (path != NULL)
{
FILE *f2 = fopen (path, "r");
if (f2 != NULL)
{
while (fgets (ligne, sizeof ligne, f2))
{
printf ("%s", ligne);
}
fflush (stdout);
fclose (f2), f2 = NULL;
}
else
{
printf ("Fichier %s inconnun", path);
ret = EXIT_FAILURE;
}
}
else
{
printf ("Variable %s inconnuen", VAR);
}
}
}
else
{
printf ("Fichier %s inconnun", F_STAT);
ret = EXIT_FAILURE;
}
}
return ret;
}
Harpo wrote on 30/03/05 :f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
si getenv() renvoi NULL, t'es mal...
Harpo wrote on 30/03/05 :
f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
si getenv() renvoi NULL, t'es mal...
Harpo wrote on 30/03/05 :f2 = fopen( getenv( "PATH_TRANSLATED" ), "r" ) ) ;
est suffisant.
si getenv() renvoi NULL, t'es mal...
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
Ton code est truffé de problèmes... Il serait préférable d'utiliser un autre
langage pour un but aussi simple.
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
Interessant, avec ta permission, je mettrai un lien sur mes pages.
Je reproche à ta solution d'utiliser fgets() alors qu'il n'y a aucun
interêt à utiliser une ligne, celle-ci ne faisant l'objet d'aucun
traitement particulier en tant que ligne.
De plus, pour bien faire, il faudrait gérer les possibles troncatures,
et 255 (pourquoi 255 ?) n'est pas très grand (surtout dans ce cas où il
s'agit d'html (parfois généré par des programmes qui ne prennent pas le
soin de mettre des n et d'indenter correctement, ces sauvages!)).
getc()/putchar() permettent d'éviter ces problèmes (débordement et
troncature) sans apporter d'overhead significatif (voire pas d'overhead
du tout) et le code est plus simple.
Faire une fonction pour faire 2 choses similaires me semblait aussi être
une bonne chose. (bon je ne me suis pas amusé à compiler le programme
de Charlie G. et à le tester, mais a première vue il a l'air correct.)
Le fait d'imbriquer autant les blocks est peut-être élégant mais ne
simplifie pas la lecture quand un block ne tient pas sur une page
d'écran et ici il n'y a pas d'interêt particulier à le faire. Utiliser
une fonction permet de simplifier la lecture. C'est aussi très
important, ama.
Sinon, quelle est dans le cas présent l'utilité du fflush( stdout ) ?
faire patienter le client ?
Dois-je présenter une solution avec des goto ? ;-)
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
Interessant, avec ta permission, je mettrai un lien sur mes pages.
Je reproche à ta solution d'utiliser fgets() alors qu'il n'y a aucun
interêt à utiliser une ligne, celle-ci ne faisant l'objet d'aucun
traitement particulier en tant que ligne.
De plus, pour bien faire, il faudrait gérer les possibles troncatures,
et 255 (pourquoi 255 ?) n'est pas très grand (surtout dans ce cas où il
s'agit d'html (parfois généré par des programmes qui ne prennent pas le
soin de mettre des n et d'indenter correctement, ces sauvages!)).
getc()/putchar() permettent d'éviter ces problèmes (débordement et
troncature) sans apporter d'overhead significatif (voire pas d'overhead
du tout) et le code est plus simple.
Faire une fonction pour faire 2 choses similaires me semblait aussi être
une bonne chose. (bon je ne me suis pas amusé à compiler le programme
de Charlie G. et à le tester, mais a première vue il a l'air correct.)
Le fait d'imbriquer autant les blocks est peut-être élégant mais ne
simplifie pas la lecture quand un block ne tient pas sur une page
d'écran et ici il n'y a pas d'interêt particulier à le faire. Utiliser
une fonction permet de simplifier la lecture. C'est aussi très
important, ama.
Sinon, quelle est dans le cas présent l'utilité du fflush( stdout ) ?
faire patienter le client ?
Dois-je présenter une solution avec des goto ? ;-)
Bel effort, mais il y a quelques erreurs. Pour approfondir:
http://mapage.noos.fr/emdel/notes.htm
Interessant, avec ta permission, je mettrai un lien sur mes pages.
Je reproche à ta solution d'utiliser fgets() alors qu'il n'y a aucun
interêt à utiliser une ligne, celle-ci ne faisant l'objet d'aucun
traitement particulier en tant que ligne.
De plus, pour bien faire, il faudrait gérer les possibles troncatures,
et 255 (pourquoi 255 ?) n'est pas très grand (surtout dans ce cas où il
s'agit d'html (parfois généré par des programmes qui ne prennent pas le
soin de mettre des n et d'indenter correctement, ces sauvages!)).
getc()/putchar() permettent d'éviter ces problèmes (débordement et
troncature) sans apporter d'overhead significatif (voire pas d'overhead
du tout) et le code est plus simple.
Faire une fonction pour faire 2 choses similaires me semblait aussi être
une bonne chose. (bon je ne me suis pas amusé à compiler le programme
de Charlie G. et à le tester, mais a première vue il a l'air correct.)
Le fait d'imbriquer autant les blocks est peut-être élégant mais ne
simplifie pas la lecture quand un block ne tient pas sur une page
d'écran et ici il n'y a pas d'interêt particulier à le faire. Utiliser
une fonction permet de simplifier la lecture. C'est aussi très
important, ama.
Sinon, quelle est dans le cas présent l'utilité du fflush( stdout ) ?
faire patienter le client ?
Dois-je présenter une solution avec des goto ? ;-)