Преглед изворни кода

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
Nick Mathewson пре 15 година
родитељ
комит
b6f89a647a
2 измењених фајлова са 22 додато и 6 уклоњено
  1. 3 0
      ChangeLog
  2. 19 6
      src/common/log.c

+ 3 - 0
ChangeLog

@@ -40,6 +40,9 @@ Changes in version 0.2.1.9-alpha - 2008-12-2?
       pairs. Partial implementation of proposal 157.
     - Clients now never report any stream end reason except 'MISC'.
       Implements proposal 148.
+    - On platforms with a maximum syslog string length, truncate syslog
+      messages to that length ourselves, rather than relying on the
+      system to do it for us.
 
   o Minor features (controller):
     - New CONSENSUS_ARRIVED event to note when a new consensus has

+ 19 - 6
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)
 {