diff options
author | Martin Pool <mbp@samba.org> | 2002-01-24 02:41:38 +0000 |
---|---|---|
committer | Martin Pool <mbp@samba.org> | 2002-01-24 02:41:38 +0000 |
commit | aa126974ba0c77b29a0896888bd58b2bee750f20 (patch) | |
tree | 040b57ee11ef88be9704b929c054c6b05f0c68ed | |
parent | 707de53457d7ab7c849c2fa3c8380f16c54680ad (diff) | |
download | rsync-aa126974ba0c77b29a0896888bd58b2bee750f20.tar.gz |
log_formatted: Fill the log buffer with nuls to make sure we cannot
accidentally leave the string unterminated.
-rw-r--r-- | log.c | 17 |
1 files changed, 16 insertions, 1 deletions
@@ -409,6 +409,12 @@ static void log_formatted(enum logcode code, extern int am_daemon; int64 b; + /* We expand % codes one by one in place in buf. We don't + * copy in the terminating nul of the inserted strings, but + * rather keep going until we reach the nul of the format. + * Just to make sure we don't clobber that nul and therefore + * accidentally keep going, we zero the buffer now. */ + memset(buf, 0, sizeof buf); strlcpy(buf, format, sizeof(buf)); for (s=&buf[0]; @@ -466,7 +472,11 @@ static void log_formatted(enum logcode code, break; } - if (!n) continue; + /* n is the string to be inserted in place of this % + * code; l is its length not including the trailing + * NUL */ + if (!n) + continue; l = strlen(n); @@ -476,11 +486,16 @@ static void log_formatted(enum logcode code, exit_cleanup(RERR_MESSAGEIO); } + /* Shuffle the rest of the string along to make space for n */ if (l != 2) { memmove(s+(l-1), s+1, strlen(s+1)+1); } + + /* Copy in n but NOT its nul, because the format sting + * probably continues after this. */ memcpy(p, n, l); + /* Skip over inserted string; continue looking */ s = p+l; } |