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]