When we pull down the session, we do a kill() on all sub-processes. The problem is that we have done waitpid() on these earlier, so if they've died for other reasons then we could possibly send signals to another process. We might want to think about abstracting the process monitoring a bit so that we get all of it in one place and possibly also hide the differences between platforms.
This got fixed when we replaced xinit with our own code in ThinLinc 3.2.0 (bug 357).