Fixed SIGSEGV using DBD-Pg.
authorYoshiyuki Asaba <y-asaba at pgfoundry.org>
Mon, 22 Jan 2007 11:36:51 +0000 (11:36 +0000)
committerYoshiyuki Asaba <y-asaba at pgfoundry.org>
Mon, 22 Jan 2007 11:36:51 +0000 (11:36 +0000)
Reported by Kenichi Sawada.

pool_process_query.c

index 8062b0e4f2941488bdb0876fe0cff1742f6d3840..056bb5e9b105f8ffb042ff07c58a4de904f72fca 100644 (file)
@@ -2620,7 +2620,6 @@ POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CO
        int len;
        int sendlen;
        char *p;
-       int name_len;
        char *name = NULL;
 
        if (pool_write(MASTER(backend), &kind, 1))
@@ -2710,40 +2709,35 @@ POOL_STATUS SimpleForwardToBackend(char kind, POOL_CONNECTION *frontend, POOL_CO
                        stmt = unnamed_statement;
                else
                {
-                       name = malloc(strlen(stmt_name) + 3);
+                       name = strdup(stmt_name);
                        if (name == NULL)
                        {
-                               pool_error("SimpleForwardToBackend: malloc failed: %s", strerror(errno));
+                               pool_error("SimpleForwardToBackend: strdup failed: %s", strerror(errno));
                                return POOL_END;
                        }
 
-                       sprintf(name, "\"%s\"", stmt_name);
                        stmt = lookup_prepared_statement_by_statement(&prepared_list, name);
                        free(name);
                }
 
-               if (stmt == NULL)
-                       free(name);
-               else if (*portal_name == '\0')
+               if (*portal_name == '\0')
                        unnamed_portal = stmt;
                else
                {
                        if (stmt->portal_name)
                                free(stmt->portal_name);
-                       stmt->portal_name = strdup(stmt->portal_name);
+                       stmt->portal_name = strdup(portal_name);
                }
 
        }
        else if (kind == 'C' && *p == 'S' && *(p + 1))
        {
-               name_len = strlen(p + 1) + 3;
-               name = malloc(name_len);
+               name = strdup(p+1);
                if (name == NULL)
                {
-                       pool_error("SimpleForwardToBackend: malloc failed: %s", strerror(errno));
+                       pool_error("SimpleForwardToBackend: strdup failed: %s", strerror(errno));
                        return POOL_END;
                }
-               sprintf(name, "\"%s\"", p + 1);
                pending_function = del_prepared_list;
                pending_prepared_stmt = malloc(sizeof(PreparedStatement));
                if (pending_prepared_stmt == NULL)