Commit cf3e5c40 authored by Sage Weil's avatar Sage Weil

ceph: plug leak of incoming message during connection fault/close

If we explicitly close a connection, or there is a socket error, we need
to drop any partially received message.
Signed-off-by: default avatarSage Weil <sage@newdream.net>
parent 9ec7cab1
...@@ -320,6 +320,11 @@ static void reset_connection(struct ceph_connection *con) ...@@ -320,6 +320,11 @@ static void reset_connection(struct ceph_connection *con)
ceph_msg_remove_list(&con->out_queue); ceph_msg_remove_list(&con->out_queue);
ceph_msg_remove_list(&con->out_sent); ceph_msg_remove_list(&con->out_sent);
if (con->in_msg) {
ceph_msg_put(con->in_msg);
con->in_msg = NULL;
}
con->connect_seq = 0; con->connect_seq = 0;
con->out_seq = 0; con->out_seq = 0;
if (con->out_msg) { if (con->out_msg) {
...@@ -1288,7 +1293,7 @@ static int read_partial_message(struct ceph_connection *con) ...@@ -1288,7 +1293,7 @@ static int read_partial_message(struct ceph_connection *con)
con->in_msg = con->ops->alloc_msg(con, &con->in_hdr); con->in_msg = con->ops->alloc_msg(con, &con->in_hdr);
if (!con->in_msg) { if (!con->in_msg) {
/* skip this message */ /* skip this message */
dout("alloc_msg returned NULL, skipping message\n"); pr_err("alloc_msg returned NULL, skipping message\n");
con->in_base_pos = -front_len - middle_len - data_len - con->in_base_pos = -front_len - middle_len - data_len -
sizeof(m->footer); sizeof(m->footer);
con->in_tag = CEPH_MSGR_TAG_READY; con->in_tag = CEPH_MSGR_TAG_READY;
...@@ -1327,7 +1332,7 @@ static int read_partial_message(struct ceph_connection *con) ...@@ -1327,7 +1332,7 @@ static int read_partial_message(struct ceph_connection *con)
if (con->ops->alloc_middle) if (con->ops->alloc_middle)
ret = con->ops->alloc_middle(con, m); ret = con->ops->alloc_middle(con, m);
if (ret < 0) { if (ret < 0) {
dout("alloc_middle failed, skipping payload\n"); pr_err("alloc_middle fail skipping payload\n");
con->in_base_pos = -middle_len - data_len con->in_base_pos = -middle_len - data_len
- sizeof(m->footer); - sizeof(m->footer);
ceph_msg_put(con->in_msg); ceph_msg_put(con->in_msg);
...@@ -1498,6 +1503,7 @@ static int try_write(struct ceph_connection *con) ...@@ -1498,6 +1503,7 @@ static int try_write(struct ceph_connection *con)
set_bit(CONNECTING, &con->state); set_bit(CONNECTING, &con->state);
clear_bit(NEGOTIATING, &con->state); clear_bit(NEGOTIATING, &con->state);
BUG_ON(con->in_msg);
con->in_tag = CEPH_MSGR_TAG_READY; con->in_tag = CEPH_MSGR_TAG_READY;
dout("try_write initiating connect on %p new state %lu\n", dout("try_write initiating connect on %p new state %lu\n",
con, con->state); con, con->state);
......
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