Skip to content

Commit

Permalink
svcrpc: fix potential GSSX_ACCEPT_SEC_CONTEXT decoding failures
Browse files Browse the repository at this point in the history
In an environment where the KDC is running Active Directory, the
exported composite name field returned in the context could be large
enough to span a page boundary.  Attaching a scratch buffer to the
decoding xdr_stream helps deal with those cases.

The case where we saw this was actually due to behavior that's been
fixed in newer gss-proxy versions, but we're fixing it here too.

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
Cc: stable@vger.kernel.org
Reviewed-by: Simo Sorce <simo@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
  • Loading branch information
Scott Mayhew authored and J. Bruce Fields committed May 4, 2015
1 parent 8287f00 commit 9507271
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions net/sunrpc/auth_gss/gss_rpc_xdr.c
Original file line number Diff line number Diff line change
Expand Up @@ -793,47 +793,56 @@ int gssx_dec_accept_sec_context(struct rpc_rqst *rqstp,
{
u32 value_follows;
int err;
struct page *scratch;

scratch = alloc_page(GFP_KERNEL);
if (!scratch)
return -ENOMEM;
xdr_set_scratch_buffer(xdr, page_address(scratch), PAGE_SIZE);

/* res->status */
err = gssx_dec_status(xdr, &res->status);
if (err)
return err;
goto out_free;

/* res->context_handle */
err = gssx_dec_bool(xdr, &value_follows);
if (err)
return err;
goto out_free;
if (value_follows) {
err = gssx_dec_ctx(xdr, res->context_handle);
if (err)
return err;
goto out_free;
} else {
res->context_handle = NULL;
}

/* res->output_token */
err = gssx_dec_bool(xdr, &value_follows);
if (err)
return err;
goto out_free;
if (value_follows) {
err = gssx_dec_buffer(xdr, res->output_token);
if (err)
return err;
goto out_free;
} else {
res->output_token = NULL;
}

/* res->delegated_cred_handle */
err = gssx_dec_bool(xdr, &value_follows);
if (err)
return err;
goto out_free;
if (value_follows) {
/* we do not support upcall servers sending this data. */
return -EINVAL;
err = -EINVAL;
goto out_free;
}

/* res->options */
err = gssx_dec_option_array(xdr, &res->options);

out_free:
__free_page(scratch);
return err;
}

0 comments on commit 9507271

Please sign in to comment.