auth_gss.c revision 1f4c86c0be9064ab4eebd9e67c84606c1cfeec4b
1/*
2 * linux/net/sunrpc/auth_gss/auth_gss.c
3 *
4 * RPCSEC_GSS client authentication.
5 *
6 *  Copyright (c) 2000 The Regents of the University of Michigan.
7 *  All rights reserved.
8 *
9 *  Dug Song       <dugsong@monkey.org>
10 *  Andy Adamson   <andros@umich.edu>
11 *
12 *  Redistribution and use in source and binary forms, with or without
13 *  modification, are permitted provided that the following conditions
14 *  are met:
15 *
16 *  1. Redistributions of source code must retain the above copyright
17 *     notice, this list of conditions and the following disclaimer.
18 *  2. Redistributions in binary form must reproduce the above copyright
19 *     notice, this list of conditions and the following disclaimer in the
20 *     documentation and/or other materials provided with the distribution.
21 *  3. Neither the name of the University nor the names of its
22 *     contributors may be used to endorse or promote products derived
23 *     from this software without specific prior written permission.
24 *
25 *  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
26 *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28 *  DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
29 *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
32 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33 *  LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34 *  NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35 *  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38
39#include <linux/module.h>
40#include <linux/init.h>
41#include <linux/types.h>
42#include <linux/slab.h>
43#include <linux/sched.h>
44#include <linux/pagemap.h>
45#include <linux/sunrpc/clnt.h>
46#include <linux/sunrpc/auth.h>
47#include <linux/sunrpc/auth_gss.h>
48#include <linux/sunrpc/svcauth_gss.h>
49#include <linux/sunrpc/gss_err.h>
50#include <linux/workqueue.h>
51#include <linux/sunrpc/rpc_pipe_fs.h>
52#include <linux/sunrpc/gss_api.h>
53#include <asm/uaccess.h>
54
55static const struct rpc_authops authgss_ops;
56
57static const struct rpc_credops gss_credops;
58static const struct rpc_credops gss_nullops;
59
60#ifdef RPC_DEBUG
61# define RPCDBG_FACILITY	RPCDBG_AUTH
62#endif
63
64#define GSS_CRED_SLACK		(RPC_MAX_AUTH_SIZE * 2)
65/* length of a krb5 verifier (48), plus data added before arguments when
66 * using integrity (two 4-byte integers): */
67#define GSS_VERF_SLACK		100
68
69struct gss_auth {
70	struct kref kref;
71	struct rpc_auth rpc_auth;
72	struct gss_api_mech *mech;
73	enum rpc_gss_svc service;
74	struct rpc_clnt *client;
75	/*
76	 * There are two upcall pipes; dentry[1], named "gssd", is used
77	 * for the new text-based upcall; dentry[0] is named after the
78	 * mechanism (for example, "krb5") and exists for
79	 * backwards-compatibility with older gssd's.
80	 */
81	struct dentry *dentry[2];
82};
83
84/* pipe_version >= 0 if and only if someone has a pipe open. */
85static int pipe_version = -1;
86static atomic_t pipe_users = ATOMIC_INIT(0);
87static DEFINE_SPINLOCK(pipe_version_lock);
88static struct rpc_wait_queue pipe_version_rpc_waitqueue;
89static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue);
90
91static void gss_free_ctx(struct gss_cl_ctx *);
92static const struct rpc_pipe_ops gss_upcall_ops_v0;
93static const struct rpc_pipe_ops gss_upcall_ops_v1;
94
95static inline struct gss_cl_ctx *
96gss_get_ctx(struct gss_cl_ctx *ctx)
97{
98	atomic_inc(&ctx->count);
99	return ctx;
100}
101
102static inline void
103gss_put_ctx(struct gss_cl_ctx *ctx)
104{
105	if (atomic_dec_and_test(&ctx->count))
106		gss_free_ctx(ctx);
107}
108
109/* gss_cred_set_ctx:
110 * called by gss_upcall_callback and gss_create_upcall in order
111 * to set the gss context. The actual exchange of an old context
112 * and a new one is protected by the inode->i_lock.
113 */
114static void
115gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx)
116{
117	struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base);
118
119	if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
120		return;
121	gss_get_ctx(ctx);
122	rcu_assign_pointer(gss_cred->gc_ctx, ctx);
123	set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
124	smp_mb__before_clear_bit();
125	clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags);
126}
127
128static const void *
129simple_get_bytes(const void *p, const void *end, void *res, size_t len)
130{
131	const void *q = (const void *)((const char *)p + len);
132	if (unlikely(q > end || q < p))
133		return ERR_PTR(-EFAULT);
134	memcpy(res, p, len);
135	return q;
136}
137
138static inline const void *
139simple_get_netobj(const void *p, const void *end, struct xdr_netobj *dest)
140{
141	const void *q;
142	unsigned int len;
143
144	p = simple_get_bytes(p, end, &len, sizeof(len));
145	if (IS_ERR(p))
146		return p;
147	q = (const void *)((const char *)p + len);
148	if (unlikely(q > end || q < p))
149		return ERR_PTR(-EFAULT);
150	dest->data = kmemdup(p, len, GFP_NOFS);
151	if (unlikely(dest->data == NULL))
152		return ERR_PTR(-ENOMEM);
153	dest->len = len;
154	return q;
155}
156
157static struct gss_cl_ctx *
158gss_cred_get_ctx(struct rpc_cred *cred)
159{
160	struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base);
161	struct gss_cl_ctx *ctx = NULL;
162
163	rcu_read_lock();
164	if (gss_cred->gc_ctx)
165		ctx = gss_get_ctx(gss_cred->gc_ctx);
166	rcu_read_unlock();
167	return ctx;
168}
169
170static struct gss_cl_ctx *
171gss_alloc_context(void)
172{
173	struct gss_cl_ctx *ctx;
174
175	ctx = kzalloc(sizeof(*ctx), GFP_NOFS);
176	if (ctx != NULL) {
177		ctx->gc_proc = RPC_GSS_PROC_DATA;
178		ctx->gc_seq = 1;	/* NetApp 6.4R1 doesn't accept seq. no. 0 */
179		spin_lock_init(&ctx->gc_seq_lock);
180		atomic_set(&ctx->count,1);
181	}
182	return ctx;
183}
184
185#define GSSD_MIN_TIMEOUT (60 * 60)
186static const void *
187gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct gss_api_mech *gm)
188{
189	const void *q;
190	unsigned int seclen;
191	unsigned int timeout;
192	u32 window_size;
193	int ret;
194
195	/* First unsigned int gives the lifetime (in seconds) of the cred */
196	p = simple_get_bytes(p, end, &timeout, sizeof(timeout));
197	if (IS_ERR(p))
198		goto err;
199	if (timeout == 0)
200		timeout = GSSD_MIN_TIMEOUT;
201	ctx->gc_expiry = jiffies + (unsigned long)timeout * HZ * 3 / 4;
202	/* Sequence number window. Determines the maximum number of simultaneous requests */
203	p = simple_get_bytes(p, end, &window_size, sizeof(window_size));
204	if (IS_ERR(p))
205		goto err;
206	ctx->gc_win = window_size;
207	/* gssd signals an error by passing ctx->gc_win = 0: */
208	if (ctx->gc_win == 0) {
209		/*
210		 * in which case, p points to an error code. Anything other
211		 * than -EKEYEXPIRED gets converted to -EACCES.
212		 */
213		p = simple_get_bytes(p, end, &ret, sizeof(ret));
214		if (!IS_ERR(p))
215			p = (ret == -EKEYEXPIRED) ? ERR_PTR(-EKEYEXPIRED) :
216						    ERR_PTR(-EACCES);
217		goto err;
218	}
219	/* copy the opaque wire context */
220	p = simple_get_netobj(p, end, &ctx->gc_wire_ctx);
221	if (IS_ERR(p))
222		goto err;
223	/* import the opaque security context */
224	p  = simple_get_bytes(p, end, &seclen, sizeof(seclen));
225	if (IS_ERR(p))
226		goto err;
227	q = (const void *)((const char *)p + seclen);
228	if (unlikely(q > end || q < p)) {
229		p = ERR_PTR(-EFAULT);
230		goto err;
231	}
232	ret = gss_import_sec_context(p, seclen, gm, &ctx->gc_gss_ctx, GFP_NOFS);
233	if (ret < 0) {
234		p = ERR_PTR(ret);
235		goto err;
236	}
237	return q;
238err:
239	dprintk("RPC:       gss_fill_context returning %ld\n", -PTR_ERR(p));
240	return p;
241}
242
243#define UPCALL_BUF_LEN 128
244
245struct gss_upcall_msg {
246	atomic_t count;
247	uid_t	uid;
248	struct rpc_pipe_msg msg;
249	struct list_head list;
250	struct gss_auth *auth;
251	struct rpc_inode *inode;
252	struct rpc_wait_queue rpc_waitqueue;
253	wait_queue_head_t waitqueue;
254	struct gss_cl_ctx *ctx;
255	char databuf[UPCALL_BUF_LEN];
256};
257
258static int get_pipe_version(void)
259{
260	int ret;
261
262	spin_lock(&pipe_version_lock);
263	if (pipe_version >= 0) {
264		atomic_inc(&pipe_users);
265		ret = pipe_version;
266	} else
267		ret = -EAGAIN;
268	spin_unlock(&pipe_version_lock);
269	return ret;
270}
271
272static void put_pipe_version(void)
273{
274	if (atomic_dec_and_lock(&pipe_users, &pipe_version_lock)) {
275		pipe_version = -1;
276		spin_unlock(&pipe_version_lock);
277	}
278}
279
280static void
281gss_release_msg(struct gss_upcall_msg *gss_msg)
282{
283	if (!atomic_dec_and_test(&gss_msg->count))
284		return;
285	put_pipe_version();
286	BUG_ON(!list_empty(&gss_msg->list));
287	if (gss_msg->ctx != NULL)
288		gss_put_ctx(gss_msg->ctx);
289	rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue);
290	kfree(gss_msg);
291}
292
293static struct gss_upcall_msg *
294__gss_find_upcall(struct rpc_inode *rpci, uid_t uid)
295{
296	struct gss_upcall_msg *pos;
297	list_for_each_entry(pos, &rpci->in_downcall, list) {
298		if (pos->uid != uid)
299			continue;
300		atomic_inc(&pos->count);
301		dprintk("RPC:       gss_find_upcall found msg %p\n", pos);
302		return pos;
303	}
304	dprintk("RPC:       gss_find_upcall found nothing\n");
305	return NULL;
306}
307
308/* Try to add an upcall to the pipefs queue.
309 * If an upcall owned by our uid already exists, then we return a reference
310 * to that upcall instead of adding the new upcall.
311 */
312static inline struct gss_upcall_msg *
313gss_add_msg(struct gss_upcall_msg *gss_msg)
314{
315	struct rpc_inode *rpci = gss_msg->inode;
316	struct inode *inode = &rpci->vfs_inode;
317	struct gss_upcall_msg *old;
318
319	spin_lock(&inode->i_lock);
320	old = __gss_find_upcall(rpci, gss_msg->uid);
321	if (old == NULL) {
322		atomic_inc(&gss_msg->count);
323		list_add(&gss_msg->list, &rpci->in_downcall);
324	} else
325		gss_msg = old;
326	spin_unlock(&inode->i_lock);
327	return gss_msg;
328}
329
330static void
331__gss_unhash_msg(struct gss_upcall_msg *gss_msg)
332{
333	list_del_init(&gss_msg->list);
334	rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno);
335	wake_up_all(&gss_msg->waitqueue);
336	atomic_dec(&gss_msg->count);
337}
338
339static void
340gss_unhash_msg(struct gss_upcall_msg *gss_msg)
341{
342	struct inode *inode = &gss_msg->inode->vfs_inode;
343
344	if (list_empty(&gss_msg->list))
345		return;
346	spin_lock(&inode->i_lock);
347	if (!list_empty(&gss_msg->list))
348		__gss_unhash_msg(gss_msg);
349	spin_unlock(&inode->i_lock);
350}
351
352static void
353gss_upcall_callback(struct rpc_task *task)
354{
355	struct gss_cred *gss_cred = container_of(task->tk_msg.rpc_cred,
356			struct gss_cred, gc_base);
357	struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall;
358	struct inode *inode = &gss_msg->inode->vfs_inode;
359
360	spin_lock(&inode->i_lock);
361	if (gss_msg->ctx)
362		gss_cred_set_ctx(task->tk_msg.rpc_cred, gss_msg->ctx);
363	else
364		task->tk_status = gss_msg->msg.errno;
365	gss_cred->gc_upcall = NULL;
366	rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno);
367	spin_unlock(&inode->i_lock);
368	gss_release_msg(gss_msg);
369}
370
371static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg)
372{
373	gss_msg->msg.data = &gss_msg->uid;
374	gss_msg->msg.len = sizeof(gss_msg->uid);
375}
376
377static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg,
378				struct rpc_clnt *clnt, int machine_cred)
379{
380	struct gss_api_mech *mech = gss_msg->auth->mech;
381	char *p = gss_msg->databuf;
382	int len = 0;
383
384	gss_msg->msg.len = sprintf(gss_msg->databuf, "mech=%s uid=%d ",
385				   mech->gm_name,
386				   gss_msg->uid);
387	p += gss_msg->msg.len;
388	if (clnt->cl_principal) {
389		len = sprintf(p, "target=%s ", clnt->cl_principal);
390		p += len;
391		gss_msg->msg.len += len;
392	}
393	if (machine_cred) {
394		len = sprintf(p, "service=* ");
395		p += len;
396		gss_msg->msg.len += len;
397	} else if (!strcmp(clnt->cl_program->name, "nfs4_cb")) {
398		len = sprintf(p, "service=nfs ");
399		p += len;
400		gss_msg->msg.len += len;
401	}
402	if (mech->gm_upcall_enctypes) {
403		len = sprintf(p, mech->gm_upcall_enctypes);
404		p += len;
405		gss_msg->msg.len += len;
406	}
407	len = sprintf(p, "\n");
408	gss_msg->msg.len += len;
409
410	gss_msg->msg.data = gss_msg->databuf;
411	BUG_ON(gss_msg->msg.len > UPCALL_BUF_LEN);
412}
413
414static void gss_encode_msg(struct gss_upcall_msg *gss_msg,
415				struct rpc_clnt *clnt, int machine_cred)
416{
417	if (pipe_version == 0)
418		gss_encode_v0_msg(gss_msg);
419	else /* pipe_version == 1 */
420		gss_encode_v1_msg(gss_msg, clnt, machine_cred);
421}
422
423static inline struct gss_upcall_msg *
424gss_alloc_msg(struct gss_auth *gss_auth, uid_t uid, struct rpc_clnt *clnt,
425		int machine_cred)
426{
427	struct gss_upcall_msg *gss_msg;
428	int vers;
429
430	gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS);
431	if (gss_msg == NULL)
432		return ERR_PTR(-ENOMEM);
433	vers = get_pipe_version();
434	if (vers < 0) {
435		kfree(gss_msg);
436		return ERR_PTR(vers);
437	}
438	gss_msg->inode = RPC_I(gss_auth->dentry[vers]->d_inode);
439	INIT_LIST_HEAD(&gss_msg->list);
440	rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq");
441	init_waitqueue_head(&gss_msg->waitqueue);
442	atomic_set(&gss_msg->count, 1);
443	gss_msg->uid = uid;
444	gss_msg->auth = gss_auth;
445	gss_encode_msg(gss_msg, clnt, machine_cred);
446	return gss_msg;
447}
448
449static struct gss_upcall_msg *
450gss_setup_upcall(struct rpc_clnt *clnt, struct gss_auth *gss_auth, struct rpc_cred *cred)
451{
452	struct gss_cred *gss_cred = container_of(cred,
453			struct gss_cred, gc_base);
454	struct gss_upcall_msg *gss_new, *gss_msg;
455	uid_t uid = cred->cr_uid;
456
457	gss_new = gss_alloc_msg(gss_auth, uid, clnt, gss_cred->gc_machine_cred);
458	if (IS_ERR(gss_new))
459		return gss_new;
460	gss_msg = gss_add_msg(gss_new);
461	if (gss_msg == gss_new) {
462		struct inode *inode = &gss_new->inode->vfs_inode;
463		int res = rpc_queue_upcall(inode, &gss_new->msg);
464		if (res) {
465			gss_unhash_msg(gss_new);
466			gss_msg = ERR_PTR(res);
467		}
468	} else
469		gss_release_msg(gss_new);
470	return gss_msg;
471}
472
473static void warn_gssd(void)
474{
475	static unsigned long ratelimit;
476	unsigned long now = jiffies;
477
478	if (time_after(now, ratelimit)) {
479		printk(KERN_WARNING "RPC: AUTH_GSS upcall timed out.\n"
480				"Please check user daemon is running.\n");
481		ratelimit = now + 15*HZ;
482	}
483}
484
485static inline int
486gss_refresh_upcall(struct rpc_task *task)
487{
488	struct rpc_cred *cred = task->tk_msg.rpc_cred;
489	struct gss_auth *gss_auth = container_of(cred->cr_auth,
490			struct gss_auth, rpc_auth);
491	struct gss_cred *gss_cred = container_of(cred,
492			struct gss_cred, gc_base);
493	struct gss_upcall_msg *gss_msg;
494	struct inode *inode;
495	int err = 0;
496
497	dprintk("RPC: %5u gss_refresh_upcall for uid %u\n", task->tk_pid,
498								cred->cr_uid);
499	gss_msg = gss_setup_upcall(task->tk_client, gss_auth, cred);
500	if (PTR_ERR(gss_msg) == -EAGAIN) {
501		/* XXX: warning on the first, under the assumption we
502		 * shouldn't normally hit this case on a refresh. */
503		warn_gssd();
504		task->tk_timeout = 15*HZ;
505		rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL);
506		return 0;
507	}
508	if (IS_ERR(gss_msg)) {
509		err = PTR_ERR(gss_msg);
510		goto out;
511	}
512	inode = &gss_msg->inode->vfs_inode;
513	spin_lock(&inode->i_lock);
514	if (gss_cred->gc_upcall != NULL)
515		rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL);
516	else if (gss_msg->ctx != NULL) {
517		gss_cred_set_ctx(task->tk_msg.rpc_cred, gss_msg->ctx);
518		gss_cred->gc_upcall = NULL;
519		rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno);
520	} else if (gss_msg->msg.errno >= 0) {
521		task->tk_timeout = 0;
522		gss_cred->gc_upcall = gss_msg;
523		/* gss_upcall_callback will release the reference to gss_upcall_msg */
524		atomic_inc(&gss_msg->count);
525		rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback);
526	} else
527		err = gss_msg->msg.errno;
528	spin_unlock(&inode->i_lock);
529	gss_release_msg(gss_msg);
530out:
531	dprintk("RPC: %5u gss_refresh_upcall for uid %u result %d\n",
532			task->tk_pid, cred->cr_uid, err);
533	return err;
534}
535
536static inline int
537gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred)
538{
539	struct inode *inode;
540	struct rpc_cred *cred = &gss_cred->gc_base;
541	struct gss_upcall_msg *gss_msg;
542	DEFINE_WAIT(wait);
543	int err = 0;
544
545	dprintk("RPC:       gss_upcall for uid %u\n", cred->cr_uid);
546retry:
547	gss_msg = gss_setup_upcall(gss_auth->client, gss_auth, cred);
548	if (PTR_ERR(gss_msg) == -EAGAIN) {
549		err = wait_event_interruptible_timeout(pipe_version_waitqueue,
550				pipe_version >= 0, 15*HZ);
551		if (err)
552			goto out;
553		if (pipe_version < 0)
554			warn_gssd();
555		goto retry;
556	}
557	if (IS_ERR(gss_msg)) {
558		err = PTR_ERR(gss_msg);
559		goto out;
560	}
561	inode = &gss_msg->inode->vfs_inode;
562	for (;;) {
563		prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_INTERRUPTIBLE);
564		spin_lock(&inode->i_lock);
565		if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) {
566			break;
567		}
568		spin_unlock(&inode->i_lock);
569		if (signalled()) {
570			err = -ERESTARTSYS;
571			goto out_intr;
572		}
573		schedule();
574	}
575	if (gss_msg->ctx)
576		gss_cred_set_ctx(cred, gss_msg->ctx);
577	else
578		err = gss_msg->msg.errno;
579	spin_unlock(&inode->i_lock);
580out_intr:
581	finish_wait(&gss_msg->waitqueue, &wait);
582	gss_release_msg(gss_msg);
583out:
584	dprintk("RPC:       gss_create_upcall for uid %u result %d\n",
585			cred->cr_uid, err);
586	return err;
587}
588
589static ssize_t
590gss_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg,
591		char __user *dst, size_t buflen)
592{
593	char *data = (char *)msg->data + msg->copied;
594	size_t mlen = min(msg->len, buflen);
595	unsigned long left;
596
597	left = copy_to_user(dst, data, mlen);
598	if (left == mlen) {
599		msg->errno = -EFAULT;
600		return -EFAULT;
601	}
602
603	mlen -= left;
604	msg->copied += mlen;
605	msg->errno = 0;
606	return mlen;
607}
608
609#define MSG_BUF_MAXSIZE 1024
610
611static ssize_t
612gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen)
613{
614	const void *p, *end;
615	void *buf;
616	struct gss_upcall_msg *gss_msg;
617	struct inode *inode = filp->f_path.dentry->d_inode;
618	struct gss_cl_ctx *ctx;
619	uid_t uid;
620	ssize_t err = -EFBIG;
621
622	if (mlen > MSG_BUF_MAXSIZE)
623		goto out;
624	err = -ENOMEM;
625	buf = kmalloc(mlen, GFP_NOFS);
626	if (!buf)
627		goto out;
628
629	err = -EFAULT;
630	if (copy_from_user(buf, src, mlen))
631		goto err;
632
633	end = (const void *)((char *)buf + mlen);
634	p = simple_get_bytes(buf, end, &uid, sizeof(uid));
635	if (IS_ERR(p)) {
636		err = PTR_ERR(p);
637		goto err;
638	}
639
640	err = -ENOMEM;
641	ctx = gss_alloc_context();
642	if (ctx == NULL)
643		goto err;
644
645	err = -ENOENT;
646	/* Find a matching upcall */
647	spin_lock(&inode->i_lock);
648	gss_msg = __gss_find_upcall(RPC_I(inode), uid);
649	if (gss_msg == NULL) {
650		spin_unlock(&inode->i_lock);
651		goto err_put_ctx;
652	}
653	list_del_init(&gss_msg->list);
654	spin_unlock(&inode->i_lock);
655
656	p = gss_fill_context(p, end, ctx, gss_msg->auth->mech);
657	if (IS_ERR(p)) {
658		err = PTR_ERR(p);
659		switch (err) {
660		case -EACCES:
661		case -EKEYEXPIRED:
662			gss_msg->msg.errno = err;
663			err = mlen;
664			break;
665		case -EFAULT:
666		case -ENOMEM:
667		case -EINVAL:
668		case -ENOSYS:
669			gss_msg->msg.errno = -EAGAIN;
670			break;
671		default:
672			printk(KERN_CRIT "%s: bad return from "
673				"gss_fill_context: %zd\n", __func__, err);
674			BUG();
675		}
676		goto err_release_msg;
677	}
678	gss_msg->ctx = gss_get_ctx(ctx);
679	err = mlen;
680
681err_release_msg:
682	spin_lock(&inode->i_lock);
683	__gss_unhash_msg(gss_msg);
684	spin_unlock(&inode->i_lock);
685	gss_release_msg(gss_msg);
686err_put_ctx:
687	gss_put_ctx(ctx);
688err:
689	kfree(buf);
690out:
691	dprintk("RPC:       gss_pipe_downcall returning %Zd\n", err);
692	return err;
693}
694
695static int gss_pipe_open(struct inode *inode, int new_version)
696{
697	int ret = 0;
698
699	spin_lock(&pipe_version_lock);
700	if (pipe_version < 0) {
701		/* First open of any gss pipe determines the version: */
702		pipe_version = new_version;
703		rpc_wake_up(&pipe_version_rpc_waitqueue);
704		wake_up(&pipe_version_waitqueue);
705	} else if (pipe_version != new_version) {
706		/* Trying to open a pipe of a different version */
707		ret = -EBUSY;
708		goto out;
709	}
710	atomic_inc(&pipe_users);
711out:
712	spin_unlock(&pipe_version_lock);
713	return ret;
714
715}
716
717static int gss_pipe_open_v0(struct inode *inode)
718{
719	return gss_pipe_open(inode, 0);
720}
721
722static int gss_pipe_open_v1(struct inode *inode)
723{
724	return gss_pipe_open(inode, 1);
725}
726
727static void
728gss_pipe_release(struct inode *inode)
729{
730	struct rpc_inode *rpci = RPC_I(inode);
731	struct gss_upcall_msg *gss_msg;
732
733	spin_lock(&inode->i_lock);
734	while (!list_empty(&rpci->in_downcall)) {
735
736		gss_msg = list_entry(rpci->in_downcall.next,
737				struct gss_upcall_msg, list);
738		gss_msg->msg.errno = -EPIPE;
739		atomic_inc(&gss_msg->count);
740		__gss_unhash_msg(gss_msg);
741		spin_unlock(&inode->i_lock);
742		gss_release_msg(gss_msg);
743		spin_lock(&inode->i_lock);
744	}
745	spin_unlock(&inode->i_lock);
746
747	put_pipe_version();
748}
749
750static void
751gss_pipe_destroy_msg(struct rpc_pipe_msg *msg)
752{
753	struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg);
754
755	if (msg->errno < 0) {
756		dprintk("RPC:       gss_pipe_destroy_msg releasing msg %p\n",
757				gss_msg);
758		atomic_inc(&gss_msg->count);
759		gss_unhash_msg(gss_msg);
760		if (msg->errno == -ETIMEDOUT)
761			warn_gssd();
762		gss_release_msg(gss_msg);
763	}
764}
765
766/*
767 * NOTE: we have the opportunity to use different
768 * parameters based on the input flavor (which must be a pseudoflavor)
769 */
770static struct rpc_auth *
771gss_create(struct rpc_clnt *clnt, rpc_authflavor_t flavor)
772{
773	struct gss_auth *gss_auth;
774	struct rpc_auth * auth;
775	int err = -ENOMEM; /* XXX? */
776
777	dprintk("RPC:       creating GSS authenticator for client %p\n", clnt);
778
779	if (!try_module_get(THIS_MODULE))
780		return ERR_PTR(err);
781	if (!(gss_auth = kmalloc(sizeof(*gss_auth), GFP_KERNEL)))
782		goto out_dec;
783	gss_auth->client = clnt;
784	err = -EINVAL;
785	gss_auth->mech = gss_mech_get_by_pseudoflavor(flavor);
786	if (!gss_auth->mech) {
787		printk(KERN_WARNING "%s: Pseudoflavor %d not found!\n",
788				__func__, flavor);
789		goto err_free;
790	}
791	gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor);
792	if (gss_auth->service == 0)
793		goto err_put_mech;
794	auth = &gss_auth->rpc_auth;
795	auth->au_cslack = GSS_CRED_SLACK >> 2;
796	auth->au_rslack = GSS_VERF_SLACK >> 2;
797	auth->au_ops = &authgss_ops;
798	auth->au_flavor = flavor;
799	atomic_set(&auth->au_count, 1);
800	kref_init(&gss_auth->kref);
801
802	/*
803	 * Note: if we created the old pipe first, then someone who
804	 * examined the directory at the right moment might conclude
805	 * that we supported only the old pipe.  So we instead create
806	 * the new pipe first.
807	 */
808	gss_auth->dentry[1] = rpc_mkpipe(clnt->cl_path.dentry,
809					 "gssd",
810					 clnt, &gss_upcall_ops_v1,
811					 RPC_PIPE_WAIT_FOR_OPEN);
812	if (IS_ERR(gss_auth->dentry[1])) {
813		err = PTR_ERR(gss_auth->dentry[1]);
814		goto err_put_mech;
815	}
816
817	gss_auth->dentry[0] = rpc_mkpipe(clnt->cl_path.dentry,
818					 gss_auth->mech->gm_name,
819					 clnt, &gss_upcall_ops_v0,
820					 RPC_PIPE_WAIT_FOR_OPEN);
821	if (IS_ERR(gss_auth->dentry[0])) {
822		err = PTR_ERR(gss_auth->dentry[0]);
823		goto err_unlink_pipe_1;
824	}
825	err = rpcauth_init_credcache(auth);
826	if (err)
827		goto err_unlink_pipe_0;
828
829	return auth;
830err_unlink_pipe_0:
831	rpc_unlink(gss_auth->dentry[0]);
832err_unlink_pipe_1:
833	rpc_unlink(gss_auth->dentry[1]);
834err_put_mech:
835	gss_mech_put(gss_auth->mech);
836err_free:
837	kfree(gss_auth);
838out_dec:
839	module_put(THIS_MODULE);
840	return ERR_PTR(err);
841}
842
843static void
844gss_free(struct gss_auth *gss_auth)
845{
846	rpc_unlink(gss_auth->dentry[1]);
847	rpc_unlink(gss_auth->dentry[0]);
848	gss_mech_put(gss_auth->mech);
849
850	kfree(gss_auth);
851	module_put(THIS_MODULE);
852}
853
854static void
855gss_free_callback(struct kref *kref)
856{
857	struct gss_auth *gss_auth = container_of(kref, struct gss_auth, kref);
858
859	gss_free(gss_auth);
860}
861
862static void
863gss_destroy(struct rpc_auth *auth)
864{
865	struct gss_auth *gss_auth;
866
867	dprintk("RPC:       destroying GSS authenticator %p flavor %d\n",
868			auth, auth->au_flavor);
869
870	rpcauth_destroy_credcache(auth);
871
872	gss_auth = container_of(auth, struct gss_auth, rpc_auth);
873	kref_put(&gss_auth->kref, gss_free_callback);
874}
875
876/*
877 * gss_destroying_context will cause the RPCSEC_GSS to send a NULL RPC call
878 * to the server with the GSS control procedure field set to
879 * RPC_GSS_PROC_DESTROY. This should normally cause the server to release
880 * all RPCSEC_GSS state associated with that context.
881 */
882static int
883gss_destroying_context(struct rpc_cred *cred)
884{
885	struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base);
886	struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth);
887	struct rpc_task *task;
888
889	if (gss_cred->gc_ctx == NULL ||
890	    test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0)
891		return 0;
892
893	gss_cred->gc_ctx->gc_proc = RPC_GSS_PROC_DESTROY;
894	cred->cr_ops = &gss_nullops;
895
896	/* Take a reference to ensure the cred will be destroyed either
897	 * by the RPC call or by the put_rpccred() below */
898	get_rpccred(cred);
899
900	task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC|RPC_TASK_SOFT);
901	if (!IS_ERR(task))
902		rpc_put_task(task);
903
904	put_rpccred(cred);
905	return 1;
906}
907
908/* gss_destroy_cred (and gss_free_ctx) are used to clean up after failure
909 * to create a new cred or context, so they check that things have been
910 * allocated before freeing them. */
911static void
912gss_do_free_ctx(struct gss_cl_ctx *ctx)
913{
914	dprintk("RPC:       gss_free_ctx\n");
915
916	kfree(ctx->gc_wire_ctx.data);
917	kfree(ctx);
918}
919
920static void
921gss_free_ctx_callback(struct rcu_head *head)
922{
923	struct gss_cl_ctx *ctx = container_of(head, struct gss_cl_ctx, gc_rcu);
924	gss_do_free_ctx(ctx);
925}
926
927static void
928gss_free_ctx(struct gss_cl_ctx *ctx)
929{
930	struct gss_ctx *gc_gss_ctx;
931
932	gc_gss_ctx = rcu_dereference(ctx->gc_gss_ctx);
933	rcu_assign_pointer(ctx->gc_gss_ctx, NULL);
934	call_rcu(&ctx->gc_rcu, gss_free_ctx_callback);
935	if (gc_gss_ctx)
936		gss_delete_sec_context(&gc_gss_ctx);
937}
938
939static void
940gss_free_cred(struct gss_cred *gss_cred)
941{
942	dprintk("RPC:       gss_free_cred %p\n", gss_cred);
943	kfree(gss_cred);
944}
945
946static void
947gss_free_cred_callback(struct rcu_head *head)
948{
949	struct gss_cred *gss_cred = container_of(head, struct gss_cred, gc_base.cr_rcu);
950	gss_free_cred(gss_cred);
951}
952
953static void
954gss_destroy_nullcred(struct rpc_cred *cred)
955{
956	struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base);
957	struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth);
958	struct gss_cl_ctx *ctx = gss_cred->gc_ctx;
959
960	rcu_assign_pointer(gss_cred->gc_ctx, NULL);
961	call_rcu(&cred->cr_rcu, gss_free_cred_callback);
962	if (ctx)
963		gss_put_ctx(ctx);
964	kref_put(&gss_auth->kref, gss_free_callback);
965}
966
967static void
968gss_destroy_cred(struct rpc_cred *cred)
969{
970
971	if (gss_destroying_context(cred))
972		return;
973	gss_destroy_nullcred(cred);
974}
975
976/*
977 * Lookup RPCSEC_GSS cred for the current process
978 */
979static struct rpc_cred *
980gss_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
981{
982	return rpcauth_lookup_credcache(auth, acred, flags);
983}
984
985static struct rpc_cred *
986gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags)
987{
988	struct gss_auth *gss_auth = container_of(auth, struct gss_auth, rpc_auth);
989	struct gss_cred	*cred = NULL;
990	int err = -ENOMEM;
991
992	dprintk("RPC:       gss_create_cred for uid %d, flavor %d\n",
993		acred->uid, auth->au_flavor);
994
995	if (!(cred = kzalloc(sizeof(*cred), GFP_NOFS)))
996		goto out_err;
997
998	rpcauth_init_cred(&cred->gc_base, acred, auth, &gss_credops);
999	/*
1000	 * Note: in order to force a call to call_refresh(), we deliberately
1001	 * fail to flag the credential as RPCAUTH_CRED_UPTODATE.
1002	 */
1003	cred->gc_base.cr_flags = 1UL << RPCAUTH_CRED_NEW;
1004	cred->gc_service = gss_auth->service;
1005	cred->gc_machine_cred = acred->machine_cred;
1006	kref_get(&gss_auth->kref);
1007	return &cred->gc_base;
1008
1009out_err:
1010	dprintk("RPC:       gss_create_cred failed with error %d\n", err);
1011	return ERR_PTR(err);
1012}
1013
1014static int
1015gss_cred_init(struct rpc_auth *auth, struct rpc_cred *cred)
1016{
1017	struct gss_auth *gss_auth = container_of(auth, struct gss_auth, rpc_auth);
1018	struct gss_cred *gss_cred = container_of(cred,struct gss_cred, gc_base);
1019	int err;
1020
1021	do {
1022		err = gss_create_upcall(gss_auth, gss_cred);
1023	} while (err == -EAGAIN);
1024	return err;
1025}
1026
1027static int
1028gss_match(struct auth_cred *acred, struct rpc_cred *rc, int flags)
1029{
1030	struct gss_cred *gss_cred = container_of(rc, struct gss_cred, gc_base);
1031
1032	if (test_bit(RPCAUTH_CRED_NEW, &rc->cr_flags))
1033		goto out;
1034	/* Don't match with creds that have expired. */
1035	if (time_after(jiffies, gss_cred->gc_ctx->gc_expiry))
1036		return 0;
1037	if (!test_bit(RPCAUTH_CRED_UPTODATE, &rc->cr_flags))
1038		return 0;
1039out:
1040	if (acred->machine_cred != gss_cred->gc_machine_cred)
1041		return 0;
1042	return (rc->cr_uid == acred->uid);
1043}
1044
1045/*
1046* Marshal credentials.
1047* Maybe we should keep a cached credential for performance reasons.
1048*/
1049static __be32 *
1050gss_marshal(struct rpc_task *task, __be32 *p)
1051{
1052	struct rpc_cred *cred = task->tk_msg.rpc_cred;
1053	struct gss_cred	*gss_cred = container_of(cred, struct gss_cred,
1054						 gc_base);
1055	struct gss_cl_ctx	*ctx = gss_cred_get_ctx(cred);
1056	__be32		*cred_len;
1057	struct rpc_rqst *req = task->tk_rqstp;
1058	u32             maj_stat = 0;
1059	struct xdr_netobj mic;
1060	struct kvec	iov;
1061	struct xdr_buf	verf_buf;
1062
1063	dprintk("RPC: %5u gss_marshal\n", task->tk_pid);
1064
1065	*p++ = htonl(RPC_AUTH_GSS);
1066	cred_len = p++;
1067
1068	spin_lock(&ctx->gc_seq_lock);
1069	req->rq_seqno = ctx->gc_seq++;
1070	spin_unlock(&ctx->gc_seq_lock);
1071
1072	*p++ = htonl((u32) RPC_GSS_VERSION);
1073	*p++ = htonl((u32) ctx->gc_proc);
1074	*p++ = htonl((u32) req->rq_seqno);
1075	*p++ = htonl((u32) gss_cred->gc_service);
1076	p = xdr_encode_netobj(p, &ctx->gc_wire_ctx);
1077	*cred_len = htonl((p - (cred_len + 1)) << 2);
1078
1079	/* We compute the checksum for the verifier over the xdr-encoded bytes
1080	 * starting with the xid and ending at the end of the credential: */
1081	iov.iov_base = xprt_skip_transport_header(task->tk_xprt,
1082					req->rq_snd_buf.head[0].iov_base);
1083	iov.iov_len = (u8 *)p - (u8 *)iov.iov_base;
1084	xdr_buf_from_iov(&iov, &verf_buf);
1085
1086	/* set verifier flavor*/
1087	*p++ = htonl(RPC_AUTH_GSS);
1088
1089	mic.data = (u8 *)(p + 1);
1090	maj_stat = gss_get_mic(ctx->gc_gss_ctx, &verf_buf, &mic);
1091	if (maj_stat == GSS_S_CONTEXT_EXPIRED) {
1092		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1093	} else if (maj_stat != 0) {
1094		printk("gss_marshal: gss_get_mic FAILED (%d)\n", maj_stat);
1095		goto out_put_ctx;
1096	}
1097	p = xdr_encode_opaque(p, NULL, mic.len);
1098	gss_put_ctx(ctx);
1099	return p;
1100out_put_ctx:
1101	gss_put_ctx(ctx);
1102	return NULL;
1103}
1104
1105static int gss_renew_cred(struct rpc_task *task)
1106{
1107	struct rpc_cred *oldcred = task->tk_msg.rpc_cred;
1108	struct gss_cred *gss_cred = container_of(oldcred,
1109						 struct gss_cred,
1110						 gc_base);
1111	struct rpc_auth *auth = oldcred->cr_auth;
1112	struct auth_cred acred = {
1113		.uid = oldcred->cr_uid,
1114		.machine_cred = gss_cred->gc_machine_cred,
1115	};
1116	struct rpc_cred *new;
1117
1118	new = gss_lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW);
1119	if (IS_ERR(new))
1120		return PTR_ERR(new);
1121	task->tk_msg.rpc_cred = new;
1122	put_rpccred(oldcred);
1123	return 0;
1124}
1125
1126/*
1127* Refresh credentials. XXX - finish
1128*/
1129static int
1130gss_refresh(struct rpc_task *task)
1131{
1132	struct rpc_cred *cred = task->tk_msg.rpc_cred;
1133	int ret = 0;
1134
1135	if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags) &&
1136			!test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags)) {
1137		ret = gss_renew_cred(task);
1138		if (ret < 0)
1139			goto out;
1140		cred = task->tk_msg.rpc_cred;
1141	}
1142
1143	if (test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
1144		ret = gss_refresh_upcall(task);
1145out:
1146	return ret;
1147}
1148
1149/* Dummy refresh routine: used only when destroying the context */
1150static int
1151gss_refresh_null(struct rpc_task *task)
1152{
1153	return -EACCES;
1154}
1155
1156static __be32 *
1157gss_validate(struct rpc_task *task, __be32 *p)
1158{
1159	struct rpc_cred *cred = task->tk_msg.rpc_cred;
1160	struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
1161	__be32		seq;
1162	struct kvec	iov;
1163	struct xdr_buf	verf_buf;
1164	struct xdr_netobj mic;
1165	u32		flav,len;
1166	u32		maj_stat;
1167
1168	dprintk("RPC: %5u gss_validate\n", task->tk_pid);
1169
1170	flav = ntohl(*p++);
1171	if ((len = ntohl(*p++)) > RPC_MAX_AUTH_SIZE)
1172		goto out_bad;
1173	if (flav != RPC_AUTH_GSS)
1174		goto out_bad;
1175	seq = htonl(task->tk_rqstp->rq_seqno);
1176	iov.iov_base = &seq;
1177	iov.iov_len = sizeof(seq);
1178	xdr_buf_from_iov(&iov, &verf_buf);
1179	mic.data = (u8 *)p;
1180	mic.len = len;
1181
1182	maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &verf_buf, &mic);
1183	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
1184		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1185	if (maj_stat) {
1186		dprintk("RPC: %5u gss_validate: gss_verify_mic returned "
1187				"error 0x%08x\n", task->tk_pid, maj_stat);
1188		goto out_bad;
1189	}
1190	/* We leave it to unwrap to calculate au_rslack. For now we just
1191	 * calculate the length of the verifier: */
1192	cred->cr_auth->au_verfsize = XDR_QUADLEN(len) + 2;
1193	gss_put_ctx(ctx);
1194	dprintk("RPC: %5u gss_validate: gss_verify_mic succeeded.\n",
1195			task->tk_pid);
1196	return p + XDR_QUADLEN(len);
1197out_bad:
1198	gss_put_ctx(ctx);
1199	dprintk("RPC: %5u gss_validate failed.\n", task->tk_pid);
1200	return NULL;
1201}
1202
1203static inline int
1204gss_wrap_req_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
1205		kxdrproc_t encode, struct rpc_rqst *rqstp, __be32 *p, void *obj)
1206{
1207	struct xdr_buf	*snd_buf = &rqstp->rq_snd_buf;
1208	struct xdr_buf	integ_buf;
1209	__be32          *integ_len = NULL;
1210	struct xdr_netobj mic;
1211	u32		offset;
1212	__be32		*q;
1213	struct kvec	*iov;
1214	u32             maj_stat = 0;
1215	int		status = -EIO;
1216
1217	integ_len = p++;
1218	offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
1219	*p++ = htonl(rqstp->rq_seqno);
1220
1221	status = encode(rqstp, p, obj);
1222	if (status)
1223		return status;
1224
1225	if (xdr_buf_subsegment(snd_buf, &integ_buf,
1226				offset, snd_buf->len - offset))
1227		return status;
1228	*integ_len = htonl(integ_buf.len);
1229
1230	/* guess whether we're in the head or the tail: */
1231	if (snd_buf->page_len || snd_buf->tail[0].iov_len)
1232		iov = snd_buf->tail;
1233	else
1234		iov = snd_buf->head;
1235	p = iov->iov_base + iov->iov_len;
1236	mic.data = (u8 *)(p + 1);
1237
1238	maj_stat = gss_get_mic(ctx->gc_gss_ctx, &integ_buf, &mic);
1239	status = -EIO; /* XXX? */
1240	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
1241		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1242	else if (maj_stat)
1243		return status;
1244	q = xdr_encode_opaque(p, NULL, mic.len);
1245
1246	offset = (u8 *)q - (u8 *)p;
1247	iov->iov_len += offset;
1248	snd_buf->len += offset;
1249	return 0;
1250}
1251
1252static void
1253priv_release_snd_buf(struct rpc_rqst *rqstp)
1254{
1255	int i;
1256
1257	for (i=0; i < rqstp->rq_enc_pages_num; i++)
1258		__free_page(rqstp->rq_enc_pages[i]);
1259	kfree(rqstp->rq_enc_pages);
1260}
1261
1262static int
1263alloc_enc_pages(struct rpc_rqst *rqstp)
1264{
1265	struct xdr_buf *snd_buf = &rqstp->rq_snd_buf;
1266	int first, last, i;
1267
1268	if (snd_buf->page_len == 0) {
1269		rqstp->rq_enc_pages_num = 0;
1270		return 0;
1271	}
1272
1273	first = snd_buf->page_base >> PAGE_CACHE_SHIFT;
1274	last = (snd_buf->page_base + snd_buf->page_len - 1) >> PAGE_CACHE_SHIFT;
1275	rqstp->rq_enc_pages_num = last - first + 1 + 1;
1276	rqstp->rq_enc_pages
1277		= kmalloc(rqstp->rq_enc_pages_num * sizeof(struct page *),
1278				GFP_NOFS);
1279	if (!rqstp->rq_enc_pages)
1280		goto out;
1281	for (i=0; i < rqstp->rq_enc_pages_num; i++) {
1282		rqstp->rq_enc_pages[i] = alloc_page(GFP_NOFS);
1283		if (rqstp->rq_enc_pages[i] == NULL)
1284			goto out_free;
1285	}
1286	rqstp->rq_release_snd_buf = priv_release_snd_buf;
1287	return 0;
1288out_free:
1289	rqstp->rq_enc_pages_num = i;
1290	priv_release_snd_buf(rqstp);
1291out:
1292	return -EAGAIN;
1293}
1294
1295static inline int
1296gss_wrap_req_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
1297		kxdrproc_t encode, struct rpc_rqst *rqstp, __be32 *p, void *obj)
1298{
1299	struct xdr_buf	*snd_buf = &rqstp->rq_snd_buf;
1300	u32		offset;
1301	u32             maj_stat;
1302	int		status;
1303	__be32		*opaque_len;
1304	struct page	**inpages;
1305	int		first;
1306	int		pad;
1307	struct kvec	*iov;
1308	char		*tmp;
1309
1310	opaque_len = p++;
1311	offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base;
1312	*p++ = htonl(rqstp->rq_seqno);
1313
1314	status = encode(rqstp, p, obj);
1315	if (status)
1316		return status;
1317
1318	status = alloc_enc_pages(rqstp);
1319	if (status)
1320		return status;
1321	first = snd_buf->page_base >> PAGE_CACHE_SHIFT;
1322	inpages = snd_buf->pages + first;
1323	snd_buf->pages = rqstp->rq_enc_pages;
1324	snd_buf->page_base -= first << PAGE_CACHE_SHIFT;
1325	/*
1326	 * Give the tail its own page, in case we need extra space in the
1327	 * head when wrapping:
1328	 *
1329	 * call_allocate() allocates twice the slack space required
1330	 * by the authentication flavor to rq_callsize.
1331	 * For GSS, slack is GSS_CRED_SLACK.
1332	 */
1333	if (snd_buf->page_len || snd_buf->tail[0].iov_len) {
1334		tmp = page_address(rqstp->rq_enc_pages[rqstp->rq_enc_pages_num - 1]);
1335		memcpy(tmp, snd_buf->tail[0].iov_base, snd_buf->tail[0].iov_len);
1336		snd_buf->tail[0].iov_base = tmp;
1337	}
1338	maj_stat = gss_wrap(ctx->gc_gss_ctx, offset, snd_buf, inpages);
1339	/* slack space should prevent this ever happening: */
1340	BUG_ON(snd_buf->len > snd_buf->buflen);
1341	status = -EIO;
1342	/* We're assuming that when GSS_S_CONTEXT_EXPIRED, the encryption was
1343	 * done anyway, so it's safe to put the request on the wire: */
1344	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
1345		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1346	else if (maj_stat)
1347		return status;
1348
1349	*opaque_len = htonl(snd_buf->len - offset);
1350	/* guess whether we're in the head or the tail: */
1351	if (snd_buf->page_len || snd_buf->tail[0].iov_len)
1352		iov = snd_buf->tail;
1353	else
1354		iov = snd_buf->head;
1355	p = iov->iov_base + iov->iov_len;
1356	pad = 3 - ((snd_buf->len - offset - 1) & 3);
1357	memset(p, 0, pad);
1358	iov->iov_len += pad;
1359	snd_buf->len += pad;
1360
1361	return 0;
1362}
1363
1364static int
1365gss_wrap_req(struct rpc_task *task,
1366	     kxdrproc_t encode, void *rqstp, __be32 *p, void *obj)
1367{
1368	struct rpc_cred *cred = task->tk_msg.rpc_cred;
1369	struct gss_cred	*gss_cred = container_of(cred, struct gss_cred,
1370			gc_base);
1371	struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
1372	int             status = -EIO;
1373
1374	dprintk("RPC: %5u gss_wrap_req\n", task->tk_pid);
1375	if (ctx->gc_proc != RPC_GSS_PROC_DATA) {
1376		/* The spec seems a little ambiguous here, but I think that not
1377		 * wrapping context destruction requests makes the most sense.
1378		 */
1379		status = encode(rqstp, p, obj);
1380		goto out;
1381	}
1382	switch (gss_cred->gc_service) {
1383		case RPC_GSS_SVC_NONE:
1384			status = encode(rqstp, p, obj);
1385			break;
1386		case RPC_GSS_SVC_INTEGRITY:
1387			status = gss_wrap_req_integ(cred, ctx, encode,
1388								rqstp, p, obj);
1389			break;
1390		case RPC_GSS_SVC_PRIVACY:
1391			status = gss_wrap_req_priv(cred, ctx, encode,
1392					rqstp, p, obj);
1393			break;
1394	}
1395out:
1396	gss_put_ctx(ctx);
1397	dprintk("RPC: %5u gss_wrap_req returning %d\n", task->tk_pid, status);
1398	return status;
1399}
1400
1401static inline int
1402gss_unwrap_resp_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
1403		struct rpc_rqst *rqstp, __be32 **p)
1404{
1405	struct xdr_buf	*rcv_buf = &rqstp->rq_rcv_buf;
1406	struct xdr_buf integ_buf;
1407	struct xdr_netobj mic;
1408	u32 data_offset, mic_offset;
1409	u32 integ_len;
1410	u32 maj_stat;
1411	int status = -EIO;
1412
1413	integ_len = ntohl(*(*p)++);
1414	if (integ_len & 3)
1415		return status;
1416	data_offset = (u8 *)(*p) - (u8 *)rcv_buf->head[0].iov_base;
1417	mic_offset = integ_len + data_offset;
1418	if (mic_offset > rcv_buf->len)
1419		return status;
1420	if (ntohl(*(*p)++) != rqstp->rq_seqno)
1421		return status;
1422
1423	if (xdr_buf_subsegment(rcv_buf, &integ_buf, data_offset,
1424				mic_offset - data_offset))
1425		return status;
1426
1427	if (xdr_buf_read_netobj(rcv_buf, &mic, mic_offset))
1428		return status;
1429
1430	maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &integ_buf, &mic);
1431	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
1432		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1433	if (maj_stat != GSS_S_COMPLETE)
1434		return status;
1435	return 0;
1436}
1437
1438static inline int
1439gss_unwrap_resp_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx,
1440		struct rpc_rqst *rqstp, __be32 **p)
1441{
1442	struct xdr_buf  *rcv_buf = &rqstp->rq_rcv_buf;
1443	u32 offset;
1444	u32 opaque_len;
1445	u32 maj_stat;
1446	int status = -EIO;
1447
1448	opaque_len = ntohl(*(*p)++);
1449	offset = (u8 *)(*p) - (u8 *)rcv_buf->head[0].iov_base;
1450	if (offset + opaque_len > rcv_buf->len)
1451		return status;
1452	/* remove padding: */
1453	rcv_buf->len = offset + opaque_len;
1454
1455	maj_stat = gss_unwrap(ctx->gc_gss_ctx, offset, rcv_buf);
1456	if (maj_stat == GSS_S_CONTEXT_EXPIRED)
1457		clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
1458	if (maj_stat != GSS_S_COMPLETE)
1459		return status;
1460	if (ntohl(*(*p)++) != rqstp->rq_seqno)
1461		return status;
1462
1463	return 0;
1464}
1465
1466
1467static int
1468gss_unwrap_resp(struct rpc_task *task,
1469		kxdrproc_t decode, void *rqstp, __be32 *p, void *obj)
1470{
1471	struct rpc_cred *cred = task->tk_msg.rpc_cred;
1472	struct gss_cred *gss_cred = container_of(cred, struct gss_cred,
1473			gc_base);
1474	struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred);
1475	__be32		*savedp = p;
1476	struct kvec	*head = ((struct rpc_rqst *)rqstp)->rq_rcv_buf.head;
1477	int		savedlen = head->iov_len;
1478	int             status = -EIO;
1479
1480	if (ctx->gc_proc != RPC_GSS_PROC_DATA)
1481		goto out_decode;
1482	switch (gss_cred->gc_service) {
1483		case RPC_GSS_SVC_NONE:
1484			break;
1485		case RPC_GSS_SVC_INTEGRITY:
1486			status = gss_unwrap_resp_integ(cred, ctx, rqstp, &p);
1487			if (status)
1488				goto out;
1489			break;
1490		case RPC_GSS_SVC_PRIVACY:
1491			status = gss_unwrap_resp_priv(cred, ctx, rqstp, &p);
1492			if (status)
1493				goto out;
1494			break;
1495	}
1496	/* take into account extra slack for integrity and privacy cases: */
1497	cred->cr_auth->au_rslack = cred->cr_auth->au_verfsize + (p - savedp)
1498						+ (savedlen - head->iov_len);
1499out_decode:
1500	status = decode(rqstp, p, obj);
1501out:
1502	gss_put_ctx(ctx);
1503	dprintk("RPC: %5u gss_unwrap_resp returning %d\n", task->tk_pid,
1504			status);
1505	return status;
1506}
1507
1508static const struct rpc_authops authgss_ops = {
1509	.owner		= THIS_MODULE,
1510	.au_flavor	= RPC_AUTH_GSS,
1511	.au_name	= "RPCSEC_GSS",
1512	.create		= gss_create,
1513	.destroy	= gss_destroy,
1514	.lookup_cred	= gss_lookup_cred,
1515	.crcreate	= gss_create_cred
1516};
1517
1518static const struct rpc_credops gss_credops = {
1519	.cr_name	= "AUTH_GSS",
1520	.crdestroy	= gss_destroy_cred,
1521	.cr_init	= gss_cred_init,
1522	.crbind		= rpcauth_generic_bind_cred,
1523	.crmatch	= gss_match,
1524	.crmarshal	= gss_marshal,
1525	.crrefresh	= gss_refresh,
1526	.crvalidate	= gss_validate,
1527	.crwrap_req	= gss_wrap_req,
1528	.crunwrap_resp	= gss_unwrap_resp,
1529};
1530
1531static const struct rpc_credops gss_nullops = {
1532	.cr_name	= "AUTH_GSS",
1533	.crdestroy	= gss_destroy_nullcred,
1534	.crbind		= rpcauth_generic_bind_cred,
1535	.crmatch	= gss_match,
1536	.crmarshal	= gss_marshal,
1537	.crrefresh	= gss_refresh_null,
1538	.crvalidate	= gss_validate,
1539	.crwrap_req	= gss_wrap_req,
1540	.crunwrap_resp	= gss_unwrap_resp,
1541};
1542
1543static const struct rpc_pipe_ops gss_upcall_ops_v0 = {
1544	.upcall		= gss_pipe_upcall,
1545	.downcall	= gss_pipe_downcall,
1546	.destroy_msg	= gss_pipe_destroy_msg,
1547	.open_pipe	= gss_pipe_open_v0,
1548	.release_pipe	= gss_pipe_release,
1549};
1550
1551static const struct rpc_pipe_ops gss_upcall_ops_v1 = {
1552	.upcall		= gss_pipe_upcall,
1553	.downcall	= gss_pipe_downcall,
1554	.destroy_msg	= gss_pipe_destroy_msg,
1555	.open_pipe	= gss_pipe_open_v1,
1556	.release_pipe	= gss_pipe_release,
1557};
1558
1559/*
1560 * Initialize RPCSEC_GSS module
1561 */
1562static int __init init_rpcsec_gss(void)
1563{
1564	int err = 0;
1565
1566	err = rpcauth_register(&authgss_ops);
1567	if (err)
1568		goto out;
1569	err = gss_svc_init();
1570	if (err)
1571		goto out_unregister;
1572	rpc_init_wait_queue(&pipe_version_rpc_waitqueue, "gss pipe version");
1573	return 0;
1574out_unregister:
1575	rpcauth_unregister(&authgss_ops);
1576out:
1577	return err;
1578}
1579
1580static void __exit exit_rpcsec_gss(void)
1581{
1582	gss_svc_shutdown();
1583	rpcauth_unregister(&authgss_ops);
1584	rcu_barrier(); /* Wait for completion of call_rcu()'s */
1585}
1586
1587MODULE_LICENSE("GPL");
1588module_init(init_rpcsec_gss)
1589module_exit(exit_rpcsec_gss)
1590