Warn and return on fd overflow fdt
[lttng-modules.git] / src / lttng-statedump-impl.c
index 22e3628ba459c9d0b56db7d2e9b90417ce71fed8..5ea790f59a1d26e2e889766a54a439f454203d83 100644 (file)
 
 #include <lttng/events.h>
 #include <lttng/tracer.h>
 
 #include <lttng/events.h>
 #include <lttng/tracer.h>
+#include <lttng/events-internal.h>
 #include <wrapper/cpu.h>
 #include <wrapper/irqdesc.h>
 #include <wrapper/fdtable.h>
 #include <wrapper/tracepoint.h>
 #include <wrapper/blkdev.h>
 #include <wrapper/cpu.h>
 #include <wrapper/irqdesc.h>
 #include <wrapper/fdtable.h>
 #include <wrapper/tracepoint.h>
 #include <wrapper/blkdev.h>
-#include <wrapper/fdtable.h>
 #include <wrapper/sched.h>
 
 /* Define the tracepoints, but do not build the probes */
 #include <wrapper/sched.h>
 
 /* Define the tracepoints, but do not build the probes */
@@ -191,7 +191,8 @@ enum lttng_process_status {
 };
 
 
 };
 
 
-#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0))
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,0,0) || \
+    LTTNG_RHEL_KERNEL_RANGE(5,14,0,163,0,0, 5,15,0,0,0,0))
 
 #define LTTNG_PART_STRUCT_TYPE struct block_device
 
 
 #define LTTNG_PART_STRUCT_TYPE struct block_device
 
@@ -385,6 +386,20 @@ void lttng_enumerate_device(struct lttng_kernel_session *session,
        }
 }
 
        }
 }
 
+#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,9,0))
+static
+int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
+{
+       struct net_device *dev;
+
+       rtnl_lock();
+       for_each_netdev(&init_net, dev)
+               lttng_enumerate_device(session, dev);
+       rtnl_unlock();
+
+       return 0;
+}
+#else
 static
 int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
 {
 static
 int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
 {
@@ -397,6 +412,7 @@ int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
 
        return 0;
 }
 
        return 0;
 }
+#endif /* (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(6,9,0)) */
 #else /* CONFIG_INET */
 static inline
 int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
 #else /* CONFIG_INET */
 static inline
 int lttng_enumerate_network_ip_interface(struct lttng_kernel_session *session)
@@ -419,17 +435,22 @@ int lttng_dump_one_fd(const void *p, struct file *file, unsigned int fd)
         */
        flags &= ~FMODE_NONOTIFY;
        fdt = files_fdtable(ctx->files);
         */
        flags &= ~FMODE_NONOTIFY;
        fdt = files_fdtable(ctx->files);
+
        /*
        /*
-        * We need to check here again whether fd is within the fdt
-        * max_fds range, because we might be seeing a different
-        * files_fdtable() than iterate_fd(), assuming only RCU is
-        * protecting the read. In reality, iterate_fd() holds
-        * file_lock, which should ensure the fdt does not change while
-        * the lock is taken, but we are not aware whether this is
-        * guaranteed or not, so play safe.
+        * The fdt should only grow and iterate_fd() holds file_lock, which
+        * should ensure the fdt does not change while the lock is taken but be
+        * cautious and check anyway.
         */
         */
-       if (fd < fdt->max_fds && close_on_exec(fd, fdt))
+       if (WARN_ON_ONCE(fd >= fdt->max_fds))
+               return 0;
+
+       if (lttng_close_on_exec(fd, ctx->files))
                flags |= O_CLOEXEC;
                flags |= O_CLOEXEC;
+
+       /*
+        * If d_path() failed to get a full path for the file, use the dentry
+        * name instead to at least get a filename.
+        */
        if (IS_ERR(s)) {
                struct dentry *dentry = file->f_path.dentry;
 
        if (IS_ERR(s)) {
                struct dentry *dentry = file->f_path.dentry;
 
This page took 0.038747 seconds and 4 git commands to generate.