diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/conf.h | 6 | ||||
-rw-r--r-- | src/main.c | 15 |
2 files changed, 18 insertions, 3 deletions
@@ -123,4 +123,10 @@ #define DEFAULT_FONT "-*-fixed-bold-r-normal-*-15-*-*-*-c-*-*-*" #define BACKUP_FONT "*" +/* maximum xvsprintf result string length for systems with pre-C99 snprintf: + * on errors that are either permanent or cannot be distinguished from those + * as libc's snprintf might by returning -1 for too small buffers, at most + * the double of this value is tried before giving up */ +#define MAX_LEGACY_SNPRINTF_SIZE 102400 + #endif /* !_ _RATPOISON_CONF_H */ @@ -126,15 +126,24 @@ xvsprintf (char *fmt, va_list ap) return buffer; else if (nchars > -1) size = nchars + 1; - else + /* c99 says -1 is an error other than truncation, + * which thus will not go away with a larger buffer. + * To support older system but not making errors fatal + * (ratpoison will abort when trying to get too much memory otherwise), + * try to increase a bit but not too much: */ + else if (size < MAX_LEGACY_SNPRINTF_SIZE) size *= 2; + else + { + free(buffer); + break; + } /* Resize the buffer and try again. */ buffer = (char *)xrealloc (buffer, size); } - /* Never gets here. */ - return NULL; + return xstrdup("<FAILURE>"); } /* Return a new string based on fmt. */ |