Changeset 2073

Show
Ignore:
Timestamp:
02/11/2008 09:15:39 PM (5 months ago)
Author:
jan
Message:

limit the number of resizes for large log-messages (from stbuehler)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/log.c

    r2071 r2073  
    310310int log_trace(const char *fmt, ...) { 
    311311        buffer *b; 
    312         int l
     312        int l, tries = 0
    313313        errorlog *err = myconfig; 
    314314        va_list ap; 
     
    318318 
    319319        do { 
     320                errno = 0; 
    320321                va_start(ap, fmt); 
    321322                l = vsnprintf(b->ptr, b->size, fmt, ap); 
     
    335336                        /* C99: l is the mem-size we need */ 
    336337                        buffer_prepare_copy(b, l); 
     338                } else if (tries++ >= 3) { 
     339                        int e = errno; 
     340                        /* glibc 2.0.6 and earlier return -1 if the output was truncated 
     341                         * so we try to increase the buffer size 3 times - so you cannot 
     342                         * print error messages longer than 8 * 4096 = 32k with glib <= 2.0.6 
     343                         */ 
     344                        buffer_copy_string_len(b, CONST_STR_LEN("log_trace: vsnprintf error: l = ")); 
     345                        buffer_append_long(b, l); 
     346                        if (e) { 
     347                                buffer_append_string_len(b, CONST_STR_LEN(", errno = ")); 
     348                                buffer_append_long(b, errno); 
     349                                buffer_append_string_len(b, CONST_STR_LEN(": ")); 
     350                                buffer_append_string(b, strerror(e)); 
     351                        } 
     352                        break; 
    337353                } else { 
    338                         /* glibc 2.0.x and earlier return -1 */ 
    339                         buffer_prepare_copy(b, b->size + 512); 
     354                        buffer_prepare_copy(b, b->size * 2); 
    340355                } 
    341356        } while(1);