aboutsummaryrefslogtreecommitdiff
path: root/libgfortran/io
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2013-12-17 03:06:04 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2013-12-17 03:06:04 +0000
commit1ede59e4c72ec83a3382e5ca5f4779c819977a8c (patch)
treeec8d3e6892e8fe0b968cd1630db981e970c6a72e /libgfortran/io
parent01d90185267d21a6f7c9a97722c1c71b3f1139dd (diff)
downloadgcc-1ede59e4c72ec83a3382e5ca5f4779c819977a8c.zip
gcc-1ede59e4c72ec83a3382e5ca5f4779c819977a8c.tar.gz
gcc-1ede59e4c72ec83a3382e5ca5f4779c819977a8c.tar.bz2
re PR libfortran/59419 (Failing OPEN with FILE='xxx' and IOSTAT creates the file 'xxx' after revision 196783)
2013-12-16 Jerry DeLisle <jvdelisle@gcc.gnu> PR libfortran/59419 * io/file_pos.c (st_rewind): Do proper return after generate_error. * io/open.c (edit_modes): Move action code inside block that checks for library ok. (new_unit): Do cleanup after error. (st_open): Do proper return after error. * io/transfer.c (data_transfer_init): Likewise. From-SVN: r206039
Diffstat (limited to 'libgfortran/io')
-rw-r--r--libgfortran/io/file_pos.c6
-rw-r--r--libgfortran/io/open.c77
-rw-r--r--libgfortran/io/transfer.c8
3 files changed, 53 insertions, 38 deletions
diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c
index 8b4fda3..d8dd361 100644
--- a/libgfortran/io/file_pos.c
+++ b/libgfortran/io/file_pos.c
@@ -410,7 +410,11 @@ st_rewind (st_parameter_filepos *fpp)
u->last_record = 0;
if (sseek (u->s, 0, SEEK_SET) < 0)
- generate_error (&fpp->common, LIBERROR_OS, NULL);
+ {
+ generate_error (&fpp->common, LIBERROR_OS, NULL);
+ library_end ();
+ return;
+ }
/* Set this for compatibilty with g77 for /dev/null. */
if (ssize (u->s) == 0)
diff --git a/libgfortran/io/open.c b/libgfortran/io/open.c
index cca0ecc..a5cfb4e 100644
--- a/libgfortran/io/open.c
+++ b/libgfortran/io/open.c
@@ -265,39 +265,39 @@ edit_modes (st_parameter_open *opp, gfc_unit * u, unit_flags * flags)
u->flags.round = flags->round;
if (flags->sign != SIGN_UNSPECIFIED)
u->flags.sign = flags->sign;
- }
-
- /* Reposition the file if necessary. */
-
- switch (flags->position)
- {
- case POSITION_UNSPECIFIED:
- case POSITION_ASIS:
- break;
-
- case POSITION_REWIND:
- if (sseek (u->s, 0, SEEK_SET) != 0)
- goto seek_error;
-
- u->current_record = 0;
- u->last_record = 0;
-
- test_endfile (u);
- break;
- case POSITION_APPEND:
- if (sseek (u->s, 0, SEEK_END) < 0)
- goto seek_error;
-
- if (flags->access != ACCESS_STREAM)
- u->current_record = 0;
-
- u->endfile = AT_ENDFILE; /* We are at the end. */
- break;
-
- seek_error:
- generate_error (&opp->common, LIBERROR_OS, NULL);
- break;
+ /* Reposition the file if necessary. */
+
+ switch (flags->position)
+ {
+ case POSITION_UNSPECIFIED:
+ case POSITION_ASIS:
+ break;
+
+ case POSITION_REWIND:
+ if (sseek (u->s, 0, SEEK_SET) != 0)
+ goto seek_error;
+
+ u->current_record = 0;
+ u->last_record = 0;
+
+ test_endfile (u);
+ break;
+
+ case POSITION_APPEND:
+ if (sseek (u->s, 0, SEEK_END) < 0)
+ goto seek_error;
+
+ if (flags->access != ACCESS_STREAM)
+ u->current_record = 0;
+
+ u->endfile = AT_ENDFILE; /* We are at the end. */
+ break;
+
+ seek_error:
+ generate_error (&opp->common, LIBERROR_OS, NULL);
+ break;
+ }
}
unlock_unit (u);
@@ -562,7 +562,10 @@ new_unit (st_parameter_open *opp, gfc_unit *u, unit_flags * flags)
if (flags->position == POSITION_APPEND)
{
if (sseek (u->s, 0, SEEK_END) < 0)
- generate_error (&opp->common, LIBERROR_OS, NULL);
+ {
+ generate_error (&opp->common, LIBERROR_OS, NULL);
+ goto cleanup;
+ }
u->endfile = AT_ENDFILE;
}
@@ -852,8 +855,12 @@ st_open (st_parameter_open *opp)
{
u = find_unit (opp->common.unit);
if (u == NULL) /* Negative unit and no NEWUNIT-created unit found. */
- generate_error (&opp->common, LIBERROR_BAD_OPTION,
- "Bad unit number in OPEN statement");
+ {
+ generate_error (&opp->common, LIBERROR_BAD_OPTION,
+ "Bad unit number in OPEN statement");
+ library_end ();
+ return;
+ }
}
if (u == NULL)
diff --git a/libgfortran/io/transfer.c b/libgfortran/io/transfer.c
index 0b1540c..85003cc 100644
--- a/libgfortran/io/transfer.c
+++ b/libgfortran/io/transfer.c
@@ -2490,14 +2490,18 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
if ((cf & IOPARM_DT_HAS_NAMELIST_NAME) != 0 && dtp->u.p.ionml != NULL)
{
if ((cf & IOPARM_DT_HAS_FORMAT) != 0)
- generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
- "A format cannot be specified with a namelist");
+ {
+ generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
+ "A format cannot be specified with a namelist");
+ return;
+ }
}
else if (dtp->u.p.current_unit->flags.form == FORM_FORMATTED &&
!(cf & (IOPARM_DT_HAS_FORMAT | IOPARM_DT_LIST_FORMAT)))
{
generate_error (&dtp->common, LIBERROR_OPTION_CONFLICT,
"Missing format for FORMATTED data transfer");
+ return;
}
if (is_internal_unit (dtp)