mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Fix attach-related race condition in shm_mq_send_bytes.
Spotted by Antonin Houska.
This commit is contained in:
parent
37163e22bd
commit
caf89b31aa
@ -777,16 +777,12 @@ shm_mq_send_bytes(shm_mq_handle *mqh, Size nbytes, const void *data,
|
|||||||
return SHM_MQ_DETACHED;
|
return SHM_MQ_DETACHED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (available == 0)
|
if (available == 0 && !mqh->mqh_counterparty_attached)
|
||||||
{
|
{
|
||||||
shm_mq_result res;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The queue is full, so if the receiver isn't yet known to be
|
* The queue is full, so if the receiver isn't yet known to be
|
||||||
* attached, we must wait for that to happen.
|
* attached, we must wait for that to happen.
|
||||||
*/
|
*/
|
||||||
if (!mqh->mqh_counterparty_attached)
|
|
||||||
{
|
|
||||||
if (nowait)
|
if (nowait)
|
||||||
{
|
{
|
||||||
if (shm_mq_get_receiver(mq) == NULL)
|
if (shm_mq_get_receiver(mq) == NULL)
|
||||||
@ -803,7 +799,15 @@ shm_mq_send_bytes(shm_mq_handle *mqh, Size nbytes, const void *data,
|
|||||||
return SHM_MQ_DETACHED;
|
return SHM_MQ_DETACHED;
|
||||||
}
|
}
|
||||||
mqh->mqh_counterparty_attached = true;
|
mqh->mqh_counterparty_attached = true;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The receiver may have read some data after attaching, so we
|
||||||
|
* must not wait without rechecking the queue state.
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
else if (available == 0)
|
||||||
|
{
|
||||||
|
shm_mq_result res;
|
||||||
|
|
||||||
/* Let the receiver know that we need them to read some data. */
|
/* Let the receiver know that we need them to read some data. */
|
||||||
res = shm_mq_notify_receiver(mq);
|
res = shm_mq_notify_receiver(mq);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user