brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 16d6f90 Raw
75 lines · cpp
1//===-- hwasan_memintrinsics.cpp --------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file is a part of HWAddressSanitizer and contains HWASAN versions of11/// memset, memcpy and memmove12///13//===----------------------------------------------------------------------===//14 15#include <string.h>16#include "hwasan.h"17#include "hwasan_checks.h"18#include "hwasan_flags.h"19#include "hwasan_interface_internal.h"20#include "sanitizer_common/sanitizer_libc.h"21 22using namespace __hwasan;23 24void *__hwasan_memset(void *block, int c, uptr size) {25  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(26      reinterpret_cast<uptr>(block), size);27  return memset(block, c, size);28}29 30void *__hwasan_memcpy(void *to, const void *from, uptr size) {31  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(32      reinterpret_cast<uptr>(to), size);33  CheckAddressSized<ErrorAction::Recover, AccessType::Load>(34      reinterpret_cast<uptr>(from), size);35  return memcpy(to, from, size);36}37 38void *__hwasan_memmove(void *to, const void *from, uptr size) {39  CheckAddressSized<ErrorAction::Recover, AccessType::Store>(40      reinterpret_cast<uptr>(to), size);41  CheckAddressSized<ErrorAction::Recover, AccessType::Load>(42      reinterpret_cast<uptr>(from), size);43  return memmove(to, from, size);44}45 46void *__hwasan_memset_match_all(void *block, int c, uptr size,47                                u8 match_all_tag) {48  if (GetTagFromPointer(reinterpret_cast<uptr>(block)) != match_all_tag)49    CheckAddressSized<ErrorAction::Recover, AccessType::Store>(50        reinterpret_cast<uptr>(block), size);51  return memset(block, c, size);52}53 54void *__hwasan_memcpy_match_all(void *to, const void *from, uptr size,55                                u8 match_all_tag) {56  if (GetTagFromPointer(reinterpret_cast<uptr>(to)) != match_all_tag)57    CheckAddressSized<ErrorAction::Recover, AccessType::Store>(58        reinterpret_cast<uptr>(to), size);59  if (GetTagFromPointer(reinterpret_cast<uptr>(from)) != match_all_tag)60    CheckAddressSized<ErrorAction::Recover, AccessType::Load>(61        reinterpret_cast<uptr>(from), size);62  return memcpy(to, from, size);63}64 65void *__hwasan_memmove_match_all(void *to, const void *from, uptr size,66                                 u8 match_all_tag) {67  if (GetTagFromPointer(reinterpret_cast<uptr>(to)) != match_all_tag)68    CheckAddressSized<ErrorAction::Recover, AccessType::Store>(69        reinterpret_cast<uptr>(to), size);70  if (GetTagFromPointer(reinterpret_cast<uptr>(from)) != match_all_tag)71    CheckAddressSized<ErrorAction::Recover, AccessType::Load>(72        reinterpret_cast<uptr>(from), size);73  return memmove(to, from, size);74}75