summaryrefslogtreecommitdiffstats
path: root/lib/util/debug.c
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2014-07-30 09:22:21 +0000
committerMichael Adam <obnox@samba.org>2014-07-31 18:49:47 +0200
commit06a0b1c85150d68bcbb6d6f81a66bf3976e0223e (patch)
treefb780d80b876acd8b2fedac673bce1ab6a93c0f5 /lib/util/debug.c
parent200d94e5636d1852ae3c435d9a8335f655b95c27 (diff)
downloadsamba-06a0b1c85150d68bcbb6d6f81a66bf3976e0223e.tar.gz
samba-06a0b1c85150d68bcbb6d6f81a66bf3976e0223e.tar.xz
samba-06a0b1c85150d68bcbb6d6f81a66bf3976e0223e.zip
debug: In dbghdrclass, don't call strlen repeatedly
Also properly protect against header_str overflow Signed-off-by: Volker Lendecke <vl@samba.org> Reviewed-by: Michael Adam <obnox@samba.org>
Diffstat (limited to 'lib/util/debug.c')
-rw-r--r--lib/util/debug.c60
1 files changed, 40 insertions, 20 deletions
diff --git a/lib/util/debug.c b/lib/util/debug.c
index 95b9db6832..cd2c608805 100644
--- a/lib/util/debug.c
+++ b/lib/util/debug.c
@@ -955,6 +955,7 @@ bool dbghdrclass(int level, int cls, const char *location, const char *func)
int old_errno = errno;
bool verbose = false;
char header_str[200];
+ size_t hs_len;
struct timeval tv;
struct timeval_buf tvbuf;
@@ -990,45 +991,64 @@ bool dbghdrclass(int level, int cls, const char *location, const char *func)
GetTimeOfDay(&tv);
timeval_str_buf(&tv, state.settings.debug_hires_timestamp, &tvbuf);
- snprintf(header_str, sizeof(header_str), "[%s, %2d",
- tvbuf.buf, level);
+ hs_len = snprintf(header_str, sizeof(header_str), "[%s, %2d",
+ tvbuf.buf, level);
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
if (unlikely(DEBUGLEVEL_CLASS[ cls ] >= 10)) {
verbose = true;
}
if (verbose || state.settings.debug_pid) {
- size_t hs_len = strlen(header_str);
- snprintf(header_str + hs_len, sizeof(header_str) - hs_len,
- ", pid=%u", (unsigned int)getpid());
+ hs_len += snprintf(
+ header_str + hs_len, sizeof(header_str) - hs_len,
+ ", pid=%u", (unsigned int)getpid());
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
}
if (verbose || state.settings.debug_uid) {
- size_t hs_len = strlen(header_str);
- snprintf(header_str + hs_len, sizeof(header_str) - hs_len,
- ", effective(%u, %u), real(%u, %u)",
- (unsigned int)geteuid(), (unsigned int)getegid(),
- (unsigned int)getuid(), (unsigned int)getgid());
+ hs_len += snprintf(
+ header_str + hs_len, sizeof(header_str) - hs_len,
+ ", effective(%u, %u), real(%u, %u)",
+ (unsigned int)geteuid(), (unsigned int)getegid(),
+ (unsigned int)getuid(), (unsigned int)getgid());
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
}
if ((verbose || state.settings.debug_class)
&& (cls != DBGC_ALL)) {
- size_t hs_len = strlen(header_str);
- snprintf(header_str + hs_len,
- sizeof(header_str) - hs_len,
- ", class=%s",
- classname_table[cls]);
+ hs_len += snprintf(
+ header_str + hs_len, sizeof(header_str) - hs_len,
+ ", class=%s", classname_table[cls]);
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
}
- strlcat(header_str, "] ", sizeof(header_str));
+ /*
+ * No +=, see man man strlcat
+ */
+ hs_len = strlcat(header_str, "] ", sizeof(header_str));
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
if (!state.settings.debug_prefix_timestamp) {
- size_t hs_len = strlen(header_str);
- snprintf(header_str + hs_len,
- sizeof(header_str) - hs_len,
- "%s(%s)\n", location, func);
+ hs_len += snprintf(
+ header_str + hs_len, sizeof(header_str) - hs_len,
+ "%s(%s)\n", location, func);
+ if (hs_len >= sizeof(header_str)) {
+ goto full;
+ }
}
+full:
(void)Debug1(header_str);
errno = old_errno;