# HG changeset patch # User jlarmour # Date 1249672830 0 # Node ID bfb377ab267a2f7fc8af5d0690f64cd30af2aba9 # Parent 5d701b4e0c3beedfbb4bf79e52387f3f6622ca9b * src/common/vsnprintf.cxx (class Cyg_VsnprintfStream): Remove destructor. (vsnprintf): Apply null terminator correctly when truncated. diff --git a/packages/language/c/libc/stdio/current/ChangeLog b/packages/language/c/libc/stdio/current/ChangeLog --- a/packages/language/c/libc/stdio/current/ChangeLog +++ b/packages/language/c/libc/stdio/current/ChangeLog @@ -1,3 +1,9 @@ +2009-08-07 Jonathan Larmour + + * src/common/vsnprintf.cxx (class Cyg_VsnprintfStream): + Remove destructor. + (vsnprintf): Apply null terminator correctly when truncated. + 2009-02-16 Lars Povlsen * include/stdio.h: Removed extra semicolon after scanf() diff --git a/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx b/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx --- a/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx +++ b/packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx @@ -71,8 +71,6 @@ class Cyg_VsnprintfStream: public Cyg_Ou public: Cyg_VsnprintfStream(char* s): s_(s) {} - virtual ~Cyg_VsnprintfStream() { *s_ = '\0'; } - virtual Cyg_ErrNo write( const cyg_uint8 *buffer, cyg_ucount32 buffer_length, cyg_ucount32 *bytes_written ); @@ -88,6 +86,11 @@ Cyg_VsnprintfStream::write( cyg_ucount32 buffer_length, cyg_ucount32 *bytes_written ) { +#ifdef WHEN_MEMCPY_OPTIMISED_IN_ECOS_EVENTUALLY + memcpy(s_, buffer, buffer_length); + s_ += buffer_length; + *bytes_written = buffer_length; +#else char *dest = s_; char const *src = (char const *)buffer; char const *end = src + buffer_length; @@ -95,14 +98,22 @@ Cyg_VsnprintfStream::write( *dest++ = *src++; s_ = dest; *bytes_written = buffer_length; +#endif return ENOERR; } externC int vsnprintf( char *s, size_t size, const char *format, va_list arg ) __THROW { + int ret; Cyg_VsnprintfStream stream(s); - return vfnprintf( (FILE *)(void *)&stream, size, format, arg ); + ret = vfnprintf( (FILE *)(void *)&stream, size, format, arg ); + /* If no error, and string not truncated, then apply null termination in + * correct place + */ + if ( (ret >= 0) && ((size_t)ret < size) ) + s[ret] = '\0'; + return ret; } // vsnprintf() // EOF vsnprintf.cxx