From 22917f63ee9ff25f629167b4a54f7d8be37da505 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Mon, 1 Oct 2018 14:21:07 -0700 Subject: Make fclose/pclose distinct. I failed to convince the compiler/linker to just refrain (via factoring out, attribute `noinline`, or meddling with `--icf=none`), but luckily I noticed that we should have CHECK_FP in each function for a better error message, and the distinct error messages keep the two functions apart. (Also add a missing CHECK_FP to `clearerr_unlocked`.) Bug: http://b/116969207 Test: manual with a modified `crasher` Change-Id: Ic122e90e94f7e22f486be57d3dac7137a225d682 --- libc/stdio/stdio.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'libc/stdio/stdio.cpp') diff --git a/libc/stdio/stdio.cpp b/libc/stdio/stdio.cpp index 71fdd273e..d7b69dcb5 100644 --- a/libc/stdio/stdio.cpp +++ b/libc/stdio/stdio.cpp @@ -404,8 +404,7 @@ FILE* freopen(const char* file, const char* mode, FILE* fp) { } __strong_alias(freopen64, freopen); -int fclose(FILE* fp) { - CHECK_FP(fp); +static int __FILE_close(FILE* fp) { if (fp->_flags == 0) { // Already freed! errno = EBADF; @@ -440,7 +439,11 @@ int fclose(FILE* fp) { fp->_flags = 0; return r; } -__strong_alias(pclose, fclose); + +int fclose(FILE* fp) { + CHECK_FP(fp); + return __FILE_close(fp); +} int fileno_unlocked(FILE* fp) { CHECK_FP(fp); @@ -459,6 +462,7 @@ int fileno(FILE* fp) { } void clearerr_unlocked(FILE* fp) { + CHECK_FP(fp); return __sclearerr(fp); } @@ -1235,6 +1239,11 @@ FILE* popen(const char* cmd, const char* mode) { return fp; } +int pclose(FILE* fp) { + CHECK_FP(fp); + return __FILE_close(fp); +} + namespace { namespace phony { -- cgit v1.2.3