Skip to content

Commit fb17bc7

Browse files
[lldb][Linux] Fix checking of error values when attach fails (llvm#161673)
Relates to llvm#161510 Fixes 6db44e5 (it's not fixing it, it's just making the error not be an unhandled error) When we fail to attach to a process we see if we can add more information about why it happened: ``` if (status.GetError() == EPERM) { // Depending on the value of ptrace_scope, we can return a different // error that suggests how to fix it. return AddPtraceScopeNote(status.ToError()); } ``` ToError creates a new error value and leaves the one in `status` unchecked. `status`'s error is ok because it will be checked by Status' destructor. The problem happens in `AddPtraceScopeNote`. If we take certain return paths, this new error, or the one we get when trying to find the ptrace scope, may be unchecked on destruction when the function returns. To fix this, in AddPtraceScopeNote, consume any errors that we are not going to return. Anything returned will be checked by some caller. Reproducing this failure mode is difficult but it can be faked by calling AddPtraceScopeNote earlier. Which is what I did to prove the concept of the problem.
1 parent a81b6c6 commit fb17bc7

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,8 @@ static Status EnsureFDFlags(int fd, int flags) {
218218
static llvm::Error AddPtraceScopeNote(llvm::Error original_error) {
219219
Expected<int> ptrace_scope = GetPtraceScope();
220220
if (auto E = ptrace_scope.takeError()) {
221-
Log *log = GetLog(POSIXLog::Process);
222-
LLDB_LOG(log, "error reading value of ptrace_scope: {0}", E);
221+
LLDB_LOG_ERROR(GetLog(POSIXLog::Process), std::move(E),
222+
"error reading value of ptrace_scope: {0}");
223223

224224
// The original error is probably more interesting than not being able to
225225
// read or interpret ptrace_scope.
@@ -230,6 +230,7 @@ static llvm::Error AddPtraceScopeNote(llvm::Error original_error) {
230230
switch (*ptrace_scope) {
231231
case 1:
232232
case 2:
233+
llvm::consumeError(std::move(original_error));
233234
return llvm::createStringError(
234235
std::error_code(errno, std::generic_category()),
235236
"The current value of ptrace_scope is %d, which can cause ptrace to "
@@ -239,6 +240,7 @@ static llvm::Error AddPtraceScopeNote(llvm::Error original_error) {
239240
"https://www.kernel.org/doc/Documentation/security/Yama.txt.",
240241
*ptrace_scope);
241242
case 3:
243+
llvm::consumeError(std::move(original_error));
242244
return llvm::createStringError(
243245
std::error_code(errno, std::generic_category()),
244246
"The current value of ptrace_scope is 3, which will cause ptrace to "

0 commit comments

Comments
 (0)