aboutsummaryrefslogtreecommitdiff
path: root/src/common/log.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2008-12-18 17:18:06 +0000
committerNick Mathewson <nickm@torproject.org>2008-12-18 17:18:06 +0000
commitb6f89a647a300c6427cdc6796008275447d7ec93 (patch)
tree9f525ca2d728a9e795f8e3433cec491af5e40438 /src/common/log.c
parent122170c1d3333185bacf361c523c8e19f0a5e8ba (diff)
downloadtor-b6f89a647a300c6427cdc6796008275447d7ec93.tar
tor-b6f89a647a300c6427cdc6796008275447d7ec93.tar.gz
One log.c XXX021 was a misunderstanding. Also, clip log messages passed to syslog to their maximum length when there is a maximum.
svn:r17688
Diffstat (limited to 'src/common/log.c')
-rw-r--r--src/common/log.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/src/common/log.c b/src/common/log.c
index d93bc8a55..d4894baef 100644
--- a/src/common/log.c
+++ b/src/common/log.c
@@ -299,9 +299,23 @@ logv(int severity, log_domain_mask_t domain, const char *funcname,
}
if (lf->is_syslog) {
#ifdef HAVE_SYSLOG_H
- /* XXXX Some syslog implementations have scary limits on the length of
- * what you can pass them. Can/should we detect this? */
- syslog(severity, "%s", end_of_prefix);
+ char *m = end_of_prefix;
+#ifdef MAXLINE
+ /* Some syslog implementations have limits on the length of what you can
+ * pass them, and some very old ones do not detect overflow so well.
+ * Regrettably, they call their maximum line length MAXLINE. */
+#if MAXLINE < 64
+#warn "MAXLINE is a very low number; it might not be from syslog.h after all"
+#endif
+ if (msg_len >= MAXLINE)
+ m = tor_strndup(end_of_prefix, MAXLINE-1);
+#endif
+ syslog(severity, "%s", m);
+#ifdef MAXLINE
+ if (m != end_of_prefix) {
+ tor_free(m);
+ }
+#endif
#endif
lf = lf->next;
continue;
@@ -739,9 +753,8 @@ static const char *domain_list[] = {
"OR", "EDGE", "ACCT", "HIST", NULL
};
-/** Return the log domain for which <b>domain</b> is the name, or 0 if there
- * is no such name. */
-/*XXXX021 0 could mean "no such domain" or LD_GENERAL. Fix that. */
+/** Return a bitmask for the log domain for which <b>domain</b> is the name,
+ * or 0 if there is no such name. */
static log_domain_mask_t
parse_log_domain(const char *domain)
{