]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/util/logger.c
check the return value of nprintf functions
[netatalk.git] / libatalk / util / logger.c
index 73bb453c909bcf82cbfc62d761714a5a7d9ed026..60361371c05be64b7e7f311bdf5597117d68d5c5 100644 (file)
@@ -101,7 +101,7 @@ static const int num_loglevel_strings = COUNT_ARRAY(arr_loglevel_strings);
  */
 
 /* -[un]setuplog <logtype> <loglevel> [<filename>]*/
-static void setuplog_internal(const char *logtype, const char *loglevel, const char *filename)
+static void setuplog_internal(const char *loglevel, const char *logtype, const char *filename)
 {
     int typenum, levelnum;
 
@@ -162,6 +162,9 @@ static void generate_message_details(char *message_details_buffer,
     ptr += templen;
 
     templen = snprintf(ptr, len, "%06u ", (int)tv.tv_usec);
+    if (templen == -1 || templen >= len)
+        return;
+        
     len -= templen;
     ptr += templen;
 
@@ -174,6 +177,8 @@ static void generate_message_details(char *message_details_buffer,
     /* PID */
     pid = getpid();
     templen = snprintf(ptr, len, "[%d]", pid);
+    if (templen == -1 || templen >= len)
+        return;
     len -= templen;
     ptr += templen;
 
@@ -184,7 +189,7 @@ static void generate_message_details(char *message_details_buffer,
             templen = snprintf(ptr, len, " {%s:%d}", basename + 1, log_src_linenumber);
         else
             templen = snprintf(ptr, len, " {%s:%d}", log_src_filename, log_src_linenumber);
-        if (templen >= len)
+        if (templen == -1 || templen >= len)
             return;
         len -= templen;
         ptr += templen;
@@ -195,12 +200,16 @@ static void generate_message_details(char *message_details_buffer,
         templen = snprintf(ptr, len,  " (D%d:", loglevel - 1);
     else
         templen = snprintf(ptr, len, " (%c:", arr_loglevel_chars[loglevel]);
+    if (templen == -1 || templen >= len)
+        return;
     len -= templen;
     ptr += templen;
 
     /* Errortype */
     if (logtype<num_logtype_strings) {
         templen = snprintf(ptr, len, "%s", arr_logtype_strings[logtype]);
+        if (templen == -1 || templen >= len)
+            return;
         len -= templen;
         ptr += templen;
     }
@@ -398,7 +407,7 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
     va_end(args);
 
     /* Append \n */
-    if (len >= MAXLOGSIZE)
+    if (len ==-1 || len >= MAXLOGSIZE)
         /* vsnprintf hit the buffer size*/
         temp_buffer[MAXLOGSIZE-2] = '\n';
     else {
@@ -424,7 +433,7 @@ void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
 }
 
 /* Called by the LOG macro for syslog messages */
-void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype, char *message, ...)
+void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype _U_, char *message, ...)
 {
     va_list args;
     char log_buffer[MAXLOGSIZE];
@@ -448,7 +457,7 @@ void make_syslog_entry(enum loglevels loglevel, enum logtypes logtype, char *mes
     va_start(args, message);
     vsnprintf(log_buffer, sizeof(log_buffer), message, args);
     va_end(args);
-
+    log_buffer[MAXLOGSIZE -1] = 0;
     syslog(get_syslog_equivalent(loglevel), "%s", log_buffer);
 
     inlog = 0;
@@ -482,7 +491,7 @@ void setuplog(const char *logstr)
     }
 
     /* finally call setuplog, filename can be NULL */
-    setuplog_internal(logtype, loglevel, filename);
+    setuplog_internal(loglevel, logtype, filename);
 
     free(ptrbak);
 }
@@ -501,7 +510,7 @@ void unsetuplog(const char *logstr)
     filename = strtok(NULL, " \t");
 
     /* finally call setuplog, filename can be NULL */
-    setuplog_internal(str, NULL, filename);
+    setuplog_internal(NULL, str, filename);
 
     free(str);
 }