changeset 2898:bfb377ab267a

* src/common/vsnprintf.cxx (class Cyg_VsnprintfStream): Remove destructor. (vsnprintf): Apply null terminator correctly when truncated.
author jlarmour
date Fri, 07 Aug 2009 19:20:30 +0000
parents 5d701b4e0c3b
children 5dedbd1910f7
files packages/language/c/libc/stdio/current/ChangeLog packages/language/c/libc/stdio/current/src/common/vsnprintf.cxx
diffstat 2 files changed, 20 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- 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  <jifl@eCosCentric.com>
+
+	* src/common/vsnprintf.cxx (class Cyg_VsnprintfStream):
+	Remove destructor.
+	(vsnprintf): Apply null terminator correctly when truncated.
+
 2009-02-16  Lars Povlsen  <lpovlsen@vitesse.com>
 
 	* include/stdio.h: Removed extra semicolon after scanf()
--- 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