safe_memory_reader.cpp 902 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include "safe_memory_reader.h"
  2. #ifdef _linux_
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #endif
  6. #include <library/cpp/yt/assert/assert.h>
  7. namespace NYT {
  8. ////////////////////////////////////////////////////////////////////////////////
  9. TSafeMemoryReader::TSafeMemoryReader()
  10. {
  11. #ifdef _linux_
  12. FD_ = ::open("/proc/self/mem", O_RDONLY);
  13. YT_VERIFY(FD_ >= 0);
  14. #endif
  15. }
  16. TSafeMemoryReader::~TSafeMemoryReader()
  17. {
  18. #ifdef _linux_
  19. ::close(FD_);
  20. #endif
  21. }
  22. bool TSafeMemoryReader::ReadRaw(const void* addr, void* ptr, size_t size)
  23. {
  24. #ifdef _linux_
  25. int ret;
  26. do {
  27. ret = ::pread64(FD_, ptr, size, reinterpret_cast<uintptr_t>(addr));
  28. } while (ret < 0 && errno == EINTR);
  29. return ret == static_cast<int>(size);
  30. #else
  31. Y_UNUSED(FD_, addr, ptr, size);
  32. return false;
  33. #endif
  34. }
  35. ////////////////////////////////////////////////////////////////////////////////
  36. } // namespace NYT