Fix: liblttng-ust-fd.so: override fclose symbol
[lttng-ust.git] / liblttng-ust-fd / lttng-ust-fd.c
index 6a095db60803e1cd45f50dce805faaba4d915716..863f0618adefd605ede54dbf1b2cb4981c7338f4 100644 (file)
@@ -31,6 +31,7 @@
 volatile enum ust_loglevel ust_loglevel;
 
 static int (*__lttng_ust_fd_plibc_close)(int fd);
+static int (*__lttng_ust_fd_plibc_fclose)(FILE *stream);
 
 static
 int _lttng_ust_fd_libc_close(int fd)
@@ -45,11 +46,35 @@ int _lttng_ust_fd_libc_close(int fd)
        return lttng_ust_safe_close_fd(fd, __lttng_ust_fd_plibc_close);
 }
 
+static
+int _lttng_ust_fd_libc_fclose(FILE *stream)
+{
+       if (!__lttng_ust_fd_plibc_fclose) {
+               __lttng_ust_fd_plibc_fclose = dlsym(RTLD_NEXT, "fclose");
+               if (!__lttng_ust_fd_plibc_fclose) {
+                       fprintf(stderr, "%s\n", dlerror());
+                       return -1;
+               }
+       }
+       return lttng_ust_safe_fclose_stream(stream,
+                       __lttng_ust_fd_plibc_fclose);
+}
+
 int close(int fd)
 {
        return _lttng_ust_fd_libc_close(fd);
 }
 
+/*
+ * Note: fcloseall() is not an issue because it fcloses only the
+ * streams it knows about, which differs from the problems caused by
+ * gnulib close_stdout(), which does an explicit fclose(stdout).
+ */
+int fclose(FILE *stream)
+{
+       return _lttng_ust_fd_libc_fclose(stream);
+}
+
 #if defined(__sun__) || defined(__FreeBSD__)
 /* Solaris and FreeBSD. */
 void closefrom(int lowfd)
This page took 0.023223 seconds and 4 git commands to generate.