cluster: STABLE32 - rgmanager: various cleanups regarding string functions

Ryan McCabe rmccabe at fedoraproject.org
Tue May 1 19:22:16 UTC 2012


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=18a65378fdb97db310131fb917a7c3821772c8b0
Commit:        18a65378fdb97db310131fb917a7c3821772c8b0
Parent:        a14f3920a9a8c3be930a8b8958414768a0698240
Author:        jpokorny at redhat.com <jpokorny at redhat.com>
AuthorDate:    Fri Apr 6 18:28:09 2012 +0200
Committer:     Ryan McCabe <rmccabe at redhat.com>
CommitterDate: Tue May 1 15:22:12 2012 -0400

rgmanager: various cleanups regarding string functions

Signed-off-by: Jan Pokorný <jpokorny at redhat.com>
Signed-off-by: Ryan McCabe <rmccabe at redhat.com>
---
 rgmanager/src/daemons/groups.c    |   12 +++++++++---
 rgmanager/src/daemons/main.c      |    2 +-
 rgmanager/src/daemons/restree.c   |    1 +
 rgmanager/src/daemons/rg_state.c  |   12 ++++++++----
 rgmanager/src/daemons/rg_thread.c |    3 ++-
 5 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index 78b9de9..ff80caa 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1140,7 +1140,8 @@ _group_property(const char *groupname, const char *property,
 	for (; res->r_attrs[x].ra_name; x++) {
 		if (strcasecmp(res->r_attrs[x].ra_name, property))
 			continue;
-		strncpy(ret, res->r_attrs[x].ra_value, len);
+		strncpy(ret, res->r_attrs[x].ra_value, len-1);
+		ret[len-1] = '\0';
 		return 0;
 	}
 
@@ -1837,14 +1838,19 @@ get_recovery_policy(const char *rg_name, char *buf, size_t buflen)
 	resource_t *res;
 	const char *val;
 
+	assert(buflen >= 1);  /* and expect partial result if doesn't fit */
+
 	pthread_rwlock_rdlock(&resource_lock);
 
-	strncpy(buf, "restart", buflen);
+	strncpy(buf, "restart", buflen-1);
+	buf[buflen-1] = '\0';
+
 	res = find_root_by_ref(&_resources, rg_name);
 	if (res) {
 		val = res_attr_value(res, "recovery");
 		if (val) {
-			strncpy(buf, val, buflen);
+			strncpy(buf, val, buflen-1);
+			/* Already terminated */
 		}
 	}
 
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index 15f6215..02ec5ef 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -52,7 +52,7 @@ segfault(int __attribute__ ((unused)) sig)
 	char ow[64];
 	int err; // dumb error checking... will be replaced by logsys
 
-	snprintf(ow, sizeof(ow)-1, "PID %d Thread %d: SIGSEGV\n", getpid(),
+	snprintf(ow, sizeof(ow), "PID %d Thread %d: SIGSEGV\n", getpid(),
 		 gettid());
 	err = write(2, ow, strlen(ow));
 	while(1)
diff --git a/rgmanager/src/daemons/restree.c b/rgmanager/src/daemons/restree.c
index e29a2e8..cfa1893 100644
--- a/rgmanager/src/daemons/restree.c
+++ b/rgmanager/src/daemons/restree.c
@@ -105,6 +105,7 @@ add_ocf_stuff(resource_t *res, char **env, int depth, int refcnt, int timeout)
 		strncpy(ver, OCF_API_VERSION, sizeof(ver)-1);
 	else 
 		strncpy(ver, res->r_rule->rr_version, sizeof(ver)-1);
+	ver[sizeof(ver)-1] = '\0';
 
 	minor = strchr(ver, '.');
 	if (minor) {
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index 80b992a..5b7991d 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -207,8 +207,10 @@ set_rg_state(const char *name, rg_state_t *svcblk)
 	int ret, tries = 0;
 #endif
 
-	if (name)
-		strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name));
+	if (name) {
+		strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name)-1);
+		svcblk->rs_name[sizeof(svcblk->rs_name)-1] = '\0';
+	}
 
 	snprintf(res, sizeof(res), "rg=\"%s\"", name);
 
@@ -270,7 +272,8 @@ get_rg_state(const char *name, rg_state_t *svcblk)
 		return -1;
 	}
 
-	strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name));
+	strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name)-1);
+	svcblk->rs_name[sizeof(svcblk->rs_name)-1];
 
 	snprintf(res, sizeof(res),"rg=\"%s\"", svcblk->rs_name);
 
@@ -367,7 +370,8 @@ get_rg_state_local(const char *name, rg_state_t *svcblk)
 		errno = EINVAL;
 		return -1;
 	}
-	strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name));
+	strncpy(svcblk->rs_name, name, sizeof(svcblk->rs_name)-1);
+	svcblk->rs_name[sizeof(svcblk->rs_name)-1] = '\0';
 
 	snprintf(res, sizeof(res),"rg=\"%s\"", svcblk->rs_name);
 
diff --git a/rgmanager/src/daemons/rg_thread.c b/rgmanager/src/daemons/rg_thread.c
index 75af6f1..a7bf3f9 100644
--- a/rgmanager/src/daemons/rg_thread.c
+++ b/rgmanager/src/daemons/rg_thread.c
@@ -179,7 +179,8 @@ resgroup_thread_main(void *arg)
 
 	rg_inc_threads();
 
-	strncpy(myname, arg, 256);
+	strncpy(myname, arg, sizeof(myname)-1);
+	myname[sizeof(myname)-1] = '\0';
 	dbg_printf("Thread %s (tid %d) starting\n",myname,gettid());
 
 	pthread_mutex_init(&my_queue_mutex, NULL);


More information about the cluster-commits mailing list