net/sunrpc/auth_gss/gss_rpc_upcall.c

Source file repositories/reference/linux-study-clean/net/sunrpc/auth_gss/gss_rpc_upcall.c

File Facts

System
Linux kernel
Corpus path
net/sunrpc/auth_gss/gss_rpc_upcall.c
Extension
.c
Size
9655 bytes
Lines
404
Domain
Networking Core
Bucket
Sockets, Protocols, Packet Path, And Network Policy
Inferred role
Networking Core: implementation source
Status
source implementation candidate

Why This File Exists

Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (status) {
		case -EPROTONOSUPPORT:
			status = -EINVAL;
			break;
		case -ECONNREFUSED:
		case -ETIMEDOUT:
		case -ENOTCONN:
			status = -EAGAIN;
			break;
		case -ERESTARTSYS:
			if (signalled ())
				status = -EINTR;
			break;
		default:
			break;
		}
	}
	rpc_release_client(clnt);
	return status;
}

static void gssp_free_receive_pages(struct gssx_arg_accept_sec_context *arg)
{
	unsigned int i;

	for (i = 0; i < arg->npages && arg->pages[i]; i++)
		__free_page(arg->pages[i]);

	kfree(arg->pages);
}

static int gssp_alloc_receive_pages(struct gssx_arg_accept_sec_context *arg)
{
	unsigned int i;

	arg->npages = DIV_ROUND_UP(NGROUPS_MAX * 4, PAGE_SIZE);
	arg->pages = kzalloc_objs(struct page *, arg->npages);
	if (!arg->pages)
		return -ENOMEM;
	for (i = 0; i < arg->npages; i++) {
		arg->pages[i] = alloc_page(GFP_KERNEL);
		if (!arg->pages[i]) {
			gssp_free_receive_pages(arg);
			return -ENOMEM;
		}
	}
	return 0;
}

static char *gssp_stringify(struct xdr_netobj *netobj)
{
	return kmemdup_nul(netobj->data, netobj->len, GFP_KERNEL);
}

static void gssp_hostbased_service(char **principal)
{
	char *c;

	if (!*principal)
		return;

	/* terminate and remove realm part */
	c = strchr(*principal, '@');
	if (c) {
		*c = '\0';

		/* change service-hostname delimiter */
		c = strchr(*principal, '/');
		if (c)
			*c = '@';
	}
	if (!c) {
		/* not a service principal */
		kfree(*principal);
		*principal = NULL;
	}
}

/*
 * Public functions
 */

/* numbers somewhat arbitrary but large enough for current needs */
#define GSSX_MAX_OUT_HANDLE	128
#define GSSX_MAX_SRC_PRINC	256
#define GSSX_KMEMBUF (GSSX_max_output_handle_sz + \
			GSSX_max_oid_sz + \
			GSSX_max_princ_sz + \
			sizeof(struct svc_cred))

Annotation

Implementation Notes