diff options
author | Marko Kreen | 2011-04-19 20:22:08 +0000 |
---|---|---|
committer | Marko Kreen | 2011-04-19 20:22:08 +0000 |
commit | 026f67b5861fa5844ef0e05ccea6d4d5356e57f5 (patch) | |
tree | bfd06369eb502c38119ae81f5a628840df23422a | |
parent | 366d52bcf84df1e2519403de6b169f7bfc36e296 (diff) |
pgq.insert_event: Fix rare crash
If hash_search(HASH_ENTER) succeeds, but make_plan() fails,
due to statement_timeout/deadlock, then HTAB entry will
contain invalid values which leads to crash on next call.
Fix it by always fully initializing struct before calling make_plan().
Debugged-by: Martin Pihlak
-rw-r--r-- | sql/pgq/lowlevel/insert_event.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sql/pgq/lowlevel/insert_event.c b/sql/pgq/lowlevel/insert_event.c index 7cb0154e..f63890d8 100644 --- a/sql/pgq/lowlevel/insert_event.c +++ b/sql/pgq/lowlevel/insert_event.c @@ -166,13 +166,17 @@ static void *load_insert_plan(Datum qname, struct QueueState *state) entry = hash_search(insert_cache, &queue_id, HASH_ENTER, &did_exist); if (did_exist) { - if (state->cur_table == entry->cur_table) + if (entry->plan && state->cur_table == entry->cur_table) goto valid_table; - SPI_freeplan(entry->plan); - } else { - entry->last_xid = 0; + if (entry->plan) + SPI_freeplan(entry->plan); } + entry->cur_table = state->cur_table; + entry->last_xid = 0; + entry->plan = NULL; + + /* this can fail, struct must be valid before */ entry->plan = make_plan(state); valid_table: |