mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 10:31:54 +01:00
InnoDB: Fix potential buffer underflow.
This commit is contained in:
parent
acdc193a45
commit
ad52436711
3 changed files with 38 additions and 4 deletions
|
@ -122,6 +122,7 @@ ut_strcmp(const void* str1, const void* str2);
|
||||||
Copies up to size - 1 characters from the NUL-terminated string src to
|
Copies up to size - 1 characters from the NUL-terminated string src to
|
||||||
dst, NUL-terminating the result. Returns strlen(src), so truncation
|
dst, NUL-terminating the result. Returns strlen(src), so truncation
|
||||||
occurred if the return value >= size. */
|
occurred if the return value >= size. */
|
||||||
|
|
||||||
ulint
|
ulint
|
||||||
ut_strlcpy(
|
ut_strlcpy(
|
||||||
/*=======*/
|
/*=======*/
|
||||||
|
@ -130,6 +131,18 @@ ut_strlcpy(
|
||||||
const char* src, /* in: source buffer */
|
const char* src, /* in: source buffer */
|
||||||
ulint size); /* in: size of destination buffer */
|
ulint size); /* in: size of destination buffer */
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
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 */
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
Compute strlen(ut_strcpyq(str, q)). */
|
Compute strlen(ut_strcpyq(str, q)). */
|
||||||
UNIV_INLINE
|
UNIV_INLINE
|
||||||
|
|
|
@ -187,9 +187,7 @@ mem_heap_create_block(
|
||||||
}
|
}
|
||||||
|
|
||||||
block->magic_n = MEM_BLOCK_MAGIC_N;
|
block->magic_n = MEM_BLOCK_MAGIC_N;
|
||||||
ut_memcpy(&(block->file_name), file_name + ut_strlen(file_name) - 7,
|
ut_strlcpy_rev(block->file_name, file_name, sizeof(block->file_name));
|
||||||
7);
|
|
||||||
block->file_name[7]='\0';
|
|
||||||
block->line = line;
|
block->line = line;
|
||||||
|
|
||||||
#ifdef MEM_PERIODIC_CHECK
|
#ifdef MEM_PERIODIC_CHECK
|
||||||
|
|
|
@ -364,7 +364,30 @@ ut_strlcpy(
|
||||||
dst[n] = '\0';
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
|
Loading…
Add table
Reference in a new issue