diff --git a/ChangeLog b/ChangeLog index 2f86ef593..1f4efae9a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-02-24 Richard Frith-Macdonald + + * Source/GSFormat.m: Fix buffer overrun by strlen() when printing + c-strings without nul terminators using '%*.*s' format. + 2004-02-23 Adam Fedor * Source/NSUser.m (NSHomeDirectoryForUser): Allow whitespace diff --git a/Source/GSFormat.m b/Source/GSFormat.m index d7ca0c0a7..798d2a9dd 100644 --- a/Source/GSFormat.m +++ b/Source/GSFormat.m @@ -1736,12 +1736,28 @@ NSDictionary *locale) /* This is complicated. We have to transform the multibyte string into a unicode string. */ const char *str = (const char*)string; - unsigned slen = strlen(str); + unsigned slen; NSStringEncoding enc = GetDefEncoding(); - len = prec != -1 ? (unsigned)prec : slen; - if (len > slen) - len = slen; + if (prec != -1) + { + len = (unsigned)prec; + /* + * If the actual length is less than the precision, + * we use the actual length. + */ + for (slen = 0; slen < len; slen++) + { + if (str[slen] == 0) + { + len = slen; + } + } + } + else + { + len = strlen(str); + } /* Allocate dynamically an array which definitely is long enough for the wide character version. */