162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * linux/net/sunrpc/auth_gss/auth_gss_internal.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Internal definitions for RPCSEC_GSS client authentication
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (c) 2000 The Regents of the University of Michigan.
862306a36Sopenharmony_ci * All rights reserved.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci#include <linux/err.h>
1262306a36Sopenharmony_ci#include <linux/string.h>
1362306a36Sopenharmony_ci#include <linux/sunrpc/xdr.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic inline const void *
1662306a36Sopenharmony_cisimple_get_bytes(const void *p, const void *end, void *res, size_t len)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	const void *q = (const void *)((const char *)p + len);
1962306a36Sopenharmony_ci	if (unlikely(q > end || q < p))
2062306a36Sopenharmony_ci		return ERR_PTR(-EFAULT);
2162306a36Sopenharmony_ci	memcpy(res, p, len);
2262306a36Sopenharmony_ci	return q;
2362306a36Sopenharmony_ci}
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_cistatic inline const void *
2662306a36Sopenharmony_cisimple_get_netobj(const void *p, const void *end, struct xdr_netobj *dest)
2762306a36Sopenharmony_ci{
2862306a36Sopenharmony_ci	const void *q;
2962306a36Sopenharmony_ci	unsigned int len;
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	p = simple_get_bytes(p, end, &len, sizeof(len));
3262306a36Sopenharmony_ci	if (IS_ERR(p))
3362306a36Sopenharmony_ci		return p;
3462306a36Sopenharmony_ci	q = (const void *)((const char *)p + len);
3562306a36Sopenharmony_ci	if (unlikely(q > end || q < p))
3662306a36Sopenharmony_ci		return ERR_PTR(-EFAULT);
3762306a36Sopenharmony_ci	if (len) {
3862306a36Sopenharmony_ci		dest->data = kmemdup(p, len, GFP_KERNEL);
3962306a36Sopenharmony_ci		if (unlikely(dest->data == NULL))
4062306a36Sopenharmony_ci			return ERR_PTR(-ENOMEM);
4162306a36Sopenharmony_ci	} else
4262306a36Sopenharmony_ci		dest->data = NULL;
4362306a36Sopenharmony_ci	dest->len = len;
4462306a36Sopenharmony_ci	return q;
4562306a36Sopenharmony_ci}
46