]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/blobdiff - src/coloredstderr.c
Handle invalid arguments to close()/fclose() better.
[coloredstderr/coloredstderr.git] / src / coloredstderr.c
index cc588836817b4dfaad26713b7a3b24f77c145cff..b7e71e17871d6f7c7411c4c922d48cfcb2530680 100644 (file)
@@ -35,6 +35,9 @@
 #ifdef HAVE_ERROR_H
 # include <error.h>
 #endif
+#ifdef HAVE_STRUCT__IO_FILE__FILENO
+# include <libio.h>
+#endif
 
 /* Conflicting declaration in glibc. */
 #undef fwrite_unlocked
@@ -241,6 +244,10 @@ HOOK_FILE2(int, putc_unlocked, stream,
            int, c, FILE *, stream)
 HOOK_FILE1(int, putchar_unlocked, stdout,
            int, c)
+/* glibc defines (_IO_)putc_unlocked() to __overflow() in some cases. */
+#ifdef HAVE_STRUCT__IO_FILE__FILENO
+HOOK_FD2(int, __overflow, f->_fileno, _IO_FILE *, f, int, ch)
+#endif
 
 /* perror(3) */
 HOOK_VOID1(void, perror, STDERR_FILENO,
@@ -389,14 +396,20 @@ static int (*real_close)(int);
 int close(int fd) {
     DLSYM_FUNCTION(real_close, "close");
 
-    close_fd(fd);
+    if (fd >= 0) {
+        close_fd(fd);
+    }
     return real_close(fd);
 }
 static int (*real_fclose)(FILE *);
 int fclose(FILE *fp) {
+    int fd;
+
     DLSYM_FUNCTION(real_fclose, "fclose");
 
-    close_fd(fileno(fp));
+    if (fp != NULL && (fd = fileno(fp)) >= 0) {
+        close_fd(fd);
+    }
     return real_fclose(fp);
 }