|
@@ -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)
|
|
|
{
|