From 1ede59e4c72ec83a3382e5ca5f4779c819977a8c Mon Sep 17 00:00:00 2001 From: Jerry DeLisle Date: Tue, 17 Dec 2013 03:06:04 +0000 Subject: [PATCH] re PR libfortran/59419 (Failing OPEN with FILE='xxx' and IOSTAT creates the file 'xxx' after revision 196783) 2013-12-16 Jerry DeLisle 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 --- libgfortran/ChangeLog | 10 +++++ libgfortran/io/file_pos.c | 6 ++- libgfortran/io/open.c | 77 +++++++++++++++++++++------------------ libgfortran/io/transfer.c | 8 +++- 4 files changed, 63 insertions(+), 38 deletions(-) diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index ec2be14a4b6..1c6c4da40fd 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,13 @@ +2013-12-16 Jerry DeLisle + + 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. + 2013-12-11 Tobias Burnus * config/fpu-387.h (sigill_hdlr, get_fpu_rounding_mode): Emit SSE diff --git a/libgfortran/io/file_pos.c b/libgfortran/io/file_pos.c index 8b4fda3dd91..d8dd361e568 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 cca0ecc714f..a5cfb4ea4ca 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 0b1540ce2af..85003cc1f83 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) -- 2.30.2