Prepare for bind_rewrite_timestamp() returns NULL case. This could
authorTatsuo Ishii <ishii at sraoss.co.jp>
Thu, 12 Nov 2009 07:04:03 +0000 (07:04 +0000)
committerTatsuo Ishii <ishii at sraoss.co.jp>
Thu, 12 Nov 2009 07:04:03 +0000 (07:04 +0000)
happen if SELECT now() is called inside an aborted transaction.

Fix SimpleForwardToBackend free rewrite_msg too early.

pool_process_query.c

index 27a3a31426ac103220862de98951da9423e1db7d..3d6bce95ba68f878d664bdbc967b954d34a64b1e 100644 (file)
@@ -1948,8 +1948,12 @@ POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CO
                /* rewrite bind message */
                if (REPLICATION && portal && portal->num_tsparams > 0)
                {
-                       p = rewrite_msg = bind_rewrite_timestamp(backend, portal, p, &len);
-                       sendlen = htonl(len + 4);
+                       rewrite_msg = bind_rewrite_timestamp(backend, portal, p, &len);
+                       if (rewrite_msg != NULL)
+                       {
+                               p = rewrite_msg;
+                               sendlen = htonl(len + 4);
+                       }
                }
        }
 
@@ -1976,7 +1980,6 @@ POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CO
                        }
                }
        }
-       free(rewrite_msg);
 
        if (kind == 'B') /* Bind message */
        {
@@ -2004,6 +2007,7 @@ POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CO
                                free(portal->portal_name);
                        portal->portal_name = strdup(portal_name);
                }
+               free(rewrite_msg);
        }
 
        /* Close message with prepared statement name. */