Comments (3)
Our original assumption was that if the container has exited, the conversion process should immediately exit as well, maybe with some small delay for some cleanups. So, we originally attributed this to a race condition.
We have noticed this happening in case of successful conversions, where indeed it's due to a race condition. If we wait a tiny bit before checking the conversion process' status, we will see that it has stopped.
Things are very different in the case of failed conversions due to exceptions in the host. In that case, what happens is:
- The process in the container calculates the number of pages and width/height of each page.
- The host process receives these calculations from
stdout
, and decides that a unit is out of bounds. In the case of thesample_bad_max_width.pdf
document, it's the width. - The host process raises an exception, and from its perspective, the conversion is over. At no point have we terminated the process running in the container!
- In the meantime, the container will continue working on the document, and write pixels to
stdout
. - At some point, the container will exit or we will kill it with
docker kill ...
. This doesn't matter much, but what matters here is that Docker is very careful with the container's stdout. It does not want to lose it, and thus thedocker run ...
process will block until we have read every byte from the container. - Deadlock! Our termination logic does not read data from standard streams, nor does it terminate the
docker
process, so both process will remain stuck.- Thankfully, we force kill the conversion process after 15 seconds, so we do end up making progress.
from dangerzone.
Now that we know what's going on behind the scenes, let's answer the above questions:
- In some error cases, our termination logic reports that the container does not exist, whereas the conversion process (docker run ...) still exists.
That's because the conversion process may still linger, until the parent has read all the data that the container has written.
- Specifically for the failed conversion case, when that happens in the host, the conversion process seems to be stuck indefinitely, and we have to kill it.
The conversion process remains stuck, because the container has written lots of data to the stdout, and the host process has not read them.
from dangerzone.
How can we improve here? We can do the following:
- Unconditionally kill the container once the conversion is over, and don't check if
kill
succeeded, since it's racy.- Log a warning if the container still exists after
kill
, since this is not racy, and not expected.
- Log a warning if the container still exists after
- Gracefully terminate the conversion process after we terminate the container, since we at that point, we don't want to read its data.
from dangerzone.
Related Issues (20)
- Qubes isolation provider contains Python >= 3.11 methods HOT 2
- HelloGitHub Badge
- QA and Release version 0.7.0 HOT 1
- Handle seccomp policies that don't include ptrace(2) HOT 2
- Use python 3.12 for Windows and macOS builds
- Install PyMuPDF via the prebuilt Python wheels for musl
- The `docker kill` command may hang during container termination
- [Feature Request] Kali Linux support is it possible to support it for the apt 3rd party repository ? HOT 2
- Should we trust CA certificates?
- Dangerzone not compatible with colima? HOT 6
- Scope UX improvements
- Dangerzone 0.7.0 on Linux Mint 21.3 does not work HOT 10
- Issue when converting any documents: ‘’Unspecified error‘’ HOT 13
- Confusion on installing dangerzone on whonix-workstation in virtualbox HOT 3
- Dangerzone help message printed when we open the Dangerzone app via the CLI in macOS
- Include Apple Silicon container image in our release assets
- Request: Support for STL files HOT 3
- Make PyMuPDF always log to stderr
- Handle cases when LibreOffice hangs HOT 2
- SELinux in enforcing mode breaks nested gVisor container HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dangerzone.