int gssx_dec_accept_sec_context(struct rpc_rqst *rqstp, struct xdr_stream *xdr, void *data) { struct gssx_res_accept_sec_context *res = data; 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) goto out_free; /* res->context_handle */ err = gssx_dec_bool(xdr, &value_follows); if (err) goto out_free; if (value_follows) { err = gssx_dec_ctx(xdr, res->context_handle); if (err) goto out_free; } else { res->context_handle = NULL; } /* res->output_token */ err = gssx_dec_bool(xdr, &value_follows); if (err) goto out_free; if (value_follows) { err = gssx_dec_buffer(xdr, res->output_token); if (err) goto out_free; } else { res->output_token = NULL; } /* res->delegated_cred_handle */ err = gssx_dec_bool(xdr, &value_follows); if (err) goto out_free; if (value_follows) { /* we do not support upcall servers sending this data. */ err = -EINVAL; goto out_free; } /* res->options */ err = gssx_dec_option_array(xdr, &res->options); out_free: __free_page(scratch); return err; }
int gssx_dec_accept_sec_context(struct rpc_rqst *rqstp, struct xdr_stream *xdr, struct gssx_res_accept_sec_context *res) { u32 value_follows; int err; /* res->status */ err = gssx_dec_status(xdr, &res->status); if (err) return err; /* res->context_handle */ err = gssx_dec_bool(xdr, &value_follows); if (err) return err; if (value_follows) { err = gssx_dec_ctx(xdr, res->context_handle); if (err) return err; } else { res->context_handle = NULL; } /* res->output_token */ err = gssx_dec_bool(xdr, &value_follows); if (err) return err; if (value_follows) { err = gssx_dec_buffer(xdr, res->output_token); if (err) return err; } else { res->output_token = NULL; } /* res->delegated_cred_handle */ err = gssx_dec_bool(xdr, &value_follows); if (err) return err; if (value_follows) { /* we do not support upcall servers sending this data. */ return -EINVAL; } /* res->options */ err = gssx_dec_option_array(xdr, &res->options); return err; }