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 "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)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue