proc: avoid stdio deadlocks
authorJo-Philipp Wich <jo@mein.io>
Wed, 24 Jan 2018 20:02:46 +0000 (21:02 +0100)
committerJo-Philipp Wich <jo@mein.io>
Thu, 25 Jan 2018 09:55:59 +0000 (10:55 +0100)
commitccd9717ba5d501b45fda957f0ea41c4660ef414c
tree60c05d4128e70d95aad9459c53a8c1ca89492746
parentdb86175c2d90ba640b158e8eebd7409227544c4b
proc: avoid stdio deadlocks

When a request handler accepting post data is too slow in consuming stdin,
uhttpd might deadlock with the master process stuck in a blocking write()
to the child and the child stuck with a blocking write() to the master.

Avoid this issue by putting the master side write end of the child pipe
into nonblocking mode right away and by raising the data_blocked flag
when attempts to write to the child yield EAGAIN.

Setting the flag ensures that client_poll_post_data() does not immediately
trigger a write attempt again, which effectively yields the master write
cycle so that the relay ustream has a chance to consume output of the
client process, thus solving the deadlock.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
proc.c