af_unix: Remove UNIX_ABSTRACT() macro and test sun_path[0] instead.
authorKuniyuki Iwashima <kuniyu@amazon.co.jp>
Wed, 24 Nov 2021 02:14:27 +0000 (11:14 +0900)
committerJakub Kicinski <kuba@kernel.org>
Sat, 27 Nov 2021 02:01:56 +0000 (18:01 -0800)
In BSD and abstract address cases, we store sockets in the hash table with
keys between 0 and UNIX_HASH_SIZE - 1.  However, the hash saved in a socket
varies depending on its address type; sockets with BSD addresses always
have UNIX_HASH_SIZE in their unix_sk(sk)->addr->hash.

This is just for the UNIX_ABSTRACT() macro used to check the address type.
The difference of the saved hashes comes from the first byte of the address
in the first place.  So, we can test it directly.

Then we can keep a real hash in each socket and replace unix_table_lock
with per-hash locks in the later patch.

Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.co.jp>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/unix/af_unix.c
tools/testing/selftests/bpf/progs/bpf_iter_unix.c
tools/testing/selftests/bpf/progs/bpf_tracing_net.h
tools/testing/selftests/bpf/progs/test_skc_to_unix_sock.c

index 2710e7dfc63838096e76a75ee7dbf7a9663edc9b..80752ab9ed97b99194ead7f1f710e1d82d35d06e 100644 (file)
@@ -134,8 +134,6 @@ static struct hlist_head *unix_sockets_unbound(void *addr)
        return &unix_socket_table[UNIX_HASH_SIZE + hash];
 }
 
-#define UNIX_ABSTRACT(sk)      (unix_sk(sk)->addr->hash < UNIX_HASH_SIZE)
-
 #ifdef CONFIG_SECURITY_NETWORK
 static void unix_get_secdata(struct scm_cookie *scm, struct sk_buff *skb)
 {
@@ -3292,9 +3290,9 @@ static int unix_seq_show(struct seq_file *seq, void *v)
                        i = 0;
                        len = u->addr->len -
                                offsetof(struct sockaddr_un, sun_path);
-                       if (!UNIX_ABSTRACT(s))
+                       if (u->addr->name->sun_path[0]) {
                                len--;
-                       else {
+                       else {
                                seq_putc(seq, '@');
                                i++;
                        }
index 94423902685dc1396fb63f598bcadaca6a3df2fa..c21e3f545371fc456c426ba24890a6f6b29a5076 100644 (file)
@@ -49,7 +49,7 @@ int dump_unix(struct bpf_iter__unix *ctx)
                       sock_i_ino(sk));
 
        if (unix_sk->addr) {
-               if (!UNIX_ABSTRACT(unix_sk)) {
+               if (unix_sk->addr->name->sun_path[0]) {
                        BPF_SEQ_PRINTF(seq, " %s", unix_sk->addr->name->sun_path);
                } else {
                        /* The name of the abstract UNIX domain socket starts
index eef5646ddb195448711b50d537d16ff72f4902a6..e0f42601be9b8a00bf5ec34cc4c13a0162e8c860 100644 (file)
@@ -6,8 +6,6 @@
 #define AF_INET6               10
 
 #define __SO_ACCEPTCON         (1 << 16)
-#define UNIX_HASH_SIZE         256
-#define UNIX_ABSTRACT(unix_sk) (unix_sk->addr->hash < UNIX_HASH_SIZE)
 
 #define SOL_TCP                        6
 #define TCP_CONGESTION         13
index a408ec95cba49654648de6645364d2802487d6db..eacda9fe07ebb08a8c50ff43cfe788863a5a9bb6 100644 (file)
@@ -23,7 +23,7 @@ int BPF_PROG(unix_listen, struct socket *sock, int backlog)
        if (!unix_sk)
                return 0;
 
-       if (!UNIX_ABSTRACT(unix_sk))
+       if (unix_sk->addr->name->sun_path[0])
                return 0;
 
        len = unix_sk->addr->len - sizeof(short);