Skip to content

Commit 10de77b

Browse files
committed
Implement retrieval of unix socket path from syslog message when not present in socket.
1 parent 77be0a3 commit 10de77b

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/kflowd.bpf.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,10 +1833,11 @@ static __always_inline int handle_unix_event(void *ctx, const struct SOCK_EVENT_
18331833
struct msghdr *msg;
18341834
struct sock *sock;
18351835
struct unix_sock *unix_sock;
1836+
struct sockaddr_un *sunaddr;
18361837
struct SOCK_INFO *sinfo;
18371838
struct SOCK_QUEUE sq = {0};
18381839
struct STATS *s;
1839-
char comm[TASK_COMM_LEN] = {0};
1840+
char path[UNIX_PATH_MAX] = {0};
18401841
char *data;
18411842
__u32 data_len;
18421843
__u16 family;
@@ -1871,16 +1872,20 @@ static __always_inline int handle_unix_event(void *ctx, const struct SOCK_EVENT_
18711872
isrx = event->isrx;
18721873
func = event->func;
18731874

1874-
/* get unix socket and check syslog sockets */
1875+
/* get unix socket and path */
18751876
if (isrx)
18761877
unix_sock = (struct unix_sock *)sock;
18771878
else
18781879
unix_sock = (struct unix_sock *)BPF_CORE_READ((struct unix_sock *)sock, peer);
1879-
bpf_probe_read_kernel_str(comm, sizeof(comm), BPF_CORE_READ(task, mm, exe_file, f_path.dentry, d_name.name));
1880-
if (__builtin_memcmp(BPF_CORE_READ(unix_sock, addr, name[0].sun_path), SYSLOG_DEVLOG_SOCKET,
1881-
sizeof(SYSLOG_DEVLOG_SOCKET)) &&
1882-
__builtin_memcmp(BPF_CORE_READ(unix_sock, addr, name[0].sun_path), SYSLOG_JOURNAL_SOCKET,
1883-
sizeof(SYSLOG_JOURNAL_SOCKET)))
1880+
bpf_probe_read_kernel_str(&path, sizeof(path), BPF_CORE_READ(unix_sock, addr, name[0].sun_path));
1881+
if (!path[0]) {
1882+
sunaddr = (struct sockaddr_un *)BPF_CORE_READ(msg, msg_name);
1883+
bpf_probe_read_kernel_str(&path, sizeof(path), BPF_CORE_READ(sunaddr, sun_path));
1884+
}
1885+
1886+
/* check for syslog sockets */
1887+
if (__builtin_memcmp(path, SYSLOG_DEVLOG_SOCKET, sizeof(SYSLOG_DEVLOG_SOCKET)) &&
1888+
__builtin_memcmp(path, SYSLOG_JOURNAL_SOCKET, sizeof(SYSLOG_JOURNAL_SOCKET)))
18841889
return 0;
18851890

18861891
/* clean expired records */
@@ -1984,7 +1989,7 @@ static __always_inline int handle_unix_event(void *ctx, const struct SOCK_EVENT_
19841989
BPF_CORE_READ(task, mm, exe_file, f_path.dentry, d_name.name));
19851990
bpf_probe_read_kernel_str(&sinfo->comm_parent, sizeof(sinfo->comm_parent),
19861991
BPF_CORE_READ(task, real_parent, mm, exe_file, f_path.dentry, d_name.name));
1987-
bpf_probe_read_kernel_str(&sinfo->addr, sizeof(sinfo->addr), BPF_CORE_READ(unix_sock, addr, name[0].sun_path));
1992+
bpf_probe_read_kernel_str(&sinfo->addr, sizeof(sinfo->addr), path);
19881993
sinfo->ts_proc = BPF_CORE_READ(task, start_time);
19891994
sinfo->family = family;
19901995
sinfo->proto = 0;
@@ -2047,7 +2052,7 @@ static __always_inline int handle_unix_event(void *ctx, const struct SOCK_EVENT_
20472052
bpf_printk("HANDLE_UNIX_EVENT: %s", func);
20482053
bpf_printk(" PID: %u KEY: %lx STATE: %u", pid, key, sinfo->state);
20492054
bpf_printk(" TX: %u RX: %u", isrx ? 0 : data_len, isrx ? data_len : 0);
2050-
bpf_printk(" ADDRESS: %s", BPF_CORE_READ(unix_sock, addr, name[0].sun_path));
2055+
bpf_printk(" ADDRESS: %s", sinfo->addr);
20512056
bpf_printk(" MESSAGE[%u]: '%s' LEN: %u", num, sinfo->app_msg.data[num], sinfo->app_msg.len[num]);
20522057
bpf_printk(" TOTAL: TX %lu RX %lu\n", sinfo->tx_bytes, sinfo->rx_bytes);
20532058

0 commit comments

Comments
 (0)