@@ -393,12 +393,15 @@ static int sock_map_fd(struct socket *sock, int flags)
{
struct file *newfile;
int fd = get_unused_fd_flags(flags);
- if (unlikely(fd < 0))
+ if (unlikely(fd < 0)) {
+ sock_release(sock);
return fd;
+ }
newfile = sock_alloc_file(sock, flags, NULL);
if (unlikely(IS_ERR(newfile))) {
put_unused_fd(fd);
+ sock_release(sock);
return PTR_ERR(newfile);
}
@@ -1256,16 +1259,10 @@ SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
goto out;
retval = sock_map_fd(sock, flags & (O_CLOEXEC | O_NONBLOCK));
- if (retval < 0)
- goto out_release;
out:
/* It may be already another descriptor 8) Not kernel problem. */
return retval;
-
-out_release:
- sock_release(sock);
- return retval;
}
/*