brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 4f9ba52 Raw
66 lines · cpp
1//===-- msan_dl.cpp -------------------------------------------------------===//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// This file is a part of MemorySanitizer.10//11// Helper functions for unpoisoning results of dladdr and dladdr1.12//===----------------------------------------------------------------------===//13 14#include "msan_dl.h"15 16#include <dlfcn.h>17#include <elf.h>18#include <link.h>19 20#include "msan_poisoning.h"21 22namespace __msan {23 24void UnpoisonDllAddrInfo(void *info) {25  Dl_info *ptr = (Dl_info *)(info);26  __msan_unpoison(ptr, sizeof(*ptr));27  if (ptr->dli_fname)28    __msan_unpoison(ptr->dli_fname, internal_strlen(ptr->dli_fname) + 1);29  if (ptr->dli_sname)30    __msan_unpoison(ptr->dli_sname, internal_strlen(ptr->dli_sname) + 1);31}32 33#if SANITIZER_GLIBC34void UnpoisonDllAddr1ExtraInfo(void **extra_info, int flags) {35  if (flags == RTLD_DL_SYMENT) {36    __msan_unpoison(extra_info, sizeof(void *));37 38    ElfW(Sym) *s = *((ElfW(Sym) **)(extra_info));39    __msan_unpoison(s, sizeof(ElfW(Sym)));40  } else if (flags == RTLD_DL_LINKMAP) {41    __msan_unpoison(extra_info, sizeof(void *));42 43    struct link_map *map = *((struct link_map **)(extra_info));44 45    // Walk forward46    for (auto *ptr = map; ptr; ptr = ptr->l_next) {47      __msan_unpoison(ptr, sizeof(struct link_map));48      if (ptr->l_name)49        __msan_unpoison(ptr->l_name, internal_strlen(ptr->l_name) + 1);50    }51 52    if (!map)53      return;54 55    // Walk backward56    for (auto *ptr = map->l_prev; ptr; ptr = ptr->l_prev) {57      __msan_unpoison(ptr, sizeof(struct link_map));58      if (ptr->l_name)59        __msan_unpoison(ptr->l_name, internal_strlen(ptr->l_name) + 1);60    }61  }62}63#endif64 65}  // namespace __msan66