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:
parent
7980465199
commit
cac506f664
1 changed files with 4 additions and 1 deletions
|
@ -58,6 +58,7 @@
|
|||
#include "journal.h"
|
||||
#include "misc.h"
|
||||
#include "nat.h"
|
||||
#include "optlist.h"
|
||||
#include "player.h"
|
||||
#include "proto.h"
|
||||
#include "prototypes.h"
|
||||
|
@ -333,7 +334,9 @@ player_output_some(void)
|
|||
{
|
||||
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)
|
||||
;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue