summaryrefslogtreecommitdiff
path: root/file.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2018-01-24 21:02:46 +0100
committerJo-Philipp Wich <jo@mein.io>2018-01-25 10:55:59 +0100
commitccd9717ba5d501b45fda957f0ea41c4660ef414c (patch)
tree60c05d4128e70d95aad9459c53a8c1ca89492746 /file.c
parentdb86175c2d90ba640b158e8eebd7409227544c4b (diff)
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>
Diffstat (limited to 'file.c')
0 files changed, 0 insertions, 0 deletions