diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2014-11-13 14:05:01 +0200 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2014-11-13 14:05:01 +0200 |
commit | 581d232670be67eb51d3839c43f1113507a89185 (patch) | |
tree | c1593d21b75ed82f1d44f238217eb2c1724e03ac /libgfortran/intrinsics/env.c | |
parent | 95cc11e1634c8faa09ab161564a13c1ae9ec1794 (diff) | |
download | gcc-581d232670be67eb51d3839c43f1113507a89185.zip gcc-581d232670be67eb51d3839c43f1113507a89185.tar.gz gcc-581d232670be67eb51d3839c43f1113507a89185.tar.bz2 |
PR 60324 Unbounded stack allocations in libgfortran.
2014-11-13 Janne Blomqvist <jb@gcc.gnu.org>
PR libfortran/60324
* configure: Regenerated.
* configure.ac (AM_CFLAGS): Add Werror=vla.
* libgfortran.h (gfc_alloca): Remove macro.
(fc_strdup_notrim): New prototype.
* intrinsics/access.c (access_func): Use fc_strdup rather than
stack allocation.
* intrinsics/chdir.c (chdir_i4_sub): Likewise.
(chdir_i8_sub): Likewise.
* intrinsics/chmod.c (chmod_internal): New function, move logic
here.
(chmod_func): Call chmod_internal.
* intrinsics/env.c (getenv): Use fc_strdup rather than stack
allocation.
(get_environment_variable_i4): Likewise.
* intrinsics/execute_command_line.c (execute_command_line):
Likewise.
* intrinsics/hostnm.c (hostnm_0): New function, use static buffer
rather than VLA.
(hostnm_i4_sub): Call hostnm_0.
(hostnm_i8_sub): Likewise.
(hostnm): Likewise.
* intrinsics/link.c (link_internal): New function, use fc_strdup
rather than stack allocation.
(link_i4_sub): Call link_internal.
(link_i8_sub): Likewise.
(link_i4): Likewise.
(link_i8): Likewise.
* intrinsics/perror.c (perror_sub): Use fc_strdup rather than
stack allocation.
* intrinsics/random.c (random_seed_i4): Use static buffer rather
than VLA, use _Static_assert to make sure it's big enough.
* intrinsics/rename.c (rename_internal): New function, use
fc_strdup rather than stack allocation.
(rename_i4_sub): Call rename_internal.
(rename_i8_sub): Likewise.
(rename_i4): Likewise.
(rename_i8): Likewise.
* intrinsics/stat.c (stat_i4_sub_0): Use fc_strdup rather than
stack allocation.
(stat_i8_sub_0): Likewise.
* intrinsics/symlink.c (symlnk_internal): New function, use
fc_strdup rather than stack allocation.
(symlnk_i4_sub): Call symlnk_internal.
(symlnk_i8_sub): Likewise.
(symlnk_i4): Likewise.
(symlnk_i8): Likewise.
* intrinsics/system.c (system_sub): Use fc_strdup rather than
stack allocation.
* intrinsics/unlink.c (unlink_i4_sub): Likewise.
* io/file_pos.c (READ_CHUNK): Make it a macro rather than variable.
* io/list_read.c (nml_get_obj_data): Use fixed stack buffer, fall
back to xmalloc/free for large sizes.
* io/read.c (read_f): Likewise.
* io/transfer.c (MAX_READ): Make it a macro rather than variable.
(WRITE_CHUNK): Likewise.
* io/write_float.def (write_float): Use fixed stack buffer, fall
back to xmalloc/free for large sizes.
* runtime/string.c (fc_strdup_notrim): New function.
From-SVN: r217480
Diffstat (limited to 'libgfortran/intrinsics/env.c')
-rw-r--r-- | libgfortran/intrinsics/env.c | 30 |
1 files changed, 9 insertions, 21 deletions
diff --git a/libgfortran/intrinsics/env.c b/libgfortran/intrinsics/env.c index 9f45073..ffdc54a 100644 --- a/libgfortran/intrinsics/env.c +++ b/libgfortran/intrinsics/env.c @@ -52,27 +52,19 @@ PREFIX(getenv) (char * name, char * value, gfc_charlen_type name_len, else memset (value, ' ', value_len); /* Blank the string. */ - /* Trim trailing spaces from name. */ - while (name_len > 0 && name[name_len - 1] == ' ') - name_len--; - /* Make a null terminated copy of the string. */ - name_nt = gfc_alloca (name_len + 1); - memcpy (name_nt, name, name_len); - name_nt[name_len] = '\0'; + name_nt = fc_strdup (name, name_len); res = getenv(name_nt); + free (name_nt); + /* If res is NULL, it means that the environment variable didn't exist, so just return. */ if (res == NULL) return; - res_len = strlen(res); - if (value_len < res_len) - memcpy (value, res, value_len); - else - memcpy (value, res, res_len); + cf_strcpy (value, value_len, res); } @@ -127,18 +119,14 @@ get_environment_variable_i4 (char *name, char *value, GFC_INTEGER_4 *length, } if ((!trim_name) || *trim_name) - { - /* Trim trailing spaces from name. */ - while (name_len > 0 && name[name_len - 1] == ' ') - name_len--; - } - /* Make a null terminated copy of the name. */ - name_nt = gfc_alloca (name_len + 1); - memcpy (name_nt, name, name_len); - name_nt[name_len] = '\0'; + name_nt = fc_strdup (name, name_len); + else + name_nt = fc_strdup_notrim (name, name_len); res = getenv(name_nt); + free (name_nt); + if (res == NULL) stat = GFC_NAME_DOES_NOT_EXIST; else |