Signed-off-by: Jan Pokorný <jpoko...@redhat.com> --- groups.c | 12 +++++++++--- main.c | 2 +- restree.c | 1 + rg_state.c | 12 ++++++++---- rg_thread.c | 3 ++- slang_event.c | 29 ++++++++++++++++++----------- 6 files changed, 39 insertions(+), 20 deletions(-)
diff --git a/groups.c b/groups.c index c4929e4..cdfc997 100644 --- a/groups.c +++ b/groups.c @@ -1129,7 +1129,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; } @@ -1826,14 +1827,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/main.c b/main.c index 931d95e..c823357 100644 --- a/main.c +++ b/main.c @@ -50,7 +50,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/restree.c b/restree.c index 8280c56..c1fb069 100644 --- a/restree.c +++ b/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/rg_state.c b/rg_state.c index 3db6bd9..6d41fa5 100644 --- a/rg_state.c +++ b/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/rg_thread.c b/rg_thread.c index 75af6f1..a7bf3f9 100644 --- a/rg_thread.c +++ b/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); diff --git a/slang_event.c b/slang_event.c index 0b9f0d0..ccdda53 100644 --- a/slang_event.c +++ b/slang_event.c @@ -850,24 +850,24 @@ array_to_string(char *buf, int buflen, int *array, int arraylen) memset(intbuf, 0, sizeof(intbuf)); memset(buf, 0, buflen); - len = snprintf(buf, buflen - 1, "[ "); - if (len == buflen) + len = snprintf(buf, buflen, "[ "); + if (len >= buflen) return -1; remain -= len; for (x = 0; x < arraylen; x++) { - len = snprintf(intbuf, sizeof(intbuf) - 1, "%d ", array[x]); + len = snprintf(intbuf, sizeof(intbuf), "%d ", array[x]); remain -= len; - if (remain > 0) { + if (remain >= 0) { strncat(buf, intbuf, len); } else { return -1; } } - len = snprintf(intbuf, sizeof(intbuf) - 1 , "]"); + len = snprintf(intbuf, sizeof(intbuf) , "]"); remain -= len; - if (remain > 0) { + if (remain >= 0) { strncat(buf, intbuf, len); } else { return -1; @@ -938,28 +938,35 @@ sl_logt_print(int level) case SLANG_INT_TYPE: if (SLang_pop_integer(&s_intval) < 0) return; - len=snprintf(tmp, sizeof(tmp) - 1, "%d", s_intval); + len=snprintf(tmp, sizeof(tmp), "%d", s_intval); + if (len > sizeof(tmp)) + len = sizeof(tmp); break; case SLANG_STRING_TYPE: need_free = 0; if (SLpop_string(&s_strval) < 0) return; - len=snprintf(tmp, sizeof(tmp) - 1, "%s", s_strval); + len=snprintf(tmp, sizeof(tmp), "%s", s_strval); SLfree(s_strval); + if (len > sizeof(tmp)) + len = sizeof(tmp); break; default: need_free = 0; - len=snprintf(tmp, sizeof(tmp) - 1, + len=snprintf(tmp, sizeof(tmp), "{UnknownType %d}", t); + if (len > sizeof(tmp)) + len = sizeof(tmp); break; } --nargs; if (len > remain) - return; - remain -= len; + /* Partial log is better than none */ + break; + remain -= len; memcpy(&logbuf[remain], tmp, len); }