summaryrefslogtreecommitdiff
path: root/innobase/ut
diff options
context:
space:
mode:
authorosku@127.(none) <>2005-09-29 13:02:18 +0300
committerosku@127.(none) <>2005-09-29 13:02:18 +0300
commitad5243671176832bff058bbb3f6dcf10211315b5 (patch)
treea9705f364c5027166020d94dd5da2f9092fb04a8 /innobase/ut
parentacdc193a45a7f2952867a3d3f2373dd42e887ef2 (diff)
downloadmariadb-git-ad5243671176832bff058bbb3f6dcf10211315b5.tar.gz
InnoDB: Fix potential buffer underflow.
Diffstat (limited to 'innobase/ut')
-rw-r--r--innobase/ut/ut0mem.c25
1 files changed, 24 insertions, 1 deletions
diff --git a/innobase/ut/ut0mem.c b/innobase/ut/ut0mem.c
index c1e3ebbf35c..47b1e24e5e1 100644
--- a/innobase/ut/ut0mem.c
+++ b/innobase/ut/ut0mem.c
@@ -364,7 +364,30 @@ ut_strlcpy(
dst[n] = '\0';
}
- return src_size;
+ return(src_size);
+}
+
+/**************************************************************************
+Like ut_strlcpy, but if src doesn't fit in dst completely, copies the last
+(size - 1) bytes of src, not the first. */
+
+ulint
+ut_strlcpy_rev(
+/*===========*/
+ /* out: strlen(src) */
+ char* dst, /* in: destination buffer */
+ const char* src, /* in: source buffer */
+ ulint size) /* in: size of destination buffer */
+{
+ ulint src_size = strlen(src);
+
+ if (size != 0) {
+ ulint n = ut_min(src_size, size - 1);
+
+ memcpy(dst, src + src_size - n, n + 1);
+ }
+
+ return(src_size);
}
/**************************************************************************