buildinfo.cpp
utils/dynlibs_unix.cpp
utils/dynlibs_win32.cpp
+ utils/err_utils.cpp
utils/filesystem.cpp
utils/filesystem_unix.cpp
utils/filesystem_win32.cpp
corRVA = VAL32(ntHeaders64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_COMHEADER].VirtualAddress);\r
}\r
\r
- constexpr DWORD DWORD_MAX = 4294967295;\r
- DWORD pos = VAL32(dosHeader.e_lfanew);\r
- if (pos > DWORD_MAX - sizeof(ntHeaders.Signature) - sizeof(ntHeaders.FileHeader) - VAL16(ntHeaders.FileHeader.SizeOfOptionalHeader))\r
+ constexpr LONG lLONG_MAX = 2147483647;\r
+ LONG pos = VAL32(dosHeader.e_lfanew);\r
+ if (pos < 0 || size_t(lLONG_MAX - pos) < sizeof(ntHeaders.Signature) + sizeof(ntHeaders.FileHeader) + VAL16(ntHeaders.FileHeader.SizeOfOptionalHeader))\r
return mdMethodDefNil;\r
pos += sizeof(ntHeaders.Signature) + sizeof(ntHeaders.FileHeader) + VAL16(ntHeaders.FileHeader.SizeOfOptionalHeader);\r
\r
corRVA < VAL32(sectionHeader.VirtualAddress) + VAL32(sectionHeader.SizeOfRawData))\r
{\r
ULONG offset = (corRVA - VAL32(sectionHeader.VirtualAddress)) + VAL32(sectionHeader.PointerToRawData);\r
+ if (offset > (ULONG)lLONG_MAX)\r
+ return mdMethodDefNil;\r
\r
IMAGE_COR20_HEADER corHeader;\r
if (fseek(pFile, offset, SEEK_SET) != 0) return mdMethodDefNil;\r
if (errno != 0)\r
{\r
int err_code = errno;\r
- LOGE("Ptrace peekdata error: %s", strerror(err_code));\r
+ char buf[1024];\r
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(err_code, buf, sizeof(buf)));\r
return err_code;\r
}\r
dataWithBrk = EncodeBrkOpcode(savedData, isThumbCode);\r
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)brkAddr, (void*)dataWithBrk) == -1)\r
{\r
int err_code = errno;\r
- LOGE("Ptrace pokedata error: %s", strerror(err_code));\r
+ char buf[1024];\r
+ LOGE("Ptrace pokedata error: %s", ErrGetStr(err_code, buf, sizeof(buf)));\r
return err_code;\r
}\r
\r
if (errno != 0)\r
{\r
int err_code = errno;\r
- LOGE("Ptrace peekdata error: %s", strerror(err_code));\r
+ char buf[1024];\r
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(err_code, buf, sizeof(buf)));\r
return err_code;\r
}\r
word_t restoredData = RestoredOpcode(brkData, find->second.m_savedData);\r
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)find->first, (void*)restoredData) == -1)\r
{\r
int err_code = errno;\r
- LOGW("Ptrace pokedata error: %s\n", strerror(err_code));\r
+ char buf[1024];\r
+ LOGW("Ptrace pokedata error: %s\n", ErrGetStr(err_code, buf, sizeof(buf)));\r
return err_code;\r
}\r
m_currentBreakpointsInMemory.erase(find);\r
word_t brkData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)entry.first, nullptr);\r
if (errno != 0)\r
{\r
- LOGE("Ptrace peekdata error: %s", strerror(errno));\r
+ char buf[1024];\r
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));\r
continue;\r
}\r
word_t restoredData = RestoredOpcode(brkData, entry.second.m_savedData);\r
\r
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)entry.first, (void*)restoredData) == -1)\r
{\r
- LOGE("Ptrace pokedata error: %s\n", strerror(errno));\r
+ char buf[1024];\r
+ LOGE("Ptrace pokedata error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));\r
}\r
}\r
}\r
iov.iov_len = sizeof(user_regs_struct);\r
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)\r
{\r
- LOGE("Ptrace getregset error: %s\n", strerror(errno));\r
+ char buf[1024];\r
+ LOGE("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));\r
std::abort(); // Fatal error, we already logged all data about this error.\r
}\r
\r
\r
if (async_ptrace(PTRACE_SETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)\r
{\r
- LOGE("Ptrace setregset error: %s\n", strerror(errno));\r
+ char buf[1024];\r
+ LOGE("Ptrace setregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));\r
std::abort(); // Fatal error, we already logged all data about this error.\r
}\r
\r
iov.iov_len = sizeof(user_regs_struct);
if (InteropDebugging::async_ptrace(PTRACE_GETREGSET, threadId, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
}
else
{
word_t wData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)addr, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
word_t nextPCData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)entry.addr, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)entry.addr, (void*)dataWithBrk) == -1)
{
- LOGE("Ptrace pokedata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace pokedata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGE("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (async_ptrace(PTRACE_SETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGE("Ptrace setregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace setregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
}
word_t brkData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)addr, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
// restore data
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)addr, (void*)restoreData) == -1)
{
- LOGE("Ptrace pokedata error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace pokedata error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
// setup bp again
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)addr, (void*)brkData) == -1)
{
- LOGE("Ptrace pokedata error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace pokedata error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (async_ptrace(PTRACE_CONT, pid, nullptr, nullptr) == -1)
{
- LOGW("Ptrace cont error: %s", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace cont error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
else
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
RemoveSoftwareSingleStepBreakpoints(pid, swSingleStepBreakpoints);
return false;
}
else
#endif // DEBUGGER_UNIX_ARM
{
- LOGE("Ptrace singlestep error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace singlestep error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
}
siginfo_t ptrace_info;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &ptrace_info) == -1)
{
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
#if DEBUGGER_UNIX_ARM || DEBUGGER_UNIX_RISCV64
if (!m_HWSingleStepSupported)
RemoveSoftwareSingleStepBreakpoints(pid, swSingleStepBreakpoints);
siginfo_t ptrace_info;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &ptrace_info) == -1)
{
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
siginfo_t siginfo;
bool sendByItself = false;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &siginfo) == -1)
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
sendByItself = (siginfo.si_pid == m_TGID);
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, entry.first, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
continue; // Will hope, this thread didn't stopped at breakpoint.
}
for (const auto &tid : m_TIDs)
{
if (async_ptrace(PTRACE_DETACH, tid.first, nullptr, (void*)((word_t)tid.second.stop_signal)) == -1)
- LOGW("Ptrace detach error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace detach error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
}
m_TIDs.clear();
if (tid.second.stat == thread_stat_e::running &&
async_ptrace(PTRACE_INTERRUPT, tid.first, nullptr, nullptr) == -1)
{
- LOGW("Ptrace interrupt error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace interrupt error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
}
}
}
if (!dir)
{
error_n = errno;
- LOGE("opendir: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("opendir: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return E_FAIL;
}
if (async_ptrace(PTRACE_SEIZE, tid, nullptr, (void*)options) == -1)
{
error_n = errno;
- LOGE("Ptrace seize error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace seize error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
closedir(dir);
return E_FAIL;
}
if (async_ptrace(PTRACE_INTERRUPT, tid, nullptr, nullptr) == -1)
{
- LOGE("Ptrace interrupt error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace interrupt error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
closedir(dir);
exit(EXIT_FAILURE); // Fatal error, seized but failed on interrupt.
}
if (errno)
{
error_n = errno;
- LOGE("readdir: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("readdir: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
closedir(dir);
return E_FAIL;
}
if (closedir(dir))
{
- LOGW("closedir: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("closedir: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
}
return S_OK;
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
memset(&siginfo, 0, sizeof(siginfo_t));
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &siginfo) == -1)
{
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (siginfo.si_pid != TGID)
siginfo_t ptrace_info;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &ptrace_info) == -1)
{
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
}
else
{
}
if (async_ptrace(PTRACE_DETACH, pid, nullptr, nullptr) == -1)
- LOGW("Ptrace detach at exec error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace detach at exec error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
m_TIDs.erase(pid);
}
siginfo_t ptrace_info;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &ptrace_info) == -1)
{
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
}
else
{
iov.iov_base = ®s;
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
std::uintptr_t brkAddr = GetBrkAddrByPC(regs);
continue;
if (async_ptrace(PTRACE_CONT, pid, nullptr, (void*)((word_t)m_TIDs[pid].stop_signal)) == -1)
- LOGW("Ptrace cont error: %s", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace cont error: %s", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
{
m_TIDs[pid].stat = thread_stat_e::running;
continue;
if (async_ptrace(PTRACE_INTERRUPT, managedThread.first, nullptr, nullptr) == -1)
- LOGW("Ptrace interrupt error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace interrupt error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
stoppedManagedTreads.emplace_back(managedThread.first);
}
if (pid == -1)
{
- LOGE("Waitpid error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Waitpid error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
break;
}
siginfo_t siginfo;
bool sendByItself = false;
if (async_ptrace(PTRACE_GETSIGINFO, pid, nullptr, &siginfo) == -1)
- LOGW("Ptrace getsiginfo error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace getsiginfo error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
sendByItself = (siginfo.si_pid == m_TGID);
injectTIDs.emplace(std::make_pair(pid, injectSignalResetCountdown));
if (async_ptrace(PTRACE_CONT, pid, nullptr, (void*)((word_t)stop_signal)) == -1)
- LOGW("Ptrace cont error: %s", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace cont error: %s", ErrGetStr(errno, buf, sizeof(buf)));
+ }
// No need change `m_TIDs[pid].stat` and `m_TIDs[pid].stop_signal` here.
continue;
}
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, entry.first, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
continue; // Will hope, this thread didn't stopped at breakpoint.
}
if (tid->second.stat == thread_stat_e::running)
{
if (async_ptrace(PTRACE_INTERRUPT, pid, nullptr, nullptr) == -1)
- LOGW("Ptrace interrupt error: %s\n", strerror(errno));
+ {
+ char buf[1024];
+ LOGW("Ptrace interrupt error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
+ }
else
{
WaitThreadStop(pid);
iovec remote_iov {(void*)addr, sizeof(T)};
if (process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0) == -1)
{
- LOGE("process_vm_readv: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("process_vm_readv: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
addr = 0;
return t;
}
if (readlink(exeFileName, tmpName, PATH_MAX) == -1)
{
- LOGE("readlink error for %s file: %s\n", exeFileName, strerror(errno));
+ char buf[1024];
+ LOGE("readlink error for %s file: %s\n", exeFileName, ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
FILE *mapsFile = fopen(mapFileName, "r");
if (mapsFile == nullptr)
{
- LOGE("fopen error for %s file: %s\n", mapFileName, strerror(errno));
+ char buf[1024];
+ LOGE("fopen error for %s file: %s\n", mapFileName, ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
int fd = open(elfFileName.c_str(), O_RDONLY);
if (fd == -1)
{
- LOGE("open error for %s file: %s\n", elfFileName.c_str(), strerror(errno));
+ char buf[1024];
+ LOGE("open error for %s file: %s\n", elfFileName.c_str(), ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
iov.iov_len = sizeof(user_regs_struct);
if (async_ptrace(PTRACE_GETREGSET, pid, (void*)NT_PRSTATUS, &iov) == -1)
{
- LOGW("Ptrace getregset error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGW("Ptrace getregset error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
word_t currentPCData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)regs.pc, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
word_t nextPCData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)nextPC, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)nextPC, (void*)dataWithBrk) == -1)
{
- LOGE("Ptrace pokedata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace pokedata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
word_t brkData = async_ptrace(PTRACE_PEEKDATA, pid, (void*)entry.bpAddr, nullptr);
if (errno != 0)
{
- LOGE("Ptrace peekdata error: %s", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace peekdata error: %s", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
if (async_ptrace(PTRACE_POKEDATA, pid, (void*)entry.bpAddr, (void*)entry.restoreData) == -1)
{
- LOGE("Ptrace pokedata error: %s\n", strerror(errno));
+ char buf[1024];
+ LOGE("Ptrace pokedata error: %s\n", ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
}
if (m_debugger.m_interopDebugging &&
FAILED(m_debugger.m_sharedInteropDebugger->Init((pid_t)m_debugger.m_processId, m_sharedCallbacksQueue, attach, NotifyLastThreadExited, error_n)))
{
- LOGE("Interop debugging disabled due to initialization fail: %s", strerror(error_n));
+ char buf[1024];
+ LOGE("Interop debugging disabled due to initialization fail: %s", ErrGetStr(error_n, buf, sizeof(buf)));
m_debugger.pProtocol->EmitInteropDebuggingErrorEvent(error_n);
m_debugger.m_interopDebugging = false;
}
remainder = 0;
} else {
divident[i] = Lo_32(partial_dividend / divisor);
- remainder = Lo_32(partial_dividend - (divident[i] * divisor));
+ remainder = Lo_32(partial_dividend - ((uint64_t)divident[i] * divisor));
}
}
}
int fd = open(file.c_str(), O_RDONLY);
if (fd == -1)
{
- LOGI("Load elf failed at file open %s: %s\n", file.c_str(), strerror(errno));
+ char buf[1024];
+ LOGI("Load elf failed at file open %s: %s\n", file.c_str(), ErrGetStr(errno, buf, sizeof(buf)));
return false;
}
};
std::unordered_map<unsigned /*source fullPathIndex*/, std::vector<line_update_t>> lineUpdatesData;
+ // 0xfeefee is a magic number for "#line hidden" directive.
+ // https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-line
+ // https://docs.microsoft.com/en-us/archive/blogs/jmstall/line-hidden-and-0xfeefee-sequence-points
+ if (sourcesCount >= 0xfeefee)
+ return E_FAIL;
+
for (uint32_t i = 0; i < sourcesCount; i++)
{
uint32_t stringSize = 0;
{
size_t operator()(const method_data_t &p) const
{
- return p.methodDef + (uint32_t)p.startLine * 100 + (uint32_t)p.endLine * 1000;
+ return (size_t)p.methodDef + (size_t)p.startLine * 100 + (size_t)p.endLine * 1000;
}
};
{
LogFuncEntry();
- printf("Interop debugging disabled due to initialization fail: %s\n", strerror(error_n));
+ char buf[1024];
+ printf("Interop debugging disabled due to initialization fail: %s\n", ErrGetStr(error_n, buf, sizeof(buf)));
}
// This function implements Debugger interface and called from ManagedDebugger,
{
output = args[0] + ": ";
char buf[1024];
-#if defined(_MSC_VER)
- if (strerror_s(buf, sizeof(buf), errno) == 0)
- output += buf;
- else
- output += "Could not translate errno to a string";
-#else
- output += strerror_r(errno, buf, sizeof(buf));
-#endif
+ output += ErrGetStr(errno, buf, sizeof(buf));
return E_FAIL;
}
{
output = filename + ": ";
char buf[1024];
-#if defined(_MSC_VER)
- if (strerror_s(buf, sizeof(buf), errno) == 0)
- output += buf;
- else
- output += "Could not translate errno to a string";
-#else
- output += strerror_r(errno, buf, sizeof(buf));
-#endif
+ output += ErrGetStr(errno, buf, sizeof(buf));
result = E_FAIL;
return false;
}
deftest(iosystem
iosystem_test.cpp
+ ${PROJECT_SOURCE_DIR}/src/utils/err_utils.cpp
${PROJECT_SOURCE_DIR}/src/utils/iosystem_win32.cpp
${PROJECT_SOURCE_DIR}/src/utils/iosystem_unix.cpp
)
deftest(streams
streams_test.cpp
+ ${PROJECT_SOURCE_DIR}/src/utils/err_utils.cpp
${PROJECT_SOURCE_DIR}/src/utils/streams.cpp
${PROJECT_SOURCE_DIR}/src/utils/iosystem_win32.cpp
${PROJECT_SOURCE_DIR}/src/utils/iosystem_unix.cpp
deftest(ioredirect
ioredirect_test.cpp
+ ${PROJECT_SOURCE_DIR}/src/utils/err_utils.cpp
${PROJECT_SOURCE_DIR}/src/utils/ioredirect.cpp
${PROJECT_SOURCE_DIR}/src/utils/streams.cpp
${PROJECT_SOURCE_DIR}/src/utils/iosystem_win32.cpp
--- /dev/null
+// Copyright (C) 2024 Samsung Electronics Co., Ltd.
+// See the LICENSE file in the project root for more information.
+
+#include <stddef.h>
+#include <string.h>
+
+// Same as strerror_r(3) for GNU-specific strerror_r() but for all platforms (Linux, not GNU Linux (musl), Windows, Mac):
+// The GNU-specific strerror_r() returns a pointer to a string containing the error message.
+// This may be either a pointer to a string that the function stores in buf, or a pointer
+// to some (immutable) static string (in which case buf is unused).
+const char *ErrGetStr(int err_code, char buf[], size_t buf_size)
+{
+#ifdef WIN32
+ static const char errStr[] = "Unknown error";
+ bool haveErrorStr = strerror_s(buf, buf_size, err_code) == 0;
+ return haveErrorStr ? buf : errStr;
+#else
+
+#ifdef _GNU_SOURCE
+ return strerror_r(err_code, buf, buf_size);
+#else
+ static const char errStr[] = "Unknown error";
+ bool haveErrorStr = strerror_r(err_code, buf, buf_size) == 0;
+ return haveErrorStr ? buf : errStr;
+#endif //_GNU_SOURCE
+
+#endif //WIN32
+}
#include <netinet/in.h>
#include <stdexcept>
#include <algorithm>
+#include "utils/logger.h"
#include "iosystem_unix.h"
return {Class::IOResult::Pending, 0};
// TODO make exception class
+ char buf[1024];
char msg[256];
- snprintf(msg, sizeof(msg), "select: %s", strerror(errno));
+ snprintf(msg, sizeof(msg), "select: %s", ErrGetStr(errno, buf, sizeof(buf)));
throw std::runtime_error(msg);
}
if (errno == EAGAIN)
return {Class::IOResult::Pending, 0};
+ char buf[1024];
char msg[256];
- snprintf(msg, sizeof(msg), "select: %s", strerror(errno));
+ snprintf(msg, sizeof(msg), "select: %s", ErrGetStr(errno, buf, sizeof(buf)));
throw std::runtime_error(msg);
}
if (result < 0)
{
+ char buf[1024];
char msg[256];
- snprintf(msg, sizeof(msg), "select: %s", strerror(errno));
+ snprintf(msg, sizeof(msg), "select: %s", ErrGetStr(errno, buf, sizeof(buf)));
throw std::runtime_error(msg);
}
m_orig_fd[n] = ::dup(oldfd[n]);
if (m_orig_fd[n] == -1)
{
+ char buf[1024];
char msg[256];
- snprintf(msg, sizeof(msg), "dup(%d): %s", oldfd[n], strerror(errno));
+ snprintf(msg, sizeof(msg), "dup(%d): %s", oldfd[n], ErrGetStr(errno, buf, sizeof(buf)));
throw std::runtime_error(msg);
}
if (::dup2(newfd[n], oldfd[n]) == -1)
{
+ char buf[1024];
char msg[256];
- snprintf(msg, sizeof(msg), "dup2(%d, %d): %s", newfd[n], oldfd[n], strerror(errno));
+ snprintf(msg, sizeof(msg), "dup2(%d, %d): %s", newfd[n], oldfd[n], ErrGetStr(errno, buf, sizeof(buf)));
throw std::runtime_error(msg);
}
}
#include <stddef.h>
#include <stdarg.h>
+#include <string.h>
#ifdef _MSC_VER
#include <stdio.h>
#define LOGE(fmt, ...) LOG_(DLOG_ERROR, LOG_TAG, fmt, ##__VA_ARGS__)
#define LOGF(fmt, ...) LOG_(DLOG_FATAL, LOG_TAG, fmt, ##__VA_ARGS__)
+extern const char *ErrGetStr(int err_code, char buf[], size_t buf_size);
+
// This macro allows to specify priority and a tag.
// The macro definition is similar to original from Tizen's dlog.h
#define LOG(priority, tag, format, ...) LOG_(D##priority, tag, format, ##__VA_ARGS__)