[Bug fortran/23065] MAXPATHLEN usage in fortran/{scanner,module}.c
Steve Kargl
sgk@troutmask.apl.washington.edu
Sat Aug 13 08:00:00 GMT 2005
Ping !
On Mon, Aug 01, 2005 at 11:25:58AM -0700, Steve Kargl wrote:
> On Mon, Aug 01, 2005 at 04:46:17PM -0000, pinskia at gcc dot gnu dot org wrote:
> >
> > Well in both the cases in the fortran front-end, really an alloca
> > should be used instead of MAXPATHLEN.
> >
>
> The attached patches uses alloca to remove the use of PATH_MAX
> from gfortran. It also fixes one other nearby hardcoded buffer.
>
> This has been bubblestrapped and regression tested on amd64-*-freebsd.
>
> 2005-08-01 Steven G. Kargl <kargls@comcast.net>
>
> PR fortran/23065
> * gfortran.h: Remove PATH_MAX definition.
> * module.c (write_module,gfc_dump_module): Use alloca to allocate buffers.
> * scanner.s (gfc_release_include_path,form_from_filename): Ditto.
>
> --
> Steve
> Index: gfortran.h
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/gfortran.h,v
> retrieving revision 1.76
> diff -c -p -r1.76 gfortran.h
> *** gfortran.h 14 Jul 2005 10:12:16 -0000 1.76
> --- gfortran.h 1 Aug 2005 18:16:47 -0000
> *************** typedef struct
> *** 509,521 ****
> #endif
>
>
> - #include <limits.h>
> - #ifndef PATH_MAX
> - # include <sys/param.h>
> - # define PATH_MAX MAXPATHLEN
> - #endif
> -
> -
> extern int gfc_suppress_error;
>
>
> --- 509,514 ----
> Index: module.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/module.c,v
> retrieving revision 1.34
> diff -c -p -r1.34 module.c
> *** module.c 25 Jun 2005 00:40:35 -0000 1.34
> --- module.c 1 Aug 2005 18:16:47 -0000
> *************** write_module (void)
> *** 3479,3492 ****
> void
> gfc_dump_module (const char *name, int dump_flag)
> {
> ! char filename[PATH_MAX], *p;
> time_t now;
>
> ! filename[0] = '\0';
> if (gfc_option.module_dir != NULL)
> ! strcpy (filename, gfc_option.module_dir);
> !
> ! strcat (filename, name);
> strcat (filename, MODULE_EXTENSION);
>
> if (!dump_flag)
> --- 3479,3500 ----
> void
> gfc_dump_module (const char *name, int dump_flag)
> {
> ! int n;
> ! char *filename, *p;
> time_t now;
>
> ! n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
> if (gfc_option.module_dir != NULL)
> ! {
> ! filename = (char *) alloca (n + strlen (gfc_option.module_dir));
> ! strcpy (filename, gfc_option.module_dir);
> ! strcat (filename, name);
> ! }
> ! else
> ! {
> ! filename = (char *) alloca (n);
> ! strcpy (filename, name);
> ! }
> strcat (filename, MODULE_EXTENSION);
>
> if (!dump_flag)
> *************** gfc_dump_module (const char *name, int d
> *** 3532,3541 ****
> void
> gfc_use_module (void)
> {
> ! char filename[GFC_MAX_SYMBOL_LEN + 5];
> gfc_state_data *p;
> int c, line;
>
> strcpy (filename, module_name);
> strcat (filename, MODULE_EXTENSION);
>
> --- 3540,3551 ----
> void
> gfc_use_module (void)
> {
> ! char *filename;
> gfc_state_data *p;
> int c, line;
>
> + filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
> + + 1);
> strcpy (filename, module_name);
> strcat (filename, MODULE_EXTENSION);
>
> Index: scanner.c
> ===================================================================
> RCS file: /cvs/gcc/gcc/gcc/fortran/scanner.c,v
> retrieving revision 1.22
> diff -c -p -r1.22 scanner.c
> *** scanner.c 14 Jul 2005 07:14:37 -0000 1.22
> --- scanner.c 1 Aug 2005 18:16:47 -0000
> *************** gfc_release_include_path (void)
> *** 164,170 ****
> FILE *
> gfc_open_included_file (const char *name)
> {
> ! char fullname[PATH_MAX];
> gfc_directorylist *p;
> FILE *f;
>
> --- 164,170 ----
> FILE *
> gfc_open_included_file (const char *name)
> {
> ! char *fullname;
> gfc_directorylist *p;
> FILE *f;
>
> *************** gfc_open_included_file (const char *name
> *** 174,182 ****
>
> for (p = include_dirs; p; p = p->next)
> {
> ! if (strlen (p->path) + strlen (name) + 1 > PATH_MAX)
> ! continue;
> !
> strcpy (fullname, p->path);
> strcat (fullname, name);
>
> --- 174,180 ----
>
> for (p = include_dirs; p; p = p->next)
> {
> ! fullname = (char *) alloca(strlen (p->path) + strlen (name) + 1);
> strcpy (fullname, p->path);
> strcat (fullname, name);
>
> *************** form_from_filename (const char *filename
> *** 1133,1147 ****
> const char *fileext;
> int i;
>
> ! /* Find end of file name. */
> i = 0;
> ! while ((i < PATH_MAX) && (filename[i] != '\0'))
> i++;
>
> - /* Improperly terminated or too-long filename. */
> - if (i == PATH_MAX)
> - return FORM_UNKNOWN;
> -
> /* Find last period. */
> while (i >= 0 && (filename[i] != '.'))
> i--;
> --- 1131,1142 ----
> const char *fileext;
> int i;
>
> ! /* Find end of file name. Note, filename is either a NULL pointer or
> ! a NUL terminated string. */
> i = 0;
> ! while (filename[i] != '\0')
> i++;
>
> /* Find last period. */
> while (i >= 0 && (filename[i] != '.'))
> i--;
--
Steve
More information about the Fortran
mailing list