From 2b9282d5ee9f82de5df5dd233f755905205c0ede Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Thu, 15 Oct 2020 21:08:01 +0800 Subject: [PATCH] libc: Skip close stdin/stdout/stderr in fclose Signed-off-by: Xiang Xiao --- libs/libc/stdio/lib_fclose.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/libs/libc/stdio/lib_fclose.c b/libs/libc/stdio/lib_fclose.c index 1842d5fae9..a2302a25a8 100644 --- a/libs/libc/stdio/lib_fclose.c +++ b/libs/libc/stdio/lib_fclose.c @@ -81,6 +81,23 @@ int fclose(FAR FILE *stream) if (stream) { + ret = OK; + + /* If the stream was opened for writing, then flush the stream */ + + if ((stream->fs_oflags & O_WROK) != 0) + { + ret = lib_fflush(stream, true); + errcode = get_errno(); + } + + /* Skip close the builtin streams(stdin, stdout and stderr) */ + + if (stream == stdin || stream == stdout || stream == stderr) + { + goto done; + } + /* Remove FILE structure from the stream list */ slist = nxsched_get_streams(); @@ -114,17 +131,8 @@ int fclose(FAR FILE *stream) * file. */ - ret = OK; if (stream->fs_fd >= 0) { - /* If the stream was opened for writing, then flush the stream */ - - if ((stream->fs_oflags & O_WROK) != 0) - { - ret = lib_fflush(stream, true); - errcode = get_errno(); - } - /* Close the file descriptor and save the return status */ status = close(stream->fs_fd); @@ -157,6 +165,7 @@ int fclose(FAR FILE *stream) lib_free(stream); } +done: /* On an error, reset the errno to the first error encountered and return * EOF. */