summaryrefslogtreecommitdiff
path: root/strings/strmake.c
diff options
context:
space:
mode:
authorunknown <monty@mysql.com/narttu.mysql.fi>2008-03-04 17:13:34 +0200
committerunknown <monty@mysql.com/narttu.mysql.fi>2008-03-04 17:13:34 +0200
commit09e4e954c36663bb7824b9b8b5daff706f53a2a6 (patch)
tree9e10c98a209dd0ecefc7b4e3b81d5c549ec3c088 /strings/strmake.c
parent79ca1004cb5c5470569e03f6200b351a3e390bbc (diff)
downloadmariadb-git-09e4e954c36663bb7824b9b8b5daff706f53a2a6.tar.gz
Fixed crashing bug when starting mysqld with --dbug
Fixed crash when using other maria block size than 8192 Fixed bug that caused tables to be reported as crashed if maria_log_control was deleted mysql-test/valgrind.supp: Suppress leaks on SuSE 10.3, x86 64 bit sql/mysqld.cc: Don't give warning in case of timeout for pthread_cond_timedwait Fixed crashing bug when starting mysqld with --dbug storage/maria/ha_maria.cc: Fixed crash when using other block size than 8192 (Crash happend later in bitmap page handling) storage/maria/ma_locking.c: When we write a new uuid for a zerofilled file, also update the lsn's storage/maria/ma_open.c: Don't update lsn on open. Wait until first time file is changed Fixed bug that caused tables to be reported as crashed if maria_log_control was deleted strings/strmake.c: Fixed warnings for strings without end 0 when running under valgrind.
Diffstat (limited to 'strings/strmake.c')
-rw-r--r--strings/strmake.c46
1 files changed, 29 insertions, 17 deletions
diff --git a/strings/strmake.c b/strings/strmake.c
index df8d78e8476..903a1b83626 100644
--- a/strings/strmake.c
+++ b/strings/strmake.c
@@ -29,26 +29,38 @@
char *strmake(register char *dst, register const char *src, size_t length)
{
-#ifdef EXTRA_DEBUG
- /*
- 'length' is the maximum length of the string; the buffer needs
- to be one character larger to accomodate the terminating '\0'.
- This is easy to get wrong, so we make sure we write to the
- entire length of the buffer to identify incorrect buffer-sizes.
- We only initialise the "unused" part of the buffer here, a) for
- efficiency, and b) because dst==src is allowed, so initialising
- the entire buffer would overwrite the source-string. Also, we
- write a character rather than '\0' as this makes spotting these
- problems in the results easier.
- */
- uint n= strlen(src) + 1;
- if (n <= length)
- memset(dst + n, (int) 'Z', length - n + 1);
-#endif
-
while (length--)
+ {
if (! (*dst++ = *src++))
+ {
+#ifdef EXTRA_DEBUG
+ /*
+ 'length' is the maximum length of the string; the buffer needs
+ to be one character larger to accommodate the terminating
+ '\0'. This is easy to get wrong, so we make sure we write to
+ the entire length of the buffer to identify incorrect
+ buffer-sizes. We only initialism the "unused" part of the
+ buffer here, a) for efficiency, and b) because dst==src is
+ allowed, so initializing the entire buffer would overwrite the
+ source-string. Also, we write a character rather than '\0' as
+ this makes spotting these problems in the results easier.
+
+ If we are using purify/valgrind, we only set one character at
+ end to be able to detect also wrong accesses after the end of
+ dst.
+ */
+ if (length)
+ {
+#ifdef HAVE_purify
+ dst[length-1]= 'Z';
+#else
+ bfill(dst, length-1, (int) 'Z');
+#endif /* HAVE_purify */
+ }
+#endif /* EXTRA_DEBUG */
return dst-1;
+ }
+ }
*dst=0;
return dst;
}