Skip to content

Commit

Permalink
unix_bind_bsd(): unlink if we fail after successful mknod
Browse files Browse the repository at this point in the history
We can do that more or less safely, since the parent is
held locked all along.  Yes, somebody might observe the
object via dcache, only to have it disappear afterwards,
but there's really no good way to prevent that.  It won't
race with other bind(2) or attempts to move the sucker
elsewhere, or put something else in its place - locked
parent prevents that.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Al Viro authored and David S. Miller committed Jun 21, 2021
1 parent 56c1731 commit c0c3b8d
Showing 1 changed file with 16 additions and 13 deletions.
29 changes: 16 additions & 13 deletions net/unix/af_unix.c
Original file line number Diff line number Diff line change
Expand Up @@ -1010,20 +1010,13 @@ static int unix_bind_bsd(struct sock *sk, struct unix_address *addr)
err = security_path_mknod(&parent, dentry, mode, 0);
if (!err)
err = vfs_mknod(ns, d_inode(parent.dentry), dentry, mode, 0);
if (err) {
done_path_create(&parent, dentry);
return err;
}
if (err)
goto out;
err = mutex_lock_interruptible(&u->bindlock);
if (err) {
done_path_create(&parent, dentry);
return err;
}
if (u->addr) {
mutex_unlock(&u->bindlock);
done_path_create(&parent, dentry);
return -EINVAL;
}
if (err)
goto out_unlink;
if (u->addr)
goto out_unlock;

addr->hash = UNIX_HASH_SIZE;
hash = d_backing_inode(dentry)->i_ino & (UNIX_HASH_SIZE - 1);
Expand All @@ -1035,6 +1028,16 @@ static int unix_bind_bsd(struct sock *sk, struct unix_address *addr)
mutex_unlock(&u->bindlock);
done_path_create(&parent, dentry);
return 0;

out_unlock:
mutex_unlock(&u->bindlock);
err = -EINVAL;
out_unlink:
/* failed after successful mknod? unlink what we'd created... */
vfs_unlink(ns, d_inode(parent.dentry), dentry, NULL);
out:
done_path_create(&parent, dentry);
return err;
}

static int unix_bind_abstract(struct sock *sk, unsigned hash,
Expand Down

0 comments on commit c0c3b8d

Please sign in to comment.