From e4ad2aeea2fd1171cb8df1728efd5221ae834685 Mon Sep 17 00:00:00 2001 From: Tatsuo Ishii Date: Mon, 23 May 2011 10:55:36 +0000 Subject: [PATCH] Fix bug with initializing pool_password in daemon mode. Patch from Nicolas Thauvin. To: pgpool-hackers@pgfoundry.org Date: Tue, 17 May 2011 17:08:56 +0200 ------------------------------------------------------------------------ When in daemon mode, connection hangs when using md5 authentication method. The child process in charge of the client goes into an infinite loop in pool_get_passwd() while trying to read the pool_passwd file. The cause of the problem comes from the daemonize() function that closes all file descriptors starting from 3, including the file descriptor of the pool_passwd file. When pgpool gets to pool_get_passwd, the null checks on the passwd_fd variable fail because the variable was not reset to a NULL value. --- main.c | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/main.c b/main.c index 8e64a4f53..42ba1e95a 100644 --- a/main.c +++ b/main.c @@ -327,23 +327,6 @@ int main(int argc, char **argv) pool_config->logsyslog = 1; } - - /* - * Locate pool_passwd - */ - if (strcmp("", pool_config->pool_passwd)) - { - char pool_passwd[POOLMAXPATHLEN+1]; - 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); - pool_init_pool_passwd(pool_passwd); - } - /* * Override debug level */ @@ -426,6 +409,22 @@ int main(int argc, char **argv) else daemonize(); + /* + * Locate pool_passwd + */ + if (strcmp("", pool_config->pool_passwd)) + { + char pool_passwd[POOLMAXPATHLEN+1]; + 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); + pool_init_pool_passwd(pool_passwd); + } + if (pool_semaphore_create(MAX_NUM_SEMAPHORES)) { pool_error("Unable to create semaphores. Exiting..."); -- 2.39.5