Re: Recursive ReceiveSharedInvalidMessages not safe

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Recursive ReceiveSharedInvalidMessages not safe
Дата
Msg-id 11846.1399313758@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Recursive ReceiveSharedInvalidMessages not safe  (Andres Freund <andres@2ndquadrant.com>)
Ответы Re: Recursive ReceiveSharedInvalidMessages not safe
Список pgsql-hackers
Andres Freund <andres@2ndquadrant.com> writes:
> While investigating an issue pointed out by valgrind around undefined
> bytes in inval.c SHAREDINVALSMGR_ID processing I noticed that there's a
> bug in ReceiveSharedInvalidMessages(). It tries to be safe against
> recursion but it's not:
> When it recurses into ReceiveSharedInvalidMessages() from it's main loop
> from inside the inval callback while nextmsg = nummsgs it'll overwrite
> the 'messages' array with new contents. But at this point the old
> content of one entry in the messages array is still passed to
> the LocalExecuteInvalidationMessage() that caused the recursion.

Hm, yeah, so if the called inval function continues to use the message
contents after doing something that could result in a recursive call,
it might be looking at trashed data.

> It looks to me like this is broken since at least fad153ec. I think the
> fix is just to make the current 'SharedInvalidationMessage *msg' not be
> pointers but a local copiy of the to-be-processed entry.

Yeah, that should do it.  I think I'd been trying to avoid copying
messages more times than necessary, but evidently I optimized away
one copy step too many :-(
        regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Andres Freund
Дата:
Сообщение: Re: avoiding tuple copying in btree index builds
Следующее
От: Josh Berkus
Дата:
Сообщение: Re: TABLESPACE and directory for Foreign tables?