mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2026-05-04 20:46:11 +02:00
BUG/MINOR: fd: Don't clear the update_mask in fd_insert.
Clearing the update_mask bit in fd_insert may lead to duplicate insertion of fd in fd_updt, that could lead to a write past the end of the array. Instead, make sure the update_mask bit is cleared by the pollers no matter what. This should be backported to 1.8. [wt: warning: 1.8 doesn't have the lockless fdcache changes and will require some careful changes in the pollers]
This commit is contained in:
parent
2500fc2c34
commit
8ef1a6b0d8
@ -445,7 +445,6 @@ static inline void fd_insert(int fd, void *owner, void (*iocb)(int fd), unsigned
|
||||
fdtab[fd].owner = owner;
|
||||
fdtab[fd].iocb = iocb;
|
||||
fdtab[fd].ev = 0;
|
||||
fdtab[fd].update_mask &= ~tid_bit;
|
||||
fdtab[fd].linger_risk = 0;
|
||||
fdtab[fd].cloned = 0;
|
||||
fdtab[fd].thread_mask = thread_mask;
|
||||
|
||||
@ -74,13 +74,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
|
||||
fd = fd_updt[updt_idx];
|
||||
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
if (!fdtab[fd].owner) {
|
||||
activity[tid].poll_drop++;
|
||||
continue;
|
||||
}
|
||||
|
||||
en = fdtab[fd].state;
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
|
||||
if (fdtab[fd].polled_mask & tid_bit) {
|
||||
if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) {
|
||||
|
||||
@ -47,13 +47,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
|
||||
fd = fd_updt[updt_idx];
|
||||
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
if (!fdtab[fd].owner) {
|
||||
activity[tid].poll_drop++;
|
||||
continue;
|
||||
}
|
||||
|
||||
en = fdtab[fd].state;
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
|
||||
if (!(fdtab[fd].thread_mask & tid_bit) || !(en & FD_EV_POLLED_RW)) {
|
||||
if (!(fdtab[fd].polled_mask & tid_bit)) {
|
||||
|
||||
@ -65,13 +65,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
|
||||
fd = fd_updt[updt_idx];
|
||||
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
if (!fdtab[fd].owner) {
|
||||
activity[tid].poll_drop++;
|
||||
continue;
|
||||
}
|
||||
|
||||
en = fdtab[fd].state;
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
|
||||
/* we have a single state for all threads, which is why we
|
||||
* don't check the tid_bit. First thread to see the update
|
||||
|
||||
@ -57,13 +57,13 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
||||
for (updt_idx = 0; updt_idx < fd_nbupdt; updt_idx++) {
|
||||
fd = fd_updt[updt_idx];
|
||||
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
if (!fdtab[fd].owner) {
|
||||
activity[tid].poll_drop++;
|
||||
continue;
|
||||
}
|
||||
|
||||
en = fdtab[fd].state;
|
||||
HA_ATOMIC_AND(&fdtab[fd].update_mask, ~tid_bit);
|
||||
|
||||
/* we have a single state for all threads, which is why we
|
||||
* don't check the tid_bit. First thread to see the update
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user