Commit 3e2ea6e9 authored by Ambroz Bizjak's avatar Ambroz Bizjak Committed by Elvis Angelaccio
Browse files

GSCreator: Fix hang due to calling exit() after fork()

Summary:
After fork(), exit() invokes atexit handlers, which can result in a lockup if an atexit handler uses thread synchronization facilities, since all but the current thread no longer exist. An example backtrace can be found in the linked bug report. Fix it by using _exit() instead of exit().

BUG: 404652
FIXED-IN: 20.03.80

Test Plan: I don't know the exact environment required to trigger this bug, but one precondition is to trigger generation of thumbnails via this code; maybe browsing folders with PDF files will do that. Once you see thumbnail.so processes staying around, you must have hit this bug. This patch should prevent this issue from occurring, and it did on my system.

Reviewers: #frameworks, elvisangelaccio

Reviewed By: elvisangelaccio

Subscribers: elvisangelaccio

Differential Revision: https://phabricator.kde.org/D26635
parent 317d80e1
......@@ -350,7 +350,7 @@ bool GSCreator::create(const QString &path, int width, int height, QImage &img)
dup2( dvipipe[1], STDOUT_FILENO);
execvp(dvipsargs[0], const_cast<char *const *>(dvipsargs));
exit(1);
_exit(1);
}
else if(pid_two != -1){
close(input[1]);
......@@ -361,7 +361,7 @@ bool GSCreator::create(const QString &path, int width, int height, QImage &img)
dup2( output[1], STDOUT_FILENO);
execvp(gsargs[0], const_cast<char *const *>(gsargs));
exit(1);
_exit(1);
}
else{
// fork() (2) failed, close these
......@@ -379,7 +379,7 @@ bool GSCreator::create(const QString &path, int width, int height, QImage &img)
dup2(output[1], STDOUT_FILENO);
execvp(gsargs[0], const_cast<char *const *>(gsargs));
exit(1);
_exit(1);
}
}
else if (pid != -1) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment