/****************************************************************************** * * Copyright (c) 2019 Intel. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *******************************************************************************/ /** * @file This file defines all the functions used for * memory operations. * **/ #include #include #include "nr5g_fapi_wls.h" uint8_t nr5g_fapi_memcpy_bound_check( void *d, size_t x, const void *s, size_t n) { // Memory block size and destination/source boundary check if ((n >= (MSG_MAXSIZE)) || (n > x)) { printf ("[MEMCPY FAILED] %s : %d : max block size: %d, memcpy dst size: %ld, memcpy src size: %ld\n", __func__, __LINE__, MSG_MAXSIZE, x, n); return FAILURE; } // Overlap check: source pointer overruns destination pointer if ((char *)s < (char *)d) { if ((((char *)s + x) >= (char *)d) || (((char *)s + n) >= (char *)d)) { printf("[MEMCPY FAILED] %s : %d : max block size: %d, \ memcpy dst size: %ld, strcpy src size: %ld, \ Source pointer %p overlaps into destination pointer %p\n", __func__, __LINE__, MSG_MAXSIZE, x, n, s, d); return FAILURE; } } // Overlap check: destination pointer overruns source pointer if ((char *)d < (char *)s) { if ((((char *)d + x) >= (char *)s) || (((char *)d + n) >= (char *)s)) { printf("[MEMCPY FAILED] %s : %d : max block size: %d, \ memcpy dst size: %ld, strcpy src size: %ld, \ Destination pointer %p overlaps into source pointer %p\n", __func__, __LINE__, MSG_MAXSIZE, x, n, d, s); return FAILURE; } } rte_memcpy(d, s, n); return SUCCESS; } uint8_t nr5g_fapi_memset_bound_check( void *s, size_t x, int32_t c, size_t n) { // Memory block size and destination/source boundary check if ((n >= MSG_MAXSIZE) || (n > x)) { printf ("[MEMSET FAILED] %s : %d : max block size: %d, memset dst size: %ld, memset src size: %ld\n", __func__, __LINE__, MSG_MAXSIZE, x, n); return FAILURE; } memset(s, c, n); return SUCCESS; } uint8_t nr5g_fapi_strcpy_bound_check( char *d, size_t x, const char *s, size_t n) { // Memory block size and destination/source boundary check if ((n >= MSG_MAXSIZE) || (n > x)) { printf("[STRNCPY FAILED] %s : %d : max block size: %d, \ strcpy dst size: %ld, strcpy src size: %ld\n", __func__, __LINE__, MSG_MAXSIZE, x, n); return FAILURE; } // Overlap check: source pointer overruns destination pointer if ((char *)s < (char *)d) { if ((((char *)s + x) >= (char *)d) || (((char *)s + n) >= (char *)d)) { printf("[STRNCPY FAILED] %s : %d : max block size: %d, \ strcpy dst size: %ld, strcpy src size: %ld, \ Source pointer %p overlaps into destination pointer %p\n", __func__, __LINE__, MSG_MAXSIZE, x, n, s, d); return FAILURE; } } // Overlap check: destination pointer overruns source pointer if ((char *)d < (char *)s) { if ((((char *)d + x) >= (char *)s) || (((char *)d + n) >= (char *)s)) { printf("[STRNCPY FAILED] %s : %d : max block size: %d, \ strcpy dst size: %ld, strcpy src size: %ld, \ Destination pointer %p overlaps into source pointer %p\n", __func__, __LINE__, MSG_MAXSIZE, x, n, d, s); return FAILURE; } } strncpy(d, s, n); return SUCCESS; }