]> ruderich.org/simon Gitweb - coloredstderr/coloredstderr.git/commitdiff
Handle invalid arguments to close()/fclose() better.
authorSimon Ruderich <simon@ruderich.org>
Thu, 13 Jun 2013 19:19:15 +0000 (21:19 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 13 Jun 2013 19:19:15 +0000 (21:19 +0200)
src/coloredstderr.c
tests/example.c

index db6cb27e9f14771a70581222ece7704b816c8d7e..b7e71e17871d6f7c7411c4c922d48cfcb2530680 100644 (file)
@@ -396,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);
 }
 
index 0fee9733f100a28dba8f0226a8aada01059acef4..b1d42e3e53f7b4c84cf28ca820c1290585f0f1d4 100644 (file)
@@ -56,5 +56,13 @@ int main(int argc, char **argv unused) {
     putc_unlocked('x', stderr);
     putc_unlocked('\n', stdout);
 
+    /* Test invalid stuff. */
+    close(-42);
+    close(-4711);
+    /* Can't test this, results in a segfault with the "normal" fclose(). */
+    /*fclose(NULL);*/
+    dup(-12);
+    dup2(12, -42);
+
     return EXIT_SUCCESS;
 }