diff options
author | brl <brl> | 2007-08-14 20:20:57 +0000 |
---|---|---|
committer | brl <brl> | 2007-08-14 20:20:57 +0000 |
commit | daa5550f2e424a88ba6de7602fab405808a2ef23 (patch) | |
tree | 5d6fb3f051af6c1938091e64270a8163be1f0528 /src | |
parent | 1bea7fa97bbdb1ceeb2696b8982a1e025ef751f4 (diff) | |
download | ratpoison-daa5550f2e424a88ba6de7602fab405808a2ef23.zip |
src/main.c (xvsprintf): limit memory allocation to 200K when vsnprintf return -1.
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. */ |