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