1ba6dfce4SDave Wysochanski // SPDX-License-Identifier: BSD-3-Clause 2ba6dfce4SDave Wysochanski /* 3ba6dfce4SDave Wysochanski * linux/net/sunrpc/auth_gss/auth_gss_internal.h 4ba6dfce4SDave Wysochanski * 5ba6dfce4SDave Wysochanski * Internal definitions for RPCSEC_GSS client authentication 6ba6dfce4SDave Wysochanski * 7ba6dfce4SDave Wysochanski * Copyright (c) 2000 The Regents of the University of Michigan. 8ba6dfce4SDave Wysochanski * All rights reserved. 9ba6dfce4SDave Wysochanski * 10ba6dfce4SDave Wysochanski */ 11ba6dfce4SDave Wysochanski #include <linux/err.h> 12ba6dfce4SDave Wysochanski #include <linux/string.h> 13ba6dfce4SDave Wysochanski #include <linux/sunrpc/xdr.h> 14ba6dfce4SDave Wysochanski 15ba6dfce4SDave Wysochanski static inline const void * 16ba6dfce4SDave Wysochanski simple_get_bytes(const void *p, const void *end, void *res, size_t len) 17ba6dfce4SDave Wysochanski { 18ba6dfce4SDave Wysochanski const void *q = (const void *)((const char *)p + len); 19ba6dfce4SDave Wysochanski if (unlikely(q > end || q < p)) 20ba6dfce4SDave Wysochanski return ERR_PTR(-EFAULT); 21ba6dfce4SDave Wysochanski memcpy(res, p, len); 22ba6dfce4SDave Wysochanski return q; 23ba6dfce4SDave Wysochanski } 24ba6dfce4SDave Wysochanski 25ba6dfce4SDave Wysochanski static inline const void * 26ba6dfce4SDave Wysochanski simple_get_netobj(const void *p, const void *end, struct xdr_netobj *dest) 27ba6dfce4SDave Wysochanski { 28ba6dfce4SDave Wysochanski const void *q; 29ba6dfce4SDave Wysochanski unsigned int len; 30ba6dfce4SDave Wysochanski 31ba6dfce4SDave Wysochanski p = simple_get_bytes(p, end, &len, sizeof(len)); 32ba6dfce4SDave Wysochanski if (IS_ERR(p)) 33ba6dfce4SDave Wysochanski return p; 34ba6dfce4SDave Wysochanski q = (const void *)((const char *)p + len); 35ba6dfce4SDave Wysochanski if (unlikely(q > end || q < p)) 36ba6dfce4SDave Wysochanski return ERR_PTR(-EFAULT); 37*e4a7d1f7SDave Wysochanski if (len) { 38ba6dfce4SDave Wysochanski dest->data = kmemdup(p, len, GFP_NOFS); 39ba6dfce4SDave Wysochanski if (unlikely(dest->data == NULL)) 40ba6dfce4SDave Wysochanski return ERR_PTR(-ENOMEM); 41*e4a7d1f7SDave Wysochanski } else 42*e4a7d1f7SDave Wysochanski dest->data = NULL; 43ba6dfce4SDave Wysochanski dest->len = len; 44ba6dfce4SDave Wysochanski return q; 45ba6dfce4SDave Wysochanski } 46