str: Make ss_alloc_substring_pool() null-terminate its output.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 23 Mar 2011 03:55:55 +0000 (20:55 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 23 Mar 2011 04:19:49 +0000 (21:19 -0700)
It's inconsistent that ss_alloc_substring() null-terminates its output
but ss_alloc_substring_pool() does not.  This caught us out in
recode_substring_pool(), which used ss_alloc_substring_pool() in a
fallback case where create_iconv() failed and expected the result to
be null-terminated.

Reported-by: Jeremy Lavergne <jeremy@lavergne.gotdns.org>
src/libpspp/str.c

index ba4a26f1426ac51552dd31885d5cdfff5fea321d..08a85ad790f20fe625de485b6c22058226910e2e 100644 (file)
@@ -347,15 +347,16 @@ ss_realloc (struct substring *ss, size_t size)
   ss->string = xrealloc (ss->string, size);
 }
 
-/* Makes a pool_alloc_unaligned()'d copy of the contents of OLD
-   in POOL, and stores it in NEW. */
+/* Makes a pool_alloc_unaligned()'d, null-terminated copy of the contents of
+   OLD in POOL, and stores it in NEW. */
 void
 ss_alloc_substring_pool (struct substring *new, struct substring old,
                          struct pool *pool)
 {
-  new->string = pool_alloc_unaligned (pool, old.length);
+  new->string = pool_alloc_unaligned (pool, old.length + 1);
   new->length = old.length;
   memcpy (new->string, old.string, old.length);
+  new->string[old.length] = '\0';
 }
 
 /* Allocates room for a CNT-byte string in NEW in POOL. */