Commit 6fd87cd9 authored by Pavel Emelyanov's avatar Pavel Emelyanov

inet: Sanitize ii->ie mass dereference in inet sk restore

Just save the ii->ie on stack and do s/ii->ie/ie/ over the fn.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent a8e056bf
...@@ -427,32 +427,34 @@ static int post_open_inet_sk(struct file_desc *d, int sk) ...@@ -427,32 +427,34 @@ static int post_open_inet_sk(struct file_desc *d, int sk)
static int open_inet_sk(struct file_desc *d) static int open_inet_sk(struct file_desc *d)
{ {
struct inet_sk_info *ii; struct inet_sk_info *ii;
InetSkEntry *ie;
int sk, yes = 1; int sk, yes = 1;
ii = container_of(d, struct inet_sk_info, d); ii = container_of(d, struct inet_sk_info, d);
ie = ii->ie;
show_one_inet_img("Restore", ii->ie); show_one_inet_img("Restore", ie);
if (ii->ie->family != AF_INET && ii->ie->family != AF_INET6) { if (ie->family != AF_INET && ie->family != AF_INET6) {
pr_err("Unsupported socket family: %d\n", ii->ie->family); pr_err("Unsupported socket family: %d\n", ie->family);
return -1; return -1;
} }
if ((ii->ie->type != SOCK_STREAM) && (ii->ie->type != SOCK_DGRAM)) { if ((ie->type != SOCK_STREAM) && (ie->type != SOCK_DGRAM)) {
pr_err("Unsupported socket type: %d\n", ii->ie->type); pr_err("Unsupported socket type: %d\n", ie->type);
return -1; return -1;
} }
if (inet_validate_address(ii->ie)) if (inet_validate_address(ie))
return -1; return -1;
sk = socket(ii->ie->family, ii->ie->type, ii->ie->proto); sk = socket(ie->family, ie->type, ie->proto);
if (sk < 0) { if (sk < 0) {
pr_perror("Can't create unix socket"); pr_perror("Can't create unix socket");
return -1; return -1;
} }
if (ii->ie->v6only) { if (ie->v6only) {
if (restore_opt(sk, SOL_IPV6, IPV6_V6ONLY, &yes) == -1) if (restore_opt(sk, SOL_IPV6, IPV6_V6ONLY, &yes) == -1)
return -1; return -1;
} }
...@@ -464,7 +466,7 @@ static int open_inet_sk(struct file_desc *d) ...@@ -464,7 +466,7 @@ static int open_inet_sk(struct file_desc *d)
if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes)) if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &yes))
return -1; return -1;
if (tcp_connection(ii->ie)) { if (tcp_connection(ie)) {
if (!opts.tcp_established_ok) { if (!opts.tcp_established_ok) {
pr_err("Connected TCP socket in image\n"); pr_err("Connected TCP socket in image\n");
goto err; goto err;
...@@ -486,28 +488,28 @@ static int open_inet_sk(struct file_desc *d) ...@@ -486,28 +488,28 @@ static int open_inet_sk(struct file_desc *d)
goto err; goto err;
} }
if (ii->ie->state == TCP_LISTEN) { if (ie->state == TCP_LISTEN) {
if (ii->ie->proto != IPPROTO_TCP) { if (ie->proto != IPPROTO_TCP) {
pr_err("Wrong socket in listen state %d\n", ii->ie->proto); pr_err("Wrong socket in listen state %d\n", ie->proto);
goto err; goto err;
} }
if (listen(sk, ii->ie->backlog) == -1) { if (listen(sk, ie->backlog) == -1) {
pr_perror("Can't listen on a socket"); pr_perror("Can't listen on a socket");
goto err; goto err;
} }
} }
if (ii->ie->state == TCP_ESTABLISHED && if (ie->state == TCP_ESTABLISHED &&
inet_connect(sk, ii)) inet_connect(sk, ii))
goto err; goto err;
done: done:
futex_dec(&ii->port->users); futex_dec(&ii->port->users);
if (rst_file_params(sk, ii->ie->fown, ii->ie->flags)) if (rst_file_params(sk, ie->fown, ie->flags))
goto err; goto err;
if (restore_socket_opts(sk, ii->ie->opts)) if (restore_socket_opts(sk, ie->opts))
return -1; return -1;
return sk; return sk;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment