Can you try CVS HEAD?

After 3.1 released, I have committed some fixes regarding memory handling.
For your convenience I have attached patches.
--
Tatsuo Ishii
SRA OSS, Inc. Japan
English: http://www.sraoss.co.jp/index_en.php
Japanese: http://www.sraoss.co.jp

> Hallo,
> 
> we have a Java application that is executing a larger sequence of SQL 
> operations including table manipulations and content modifications within one 
> connection. When we are running these operations through pgpool-II, the 
> pgpool child process handling it always dies with a segmentation fault. But 
> it's not always the same SQL Statement that is causing the segfault.
> 
> Our setup is as follows:
> - pgpool-II-3.1 on a Linux-x86_64 server. We also encountered the 
> segmentation fault with pgpool-II-3.0.4 before trying out version 3.1.
> - the pgpool configuration is reduced to a minimum, that is the connection 
> cache, the master slave and the load balance mode are off. The replication 
> mode is enabled but only one backend is defined.
> - PostgreSQL server version is 9.0.4
> - the Java application uses the postgreSQL JDBC driver in version 9.0.801
> 
> Do you have an idea what might be causing this behavior?
> 
> For some additional details I attached a backtrace. I can also provide the 
> debug messages of the child process, if you want to have look at them.
> 
> Thanks in advance.
> 
> Ronny
? .deps
? .libs
? Makefile
? autom4te.cache
? config.h
? config.log
? config.status
? libtool
? m4
? pg_md5
? pgpool
? pgpool.8
? pool_hashfn.c
? pool_hashfunc.c
? stamp-h1
? test.c
? parser/.deps
? parser/Makefile
? pcp/.deps
? pcp/.libs
? pcp/Makefile
? pcp/libpcp.la
? pcp/md5.lo
? pcp/pcp.lo
? pcp/pcp_attach_node
? pcp/pcp_detach_node
? pcp/pcp_error.lo
? pcp/pcp_node_count
? pcp/pcp_node_info
? pcp/pcp_pool_status
? pcp/pcp_proc_count
? pcp/pcp_proc_info
? pcp/pcp_promote_node
? pcp/pcp_recovery_node
? pcp/pcp_stop_pgpool
? pcp/pcp_stream.lo
? pcp/pcp_systemdb_info
? sql/pgpool-regclass/pgpool-regclass.sql
? sql/pgpool-walrecrunning/pgpool-walrecrunning.sql
Index: Makefile.am
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/Makefile.am,v
retrieving revision 1.60
diff -c -r1.60 Makefile.am
*** Makefile.am	11 Sep 2011 12:45:43 -0000	1.60
--- Makefile.am	13 Oct 2011 06:00:14 -0000
***************
*** 31,37 ****
  	pool_error.c \
  	pool_signal.h pool_signal.c \
  	pool_passwd.c pool_passwd.h \
! 	pool_globals.c
  
  DEFS = @DEFS@ \
  	-DDEFAULT_CONFIGDIR=\"$(sysconfdir)\"
--- 31,37 ----
  	pool_error.c \
  	pool_signal.h pool_signal.c \
  	pool_passwd.c pool_passwd.h \
! 	pool_globals.c strlcpy.c
  
  DEFS = @DEFS@ \
  	-DDEFAULT_CONFIGDIR=\"$(sysconfdir)\"
Index: Makefile.in
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/Makefile.in,v
retrieving revision 1.64
diff -c -r1.64 Makefile.in
*** Makefile.in	11 Sep 2011 12:45:43 -0000	1.64
--- Makefile.in	13 Oct 2011 06:00:15 -0000
***************
*** 61,67 ****
  am_pg_md5_OBJECTS = pg_md5.$(OBJEXT) md5.$(OBJEXT) \
  	pool_config_md5.$(OBJEXT) pool_error.$(OBJEXT) \
  	pool_signal.$(OBJEXT) pool_passwd.$(OBJEXT) \
! 	pool_globals.$(OBJEXT)
  pg_md5_OBJECTS = $(am_pg_md5_OBJECTS)
  pg_md5_LDADD = $(LDADD)
  am_pgpool_OBJECTS = main.$(OBJEXT) child.$(OBJEXT) pool_auth.$(OBJEXT) \
--- 61,67 ----
  am_pg_md5_OBJECTS = pg_md5.$(OBJEXT) md5.$(OBJEXT) \
  	pool_config_md5.$(OBJEXT) pool_error.$(OBJEXT) \
  	pool_signal.$(OBJEXT) pool_passwd.$(OBJEXT) \
! 	pool_globals.$(OBJEXT) strlcpy.$(OBJEXT)
  pg_md5_OBJECTS = $(am_pg_md5_OBJECTS)
  pg_md5_LDADD = $(LDADD)
  am_pgpool_OBJECTS = main.$(OBJEXT) child.$(OBJEXT) pool_auth.$(OBJEXT) \
***************
*** 339,345 ****
  	pool_error.c \
  	pool_signal.h pool_signal.c \
  	pool_passwd.c pool_passwd.h \
! 	pool_globals.c
  
  sysconf_DATA = pgpool.conf.sample pcp.conf.sample pool_hba.conf.sample \
  				pgpool.conf.sample-replication pgpool.conf.sample-master-slave \
--- 339,345 ----
  	pool_error.c \
  	pool_signal.h pool_signal.c \
  	pool_passwd.c pool_passwd.h \
! 	pool_globals.c strlcpy.c
  
  sysconf_DATA = pgpool.conf.sample pcp.conf.sample pool_hba.conf.sample \
  				pgpool.conf.sample-replication pgpool.conf.sample-master-slave \
Index: main.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/main.c,v
retrieving revision 1.114
diff -c -r1.114 main.c
*** main.c	3 Oct 2011 06:22:49 -0000	1.114
--- main.c	13 Oct 2011 06:00:16 -0000
***************
*** 230,236 ****
  					usage();
  					exit(1);
  				}
! 				strncpy(hba_file, optarg, sizeof(hba_file));
  				break;
  
  			case 'c':			/* clear cache option */
--- 230,236 ----
  					usage();
  					exit(1);
  				}
! 				strlcpy(hba_file, optarg, sizeof(hba_file));
  				break;
  
  			case 'c':			/* clear cache option */
***************
*** 247,253 ****
  					usage();
  					exit(1);
  				}
! 				strncpy(conf_file, optarg, sizeof(conf_file));
  				break;
  
  			case 'F':   /* specify PCP password file */
--- 247,253 ----
  					usage();
  					exit(1);
  				}
! 				strlcpy(conf_file, optarg, sizeof(conf_file));
  				break;
  
  			case 'F':   /* specify PCP password file */
***************
*** 256,262 ****
  					usage();
  					exit(1);
  				}
! 				strncpy(pcp_conf_file, optarg, sizeof(pcp_conf_file));
  				break;
  
  			case 'h':
--- 256,262 ----
  					usage();
  					exit(1);
  				}
! 				strlcpy(pcp_conf_file, optarg, sizeof(pcp_conf_file));
  				break;
  
  			case 'h':
***************
*** 426,432 ****
  		char dirnamebuf[POOLMAXPATHLEN+1];
  		char *dirp;
  
! 		strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
  		dirp = dirname(dirnamebuf);
  		snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
  				 dirp, pool_config->pool_passwd);
--- 426,432 ----
  		char dirnamebuf[POOLMAXPATHLEN+1];
  		char *dirp;
  
! 		strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
  		dirp = dirname(dirnamebuf);
  		snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
  				 dirp, pool_config->pool_passwd);
Index: pg_md5.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pg_md5.c,v
retrieving revision 1.12
diff -c -r1.12 pg_md5.c
*** pg_md5.c	12 Jun 2011 09:20:33 -0000	1.12
--- pg_md5.c	13 Oct 2011 06:00:16 -0000
***************
*** 92,98 ****
  				{
  					PRINT_USAGE(EXIT_SUCCESS);
  				}
! 				strncpy(conf_file, optarg, sizeof(conf_file));
  				break;
  
  			case 'u':
--- 92,98 ----
  				{
  					PRINT_USAGE(EXIT_SUCCESS);
  				}
! 				strlcpy(conf_file, optarg, sizeof(conf_file));
  				break;
  
  			case 'u':
***************
*** 106,112 ****
  					fprintf(stderr, "Error: input exceeds maximum username length!\n\n");
  					exit(EXIT_FAILURE);
  				}
! 				strncpy(username, optarg, sizeof(username));
  				break;
  
  			default:
--- 106,112 ----
  					fprintf(stderr, "Error: input exceeds maximum username length!\n\n");
  					exit(EXIT_FAILURE);
  				}
! 				strlcpy(username, optarg, sizeof(username));
  				break;
  
  			default:
***************
*** 206,212 ****
  		exit(EXIT_FAILURE);
  	}
  
! 	strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
  	dirp = dirname(dirnamebuf);
  	snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
  			 dirp, pool_config->pool_passwd);
--- 206,212 ----
  		exit(EXIT_FAILURE);
  	}
  
! 	strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf));
  	dirp = dirname(dirnamebuf);
  	snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s",
  			 dirp, pool_config->pool_passwd);
Index: pool_auth.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_auth.c,v
retrieving revision 1.30
diff -c -r1.30 pool_auth.c
*** pool_auth.c	8 Jun 2011 11:14:26 -0000	1.30
--- pool_auth.c	13 Oct 2011 06:00:17 -0000
***************
*** 5,11 ****
   * pgpool: a language independent connection pool server for PostgreSQL
   * written by Tatsuo Ishii
   *
!  * Copyright (c) 2003-2010	PgPool Global Development Group
   *
   * Permission to use, copy, modify, and distribute this software and
   * its documentation for any purpose and without fee is hereby
--- 5,11 ----
   * pgpool: a language independent connection pool server for PostgreSQL
   * written by Tatsuo Ishii
   *
!  * Copyright (c) 2003-2011	PgPool Global Development Group
   *
   * Permission to use, copy, modify, and distribute this software and
   * its documentation for any purpose and without fee is hereby
***************
*** 373,380 ****
  
  			cp->info[i].major = sp->major;
  			cp->info[i].minor = sp->minor;
! 			strncpy(cp->info[i].database, sp->database, sizeof(cp->info[i].database) - 1);
! 			strncpy(cp->info[i].user, sp->user, sizeof(cp->info[i].user) - 1);
  			cp->info[i].counter = 1;
  		}
  	}
--- 373,380 ----
  
  			cp->info[i].major = sp->major;
  			cp->info[i].minor = sp->minor;
! 			strlcpy(cp->info[i].database, sp->database, sizeof(cp->info[i].database));
! 			strlcpy(cp->info[i].user, sp->user, sizeof(cp->info[i].user));
  			cp->info[i].counter = 1;
  		}
  	}
Index: pool_config.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_config.c,v
retrieving revision 1.67
diff -c -r1.67 pool_config.c
*** pool_config.c	3 Oct 2011 06:22:50 -0000	1.67
--- pool_config.c	13 Oct 2011 06:00:19 -0000
***************
*** 485,491 ****
  /* -*-pgsql-c-*- */
  /*
   *
!  * $Header: /cvsroot/pgpool/pgpool-II/pool_config.c,v 1.67 2011/10/03 06:22:50 t-ishii Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
--- 485,491 ----
  /* -*-pgsql-c-*- */
  /*
   *
!  * $Header: /cvsroot/pgpool/pgpool-II/pool_config.l,v 1.61 2011/10/03 06:22:50 t-ishii Exp $
   *
   * pgpool: a language independent connection pool server for PostgreSQL 
   * written by Tatsuo Ishii
***************
*** 2109,2115 ****
  			return(-1);
  		}
  
! 		strncpy(key, yytext, sizeof(key));
  
  		pool_debug("key: %s", key);
  
--- 2109,2115 ----
  			return(-1);
  		}
  
! 		strlcpy(key, yytext, sizeof(key));
  
  		pool_debug("key: %s", key);
  
***************
*** 3271,3277 ****
  			}
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! 				strncpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
  		}
  
  		else if (!strncmp(key, "backend_port", 12) &&
--- 3271,3277 ----
  			}
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! 				strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
  		}
  
  		else if (!strncmp(key, "backend_port", 12) &&
***************
*** 3369,3375 ****
  			status = BACKEND_INFO(slot).backend_status;
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! 				strncpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
  		}
  		else if (!strncmp(key, "backend_flag", 12) &&
  				 CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
--- 3369,3375 ----
  			status = BACKEND_INFO(slot).backend_status;
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! 				strlcpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
  		}
  		else if (!strncmp(key, "backend_flag", 12) &&
  				 CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
***************
*** 3806,3817 ****
  				if (pool_config->backend_socket_dir == NULL)
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! 					strncpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
  				}
  				else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/ 
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! 					strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
  				}
  			}
  		}	
--- 3806,3817 ----
  				if (pool_config->backend_socket_dir == NULL)
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! 					strlcpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
  				}
  				else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/ 
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! 					strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
  				}
  			}
  		}	
Index: pool_config.l
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_config.l,v
retrieving revision 1.61
diff -c -r1.61 pool_config.l
*** pool_config.l	3 Oct 2011 06:22:50 -0000	1.61
--- pool_config.l	13 Oct 2011 06:00:20 -0000
***************
*** 384,390 ****
  			return(-1);
  		}
  
! 		strncpy(key, yytext, sizeof(key));
  
  		pool_debug("key: %s", key);
  
--- 384,390 ----
  			return(-1);
  		}
  
! 		strlcpy(key, yytext, sizeof(key));
  
  		pool_debug("key: %s", key);
  
***************
*** 1546,1552 ****
  			}
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! 				strncpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
  		}
  
  		else if (!strncmp(key, "backend_port", 12) &&
--- 1546,1552 ----
  			}
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && BACKEND_INFO(slot).backend_status == CON_UNUSED))
! 				strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN);
  		}
  
  		else if (!strncmp(key, "backend_port", 12) &&
***************
*** 1644,1650 ****
  			status = BACKEND_INFO(slot).backend_status;
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! 				strncpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
  		}
  		else if (!strncmp(key, "backend_flag", 12) &&
  				 CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
--- 1644,1650 ----
  			status = BACKEND_INFO(slot).backend_status;
  			if (context == INIT_CONFIG ||
  				(context == RELOAD_CONFIG && (status == CON_UNUSED || status == CON_DOWN)))
! 				strlcpy(BACKEND_INFO(slot).backend_data_directory, str, MAX_PATH_LENGTH);
  		}
  		else if (!strncmp(key, "backend_flag", 12) &&
  				 CHECK_CONTEXT(INIT_CONFIG|RELOAD_CONFIG, context) &&
***************
*** 2081,2092 ****
  				if (pool_config->backend_socket_dir == NULL)
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! 					strncpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
  				}
  				else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/ 
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! 					strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
  				}
  			}
  		}	
--- 2081,2092 ----
  				if (pool_config->backend_socket_dir == NULL)
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use PostgreSQL's default unix socket path (%s)", i, DEFAULT_SOCKET_DIR);
! 					strlcpy(BACKEND_INFO(i).backend_hostname, DEFAULT_SOCKET_DIR, MAX_DB_HOST_NAMELEN);
  				}
  				else /* DEPRECATED. backward compatibility with older version. Use backend_socket_dir*/ 
  				{
  					pool_debug("pool_config: empty backend_hostname%d, use backend_socket_dir as unix socket path (%s)", i, pool_config->backend_socket_dir);
! 					strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN);
  				}
  			}
  		}	
Index: pool_proto_modules.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_proto_modules.c,v
retrieving revision 1.110
diff -c -r1.110 pool_proto_modules.c
*** pool_proto_modules.c	14 Sep 2011 13:15:38 -0000	1.110
--- pool_proto_modules.c	13 Oct 2011 06:00:21 -0000
***************
*** 127,133 ****
  	}
  
  	/* save last query string for logging purpose */
! 	strncpy(query_string_buffer, contents, sizeof(query_string_buffer));
  
  	/* show ps status */
  	query_ps_status(contents, backend);
--- 127,133 ----
  	}
  
  	/* save last query string for logging purpose */
! 	strlcpy(query_string_buffer, contents, sizeof(query_string_buffer));
  
  	/* show ps status */
  	query_ps_status(contents, backend);
***************
*** 590,596 ****
  	node = msg->query_context->parse_tree;
  	query = msg->query_context->original_query;
  	pool_debug("Execute: query: %s", query);
! 	strncpy(query_string_buffer, query, sizeof(query_string_buffer));
  
  	pool_debug("Execute: query string = <%s>", query);
  
--- 590,596 ----
  	node = msg->query_context->parse_tree;
  	query = msg->query_context->original_query;
  	pool_debug("Execute: query: %s", query);
! 	strlcpy(query_string_buffer, query, sizeof(query_string_buffer));
  
  	pool_debug("Execute: query string = <%s>", query);
  
***************
*** 2635,2641 ****
  			return POOL_END;
  
  #ifdef DEBUG
! 		strncpy(buf, string, len);
  		pool_debug("copy line %d %d bytes :%s:", j++, len, buf);
  #endif
  
--- 2635,2641 ----
  			return POOL_END;
  
  #ifdef DEBUG
! 		strlcpy(buf, string, sizeof(buf));
  		pool_debug("copy line %d %d bytes :%s:", j++, len, buf);
  #endif
  
Index: pool_relcache.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_relcache.c,v
retrieving revision 1.14
diff -c -r1.14 pool_relcache.c
*** pool_relcache.c	30 Aug 2011 11:02:11 -0000	1.14
--- pool_relcache.c	13 Oct 2011 06:00:23 -0000
***************
*** 63,69 ****
  	}
  
  	p->num = cachesize;
! 	strncpy(p->sql, sql, sizeof(p->sql)-1);
  	p->register_func = register_func;
  	p->unregister_func = unregister_func;
  	p->cache_is_session_local = issessionlocal;
--- 63,69 ----
  	}
  
  	p->num = cachesize;
! 	strlcpy(p->sql, sql, sizeof(p->sql));
  	p->register_func = register_func;
  	p->unregister_func = unregister_func;
  	p->cache_is_session_local = issessionlocal;
***************
*** 207,214 ****
  	}
  
  	/* Register cache */
! 	strncpy(relcache->cache[index].dbname, dbname, MAX_ITEM_LENGTH);
! 	strncpy(relcache->cache[index].relname, rel, MAX_ITEM_LENGTH);
  	relcache->cache[index].refcnt = 1;
  	relcache->cache[index].session_id = local_session_id;
  	if (pool_config->relcache_expire > 0)
--- 207,214 ----
  	}
  
  	/* Register cache */
! 	strlcpy(relcache->cache[index].dbname, dbname, MAX_ITEM_LENGTH);
! 	strlcpy(relcache->cache[index].relname, rel, MAX_ITEM_LENGTH);
  	relcache->cache[index].refcnt = 1;
  	relcache->cache[index].session_id = local_session_id;
  	if (pool_config->relcache_expire > 0)
_______________________________________________
Pgpool-general mailing list
[email protected]
http://pgfoundry.org/mailman/listinfo/pgpool-general

Reply via email to