• K
    af_unix: Return errno instead of NULL in unix_create1(). · f4bd73b5
    Kuniyuki Iwashima 提交于
    unix_create1() returns NULL on error, and the callers assume that it never
    fails for reasons other than out of memory.  So, the callers always return
    -ENOMEM when unix_create1() fails.
    
    However, it also returns NULL when the number of af_unix sockets exceeds
    twice the limit controlled by sysctl: fs.file-max.  In this case, the
    callers should return -ENFILE like alloc_empty_file().
    
    This patch changes unix_create1() to return the correct error value instead
    of NULL on error.
    
    Out of curiosity, the assumption has been wrong since 1999 due to this
    change introduced in 2.2.4 [0].
    
      diff -u --recursive --new-file v2.2.3/linux/net/unix/af_unix.c linux/net/unix/af_unix.c
      --- v2.2.3/linux/net/unix/af_unix.c	Tue Jan 19 11:32:53 1999
      +++ linux/net/unix/af_unix.c	Sun Mar 21 07:22:00 1999
      @@ -388,6 +413,9 @@
       {
       	struct sock *sk;
    
      +	if (atomic_read(&unix_nr_socks) >= 2*max_files)
      +		return NULL;
      +
       	MOD_INC_USE_COUNT;
       	sk = sk_alloc(PF_UNIX, GFP_KERNEL, 1);
       	if (!sk) {
    
    [0]: https://cdn.kernel.org/pub/linux/kernel/v2.2/patch-2.2.4.gz
    
    Fixes: 1da177e4 ("Linux-2.6.12-rc2")
    Signed-off-by: NKuniyuki Iwashima <kuniyu@amazon.co.jp>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    f4bd73b5
af_unix.c 79.3 KB