Chainfire/libsuperuser — pull request #8 by cernekee (2013-12-08 00:22:56+00:00)
Title: Missing callbacks if shell dies in Interactive mode

libsuperuser is currently able to handle failures in several different stages:

If the shell cannot be started at all (e.g. missing "su" binary), Runtime.exec() should throw an exception, causing our open() method to return failure.

If the shell dies while a command is executing, and the watchdog timer is enabled, the onCommandResult() callback will get invoked so that the caller can handle the error.

If the device operator denies a Superuser request, this typically falls under case #2 as the "su" executable will stay alive for a couple of seconds until the operator clicks "deny."

But if the shell dies when there is no active command, any queued commands will get stuck in limbo and the caller will never receive a status indication. This will probably cause the app to freeze until the operator kills it, resulting in a subpar user experience.

The easiest way to reproduce the problem is to try running libsuperuser_example in interactive mode on the SDK emulator (which has a trivial "su" implementation that instantly denies root access to all apps). It will hang at "Requesting root privilege" forever.

So, we'll add an extra loop to send the bad news to the calling app if libsuperuser isn't able to execute the requested commands.