lkml.org 
[lkml]   [2019]   [Mar]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 030/230] libceph: handle an empty authorize reply
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ilya Dryomov <idryomov@gmail.com>

    commit 0fd3fd0a9bb0b02b6435bb7070e9f7b82a23f068 upstream.

    The authorize reply can be empty, for example when the ticket used to
    build the authorizer is too old and TAG_BADAUTHORIZER is returned from
    the service. Calling ->verify_authorizer_reply() results in an attempt
    to decrypt and validate (somewhat) random data in au->buf (most likely
    the signature block from calc_signature()), which fails and ends up in
    con_fault_finish() with !con->auth_retry. The ticket isn't invalidated
    and the connection is retried again and again until a new ticket is
    obtained from the monitor:

    libceph: osd2 192.168.122.1:6809 bad authorize reply
    libceph: osd2 192.168.122.1:6809 bad authorize reply
    libceph: osd2 192.168.122.1:6809 bad authorize reply
    libceph: osd2 192.168.122.1:6809 bad authorize reply

    Let TAG_BADAUTHORIZER handler kick in and increment con->auth_retry.

    Cc: stable@vger.kernel.org
    Fixes: 5c056fdc5b47 ("libceph: verify authorize reply on connect")
    Link: https://tracker.ceph.com/issues/20164
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Reviewed-by: Sage Weil <sage@redhat.com>
    [idryomov@gmail.com: backport to 4.4: extra arg, no CEPHX_V2]
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    net/ceph/messenger.c | 12 ++++++++----
    1 file changed, 8 insertions(+), 4 deletions(-)

    --- a/net/ceph/messenger.c
    +++ b/net/ceph/messenger.c
    @@ -2049,15 +2049,19 @@ static int process_connect(struct ceph_c
    dout("process_connect on %p tag %d\n", con, (int)con->in_tag);

    if (con->auth_reply_buf) {
    + int len = le32_to_cpu(con->in_reply.authorizer_len);
    +
    /*
    * Any connection that defines ->get_authorizer()
    * should also define ->verify_authorizer_reply().
    * See get_connect_authorizer().
    */
    - ret = con->ops->verify_authorizer_reply(con, 0);
    - if (ret < 0) {
    - con->error_msg = "bad authorize reply";
    - return ret;
    + if (len) {
    + ret = con->ops->verify_authorizer_reply(con, 0);
    + if (ret < 0) {
    + con->error_msg = "bad authorize reply";
    + return ret;
    + }
    }
    }


    \
     
     \ /
      Last update: 2019-03-22 14:15    [W:3.073 / U:1.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site