1) If an asynchronous exception was thrown to the thread executing readProcess somewhere after createProcess was executed, the standard handles would not be closed anymore resulting in a "handle leak" so to speak.
This is fixed by catching exceptions in the IO processing code and closing the standard handles when an exception occurs. Additionally, I also terminate the process and wait for its termination.
2) If an asynchronous exception was thrown to the stdout/stderr-read-thread it did not execute the putMVar anymore resulting in a dead-lock when takeMVar was executed.
This is fixed by properly catching exception in the read-thread and propagating them to the parent thread which will then handle them as described above.