pgpool2.git / summary / log / commit / refs

commit    221dfb259ecf420f87693e7402a34d29a65e5526
Author:   Tatsuo Ishii <ishii at sraoss.co.jp>
Date:     Thu Oct 13 06:05:37 2011 +0000

    Major cleanup for strncpy(). There are several places where
    strncpy() is used. Problem is some of them do no consider the case
    when copy lengh == buffer size. In this case copied buffer is not
    null terminated and may cause tons of problems later.
    To fix this, most of them are replaced by strlcpy().


Makefile.am | 2 +- Makefile.in | 4 ++-- main.c | 8 ++++---- pg_md5.c | 6 +++--- pool_auth.c | 6 +++--- pool_config.c | 10 +++++----- pool_config.l | 10 +++++----- pool_proto_modules.c | 6 +++--- pool_relcache.c | 6 +++--- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Makefile.am b/Makefile.am index fc4aa886c..ef378e35b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,7 +31,7 @@ pg_md5_SOURCES = pg_md5.c md5.c md5.h \ pool_error.c \ pool_signal.h pool_signal.c \ pool_passwd.c pool_passwd.h \ - pool_globals.c + pool_globals.c strlcpy.c DEFS = @DEFS@ \ -DDEFAULT_CONFIGDIR=\"$(sysconfdir)\" diff --git a/Makefile.in b/Makefile.in index df3fb3b3f..140d71b1d 100644 --- a/Makefile.in +++ b/Makefile.in @@ -61,7 +61,7 @@ PROGRAMS = $(bin_PROGRAMS) 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) + 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,7 +339,7 @@ pg_md5_SOURCES = pg_md5.c md5.c md5.h \ pool_error.c \ pool_signal.h pool_signal.c \ pool_passwd.c pool_passwd.h \ - pool_globals.c + 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 \ diff --git a/main.c b/main.c index f4fa041bb..833a98f35 100644 --- a/main.c +++ b/main.c @@ -230,7 +230,7 @@ int main(int argc, char **argv) usage(); exit(1); } - strncpy(hba_file, optarg, sizeof(hba_file)); + strlcpy(hba_file, optarg, sizeof(hba_file)); break; case 'c': /* clear cache option */ @@ -247,7 +247,7 @@ int main(int argc, char **argv) usage(); exit(1); } - strncpy(conf_file, optarg, sizeof(conf_file)); + strlcpy(conf_file, optarg, sizeof(conf_file)); break; case 'F': /* specify PCP password file */ @@ -256,7 +256,7 @@ int main(int argc, char **argv) usage(); exit(1); } - strncpy(pcp_conf_file, optarg, sizeof(pcp_conf_file)); + strlcpy(pcp_conf_file, optarg, sizeof(pcp_conf_file)); break; case 'h': @@ -426,7 +426,7 @@ int main(int argc, char **argv) char dirnamebuf[POOLMAXPATHLEN+1]; char *dirp; - strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); + strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); dirp = dirname(dirnamebuf); snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s", dirp, pool_config->pool_passwd); diff --git a/pg_md5.c b/pg_md5.c index e87f57b56..3a832c70f 100644 --- a/pg_md5.c +++ b/pg_md5.c @@ -92,7 +92,7 @@ main(int argc, char *argv[]) { PRINT_USAGE(EXIT_SUCCESS); } - strncpy(conf_file, optarg, sizeof(conf_file)); + strlcpy(conf_file, optarg, sizeof(conf_file)); break; case 'u': @@ -106,7 +106,7 @@ main(int argc, char *argv[]) fprintf(stderr, "Error: input exceeds maximum username length!\n\n"); exit(EXIT_FAILURE); } - strncpy(username, optarg, sizeof(username)); + strlcpy(username, optarg, sizeof(username)); break; default: @@ -206,7 +206,7 @@ static void update_pool_passwd(char *conf_file, char *username, char *password) exit(EXIT_FAILURE); } - strncpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); + strlcpy(dirnamebuf, conf_file, sizeof(dirnamebuf)); dirp = dirname(dirnamebuf); snprintf(pool_passwd, sizeof(pool_passwd), "%s/%s", dirp, pool_config->pool_passwd); diff --git a/pool_auth.c b/pool_auth.c index ed7b03bb2..d14fa41c4 100644 --- a/pool_auth.c +++ b/pool_auth.c @@ -5,7 +5,7 @@ * pgpool: a language independent connection pool server for PostgreSQL * written by Tatsuo Ishii * - * Copyright (c) 2003-2010 PgPool Global Development Group + * 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,8 +373,8 @@ from pool_read_message_length and recheck the pg_hba.conf settings."); 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); + 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; } } diff --git a/pool_config.c b/pool_config.c index 149305945..8f0c109d3 100644 --- a/pool_config.c +++ b/pool_config.c @@ -2109,7 +2109,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) return(-1); } - strncpy(key, yytext, sizeof(key)); + strlcpy(key, yytext, sizeof(key)); pool_debug("key: %s", key); @@ -3271,7 +3271,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) } 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); + strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN); } else if (!strncmp(key, "backend_port", 12) && @@ -3369,7 +3369,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) 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); + 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,12 +3806,12 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) 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); + 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); - strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN); + strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN); } } } diff --git a/pool_config.l b/pool_config.l index d8bec08f8..c91b026e1 100644 --- a/pool_config.l +++ b/pool_config.l @@ -384,7 +384,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) return(-1); } - strncpy(key, yytext, sizeof(key)); + strlcpy(key, yytext, sizeof(key)); pool_debug("key: %s", key); @@ -1546,7 +1546,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) } 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); + strlcpy(BACKEND_INFO(slot).backend_hostname, str, MAX_DB_HOST_NAMELEN); } else if (!strncmp(key, "backend_port", 12) && @@ -1644,7 +1644,7 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) 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); + 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,12 +2081,12 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) 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); + 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); - strncpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN); + strlcpy(BACKEND_INFO(i).backend_hostname, pool_config->backend_socket_dir, MAX_DB_HOST_NAMELEN); } } } diff --git a/pool_proto_modules.c b/pool_proto_modules.c index 67df3f947..9773693d1 100644 --- a/pool_proto_modules.c +++ b/pool_proto_modules.c @@ -127,7 +127,7 @@ POOL_STATUS SimpleQuery(POOL_CONNECTION *frontend, } /* save last query string for logging purpose */ - strncpy(query_string_buffer, contents, sizeof(query_string_buffer)); + strlcpy(query_string_buffer, contents, sizeof(query_string_buffer)); /* show ps status */ query_ps_status(contents, backend); @@ -590,7 +590,7 @@ POOL_STATUS Execute(POOL_CONNECTION *frontend, POOL_CONNECTION_POOL *backend, 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)); + strlcpy(query_string_buffer, query, sizeof(query_string_buffer)); pool_debug("Execute: query string = <%s>", query); @@ -2635,7 +2635,7 @@ POOL_STATUS CopyDataRows(POOL_CONNECTION *frontend, return POOL_END; #ifdef DEBUG - strncpy(buf, string, len); + strlcpy(buf, string, sizeof(buf)); pool_debug("copy line %d %d bytes :%s:", j++, len, buf); #endif diff --git a/pool_relcache.c b/pool_relcache.c index 764b2cc42..6979a02f8 100644 --- a/pool_relcache.c +++ b/pool_relcache.c @@ -63,7 +63,7 @@ POOL_RELCACHE *pool_create_relcache(int cachesize, char *sql, } p->num = cachesize; - strncpy(p->sql, sql, sizeof(p->sql)-1); + strlcpy(p->sql, sql, sizeof(p->sql)); p->register_func = register_func; p->unregister_func = unregister_func; p->cache_is_session_local = issessionlocal; @@ -207,8 +207,8 @@ void *pool_search_relcache(POOL_RELCACHE *relcache, POOL_CONNECTION_POOL *backen } /* Register cache */ - strncpy(relcache->cache[index].dbname, dbname, MAX_ITEM_LENGTH); - strncpy(relcache->cache[index].relname, rel, MAX_ITEM_LENGTH); + 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) [parent: 27d703437f60]