]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[syslog] Strip invalid characters from hostname
authorMichael Brown <mcb30@ipxe.org>
Fri, 16 May 2014 12:45:52 +0000 (13:45 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 16 May 2014 12:45:52 +0000 (13:45 +0100)
Avoid generating syntactically invalid log messages by ensuring that
invalid characters are not present in the hostname.  In particular,
ensure that any whitespace is stripped, since whitespace functions as
a field separator for syslog messages.

Reported-by: Alex Davies <adavies@jumptrading.com>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/net/udp/syslog.c

index d517371256ccdd6ba13f9743b4fe2945a0c2b764..d65d19ab835079b4812715f170ab23c8a0c4116a 100644 (file)
@@ -27,6 +27,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 
 #include <stdint.h>
 #include <stdlib.h>
+#include <ctype.h>
 #include <byteswap.h>
 #include <ipxe/xfer.h>
 #include <ipxe/open.h>
@@ -91,15 +92,15 @@ static char *syslog_domain;
  */
 int syslog_send ( struct interface *xfer, unsigned int severity,
                  const char *message, const char *terminator ) {
+       const char *hostname = ( syslog_hostname ? syslog_hostname : "" );
+       const char *domain = ( ( hostname[0] && syslog_domain ) ?
+                              syslog_domain : "" );
 
        return xfer_printf ( xfer, "<%d>%s%s%s%sipxe: %s%s",
                             SYSLOG_PRIORITY ( SYSLOG_DEFAULT_FACILITY,
-                                              severity ),
-                            ( syslog_hostname ? syslog_hostname : "" ),
-                            ( syslog_domain ? "." : "" ),
-                            ( syslog_domain ? syslog_domain : "" ),
-                            ( ( syslog_hostname || syslog_domain ) ? " " : ""),
-                            message, terminator );
+                                              severity ), hostname,
+                            ( domain[0] ? "." : "" ), domain,
+                            ( hostname[0] ? " " : "" ), message, terminator );
 }
 
 /******************************************************************************
@@ -211,6 +212,28 @@ const struct setting syslog6_setting __setting ( SETTING_MISC, syslog6 ) = {
        .scope = &ipv6_scope,
 };
 
+/**
+ * Strip invalid characters from host/domain name
+ *
+ * @v name             Name to strip
+ */
+static void syslog_fix_name ( char *name ) {
+       char *fixed = name;
+       int c;
+
+       /* Do nothing if name does not exist */
+       if ( ! name )
+               return;
+
+       /* Strip any non-printable or whitespace characters from the name */
+       do {
+               c = *(name++);
+               *fixed = c;
+               if ( isprint ( c ) && ! isspace ( c ) )
+                       fixed++;
+       } while ( c );
+}
+
 /**
  * Apply syslog settings
  *
@@ -223,8 +246,10 @@ static int apply_syslog_settings ( void ) {
        /* Fetch hostname and domain name */
        free ( syslog_hostname );
        fetch_string_setting_copy ( NULL, &hostname_setting, &syslog_hostname );
+       syslog_fix_name ( syslog_hostname );
        free ( syslog_domain );
        fetch_string_setting_copy ( NULL, &domain_setting, &syslog_domain );
+       syslog_fix_name ( syslog_domain );
 
        /* Fetch log server */
        syslog_console.disabled = CONSOLE_DISABLED;