aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorAlex Elder <elder@inktank.com>2012-05-16 16:16:39 -0400
committerSage Weil <sage@inktank.com>2012-05-18 20:35:59 -0400
commit3da54776e2c0385c32d143fd497a7f40a88e29dd (patch)
tree4dac17103404f8f5a967c6855bcb9891080a600b /net
parentdac1e716c60161867a47745bca592987ca3a9cb2 (diff)
ceph: add auth buf in prepare_write_connect()
Move the addition of the authorizer buffer to a connection's out_kvec out of get_connect_authorizer() and into its caller. This way, the caller--prepare_write_connect()--can avoid adding the connect header to out_kvec before it has been fully initialized. Prior to this patch, it was possible for a connect header to be sent over the wire before the authorizer protocol or buffer length fields were initialized. An authorizer buffer associated with that header could also be queued to send only after the connection header that describes it was on the wire. Fixes http://tracker.newdream.net/issues/2424 Signed-off-by: Alex Elder <elder@inktank.com> Reviewed-by: Sage Weil <sage@inktank.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/messenger.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index bfddd87db788..1a80907282cc 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -656,8 +656,6 @@ static void prepare_write_keepalive(struct ceph_connection *con)
656static struct ceph_auth_handshake *get_connect_authorizer(struct ceph_connection *con, 656static struct ceph_auth_handshake *get_connect_authorizer(struct ceph_connection *con,
657 int *auth_proto) 657 int *auth_proto)
658{ 658{
659 void *auth_buf;
660 int auth_len;
661 struct ceph_auth_handshake *auth; 659 struct ceph_auth_handshake *auth;
662 660
663 if (!con->ops->get_authorizer) { 661 if (!con->ops->get_authorizer) {
@@ -680,15 +678,9 @@ static struct ceph_auth_handshake *get_connect_authorizer(struct ceph_connection
680 if (test_bit(CLOSED, &con->state) || test_bit(OPENING, &con->state)) 678 if (test_bit(CLOSED, &con->state) || test_bit(OPENING, &con->state))
681 return ERR_PTR(-EAGAIN); 679 return ERR_PTR(-EAGAIN);
682 680
683 auth_buf = auth->authorizer_buf;
684 auth_len = auth->authorizer_buf_len;
685 con->auth_reply_buf = auth->authorizer_reply_buf; 681 con->auth_reply_buf = auth->authorizer_reply_buf;
686 con->auth_reply_buf_len = auth->authorizer_reply_buf_len; 682 con->auth_reply_buf_len = auth->authorizer_reply_buf_len;
687 683
688 con->out_connect.authorizer_len = cpu_to_le32(auth_len);
689
690 if (auth_len)
691 ceph_con_out_kvec_add(con, auth_len, auth_buf);
692 684
693 return auth; 685 return auth;
694} 686}
@@ -737,12 +729,20 @@ static int prepare_write_connect(struct ceph_connection *con)
737 con->out_connect.protocol_version = cpu_to_le32(proto); 729 con->out_connect.protocol_version = cpu_to_le32(proto);
738 con->out_connect.flags = 0; 730 con->out_connect.flags = 0;
739 731
740 ceph_con_out_kvec_add(con, sizeof (con->out_connect), &con->out_connect);
741 auth_proto = CEPH_AUTH_UNKNOWN; 732 auth_proto = CEPH_AUTH_UNKNOWN;
742 auth = get_connect_authorizer(con, &auth_proto); 733 auth = get_connect_authorizer(con, &auth_proto);
743 if (IS_ERR(auth)) 734 if (IS_ERR(auth))
744 return PTR_ERR(auth); 735 return PTR_ERR(auth);
736
745 con->out_connect.authorizer_protocol = cpu_to_le32(auth_proto); 737 con->out_connect.authorizer_protocol = cpu_to_le32(auth_proto);
738 con->out_connect.authorizer_len = auth ?
739 cpu_to_le32(auth->authorizer_buf_len) : 0;
740
741 ceph_con_out_kvec_add(con, sizeof (con->out_connect),
742 &con->out_connect);
743 if (auth && auth->authorizer_buf_len)
744 ceph_con_out_kvec_add(con, auth->authorizer_buf_len,
745 auth->authorizer_buf);
746 746
747 con->out_more = 0; 747 con->out_more = 0;
748 set_bit(WRITE_PENDING, &con->state); 748 set_bit(WRITE_PENDING, &con->state);