1/* 2 * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include "los_lms_pri.h" 33 34ATTRIBUTE_NO_SANITIZE_ADDRESS void LmsFree(void *ptr) 35{ 36 if (ptr == NULL) { 37 return; 38 } 39 40 size_t allocSize = malloc_usable_size(ptr); 41 uintptr_t shadowAddr, offset; 42 LmsMem2Shadow((uintptr_t)ptr, &shadowAddr, &offset); 43 44 LmsLock(&g_lmsMutex); 45 if (LmsIsShadowAddrMapped(shadowAddr, shadowAddr) == LMS_OK) { 46 uint32_t acShadowValue; 47 LmsGetShadowValue((uintptr_t)ptr, &acShadowValue); 48 if (acShadowValue != LMS_SHADOW_ACCESSIBLE) { 49 char erroMode = (acShadowValue == LMS_SHADOW_AFTERFREE ? FREE_ERRORMODE : UNKNOWN_ERROR); 50 LmsReportError((uintptr_t)ptr, MEM_REGION_SIZE_1, erroMode); 51 goto UNLOCK_OUT; 52 } 53 } else { 54 LMS_OUTPUT_ERROR("Error! Free an unallocated memory:%p!\n", ptr); 55 goto UNLOCK_OUT; 56 } 57 58 __real_free(ptr); 59 LmsSetShadowValue((uintptr_t)ptr, (uintptr_t)ptr + allocSize, LMS_SHADOW_AFTERFREE_U8); 60 61UNLOCK_OUT: 62 LmsUnlock(&g_lmsMutex); 63} 64 65ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsMalloc(size_t size) 66{ 67 void *ptr = __real_malloc(size); 68 if (ptr == NULL) { 69 return ptr; 70 } 71 return LmsTagMem(ptr, size); 72} 73 74ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsRealloc(void *ptr, size_t size) 75{ 76 void *p = __real_realloc(ptr, size); 77 if (p == NULL) { 78 return p; 79 } 80 return LmsTagMem(p, size); 81} 82 83ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsCalloc(size_t m, size_t n) 84{ 85 void *p = __real_calloc(m, n); 86 if (p == NULL) { 87 return p; 88 } 89 return LmsTagMem(p, n * m); 90} 91 92ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsValloc(size_t size) 93{ 94 void *p = __real_valloc(size); 95 if (p == NULL) { 96 return p; 97 } 98 return LmsTagMem(p, size); 99} 100 101ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsAlignedAlloc(size_t align, size_t len) 102{ 103 void *p = __real_aligned_alloc(align, len); 104 if (p == NULL) { 105 return p; 106 } 107 return LmsTagMem(p, len); 108} 109 110ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_aligned_alloc(size_t align, size_t len) 111{ 112 return LmsAlignedAlloc(align, len); 113} 114 115ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_valloc(size_t size) 116{ 117 return LmsValloc(size); 118} 119 120ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_calloc(size_t m, size_t n) 121{ 122 return LmsCalloc(m, n); 123} 124 125ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_realloc(void *p, size_t n) 126{ 127 return LmsRealloc(p, n); 128} 129 130ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_malloc(size_t size) 131{ 132 return LmsMalloc(size); 133} 134 135ATTRIBUTE_NO_SANITIZE_ADDRESS void __wrap_free(void *ptr) 136{ 137 return LmsFree(ptr); 138} 139 140ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsMemset(void *p, int n, size_t size) 141{ 142 __asan_storeN_noabort((uintptr_t)p, size); 143 144 return __real_memset(p, n, size); 145} 146 147ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_memset(void *p, int n, size_t size) 148{ 149 return LmsMemset(p, n, size); 150} 151 152ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsMemcpy(void *__restrict dest, const void *__restrict src, size_t size) 153{ 154 __asan_loadN_noabort((uintptr_t)src, size); 155 __asan_storeN_noabort((uintptr_t)dest, size); 156 157 return __real_memcpy(dest, src, size); 158} 159 160ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_memcpy(void *__restrict dest, const void *__restrict src, size_t size) 161{ 162 return LmsMemcpy(dest, src, size); 163} 164 165ATTRIBUTE_NO_SANITIZE_ADDRESS void *LmsMemmove(void *dest, const void *src, size_t len) 166{ 167 __asan_loadN_noabort((uintptr_t)src, len); 168 __asan_storeN_noabort((uintptr_t)dest, len); 169 170 return __real_memmove(dest, src, len); 171} 172 173ATTRIBUTE_NO_SANITIZE_ADDRESS void *__wrap_memmove(void *dest, const void *src, size_t len) 174{ 175 return LmsMemmove(dest, src, len); 176} 177 178ATTRIBUTE_NO_SANITIZE_ADDRESS char *LmsStrcat(char *s, const char *append) 179{ 180 if ((s == NULL) || (append == NULL)) { 181 return NULL; 182 } 183 184 char *save = s; 185 for (; *s != '\0'; ++s) { 186 } 187 LmsCheckValid(s, append); 188 189 return __real_strcat(save, append); 190} 191 192ATTRIBUTE_NO_SANITIZE_ADDRESS char *__wrap_strcat(char *s, const char *append) 193{ 194 return LmsStrcat(s, append); 195} 196 197ATTRIBUTE_NO_SANITIZE_ADDRESS char *LmsStrcpy(char *dest, const char *src) 198{ 199 if ((dest == NULL) || (src == NULL)) { 200 return NULL; 201 } 202 203 LmsCheckValid(dest, src); 204 return __real_strcpy(dest, src); 205} 206 207ATTRIBUTE_NO_SANITIZE_ADDRESS char *__wrap_strcpy(char *dest, const char *src) 208{ 209 return LmsStrcpy(dest, src); 210}