Fix pr_player() and upr_player() to obey max_idle

The output queue flush can block indefinitely.  Permits a client to
hog the thread indefinitely by not reading output.

Broken in commit 08b94556 (v4.3.20) "Reimplement max_idle without a
separate thread".  Until then, the idle thread aborted a stuck attempt
to flush output.

Denial of service seems possible.
This commit is contained in:
Markus Armbruster 2012-03-11 15:07:48 +01:00
parent 7980465199
commit cac506f664

View file

@ -58,6 +58,7 @@
#include "journal.h" #include "journal.h"
#include "misc.h" #include "misc.h"
#include "nat.h" #include "nat.h"
#include "optlist.h"
#include "player.h" #include "player.h"
#include "proto.h" #include "proto.h"
#include "prototypes.h" #include "prototypes.h"
@ -333,7 +334,9 @@ player_output_some(void)
{ {
time_t deadline; time_t deadline;
deadline = (time_t)(player->may_sleep == PLAYER_SLEEP_FREELY ? -1 : 0); deadline = player->curup + minutes(max_idle);
if (player->may_sleep != PLAYER_SLEEP_FREELY)
deadline = 0;
while (io_output_if_queue_long(player->iop, deadline) > 0) while (io_output_if_queue_long(player->iop, deadline) > 0)
; ;
} }