pgq.insert_event: Fix rare crash
authorMarko Kreen <markokr@gmail.com>
Tue, 15 Nov 2011 22:36:55 +0000 (00:36 +0200)
committerMarko Kreen <markokr@gmail.com>
Tue, 15 Nov 2011 22:53:40 +0000 (00:53 +0200)
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
[backport from 3.0]

sql/pgq/lowlevel/insert_event.c

index 7df42bf0dc6d111e3c2c3521a542a160de6ffa42..81bedbebaaec164e7a8618c88439bcbe2b79c599 100644 (file)
@@ -152,12 +152,17 @@ static void *load_insert_plan(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)
                         return entry->plan;
-                SPI_freeplan(entry->plan);
+                if (entry->plan)
+                        SPI_freeplan(entry->plan);
         }
         entry->cur_table = state->cur_table;
+        entry->plan = NULL;
+
+        /* this can fail, struct must be valid before */
         entry->plan = make_plan(state);
+
         return entry->plan;
 }