diff options
author | Oleksandr Byelkin <sanja@mariadb.com> | 2023-01-31 11:01:48 +0100 |
---|---|---|
committer | Oleksandr Byelkin <sanja@mariadb.com> | 2023-01-31 11:01:48 +0100 |
commit | 76bcea3154a3ac2c26024ac5cb241e19e0e277d9 (patch) | |
tree | cbe9339633c5eb6b9206c89a3b1c65495f05e868 /include | |
parent | 51fc6b91d2d3c40a69b78f2e47641107d65a957b (diff) | |
parent | de2d08994255739d53ba28ea34288ca8352029b1 (diff) | |
download | mariadb-git-76bcea3154a3ac2c26024ac5cb241e19e0e277d9.tar.gz |
Merge branch '10.9' into 10.10
Diffstat (limited to 'include')
-rw-r--r-- | include/m_string.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/include/m_string.h b/include/m_string.h index 7130a41438f..9e35be404ec 100644 --- a/include/m_string.h +++ b/include/m_string.h @@ -226,6 +226,44 @@ static inline void lex_string_set3(LEX_CSTRING *lex_str, const char *c_str, lex_str->length= len; } +/* + Copies src into dst and ensures dst is a NULL terminated C string. + + Returns 1 if the src string was truncated due to too small size of dst. + Returns 0 if src completely fit within dst. Pads the remaining dst with '\0' + + Note: dst_size must be > 0 +*/ +static inline int safe_strcpy(char *dst, size_t dst_size, const char *src) +{ + memset(dst, '\0', dst_size); + strncpy(dst, src, dst_size - 1); + /* + If the first condition is true, we are guaranteed to have src length + >= (dst_size - 1), hence safe to access src[dst_size - 1]. + */ + if (dst[dst_size - 2] != '\0' && src[dst_size - 1] != '\0') + return 1; /* Truncation of src. */ + return 0; +} + +/* + Appends src to dst and ensures dst is a NULL terminated C string. + + Returns 1 if the src string was truncated due to too small size of dst. + Returns 0 if src completely fit within the remaining dst space. Pads the + remaining dst with '\0'. + + Note: dst_size must be > 0 +*/ +static inline int safe_strcat(char *dst, size_t dst_size, const char *src) +{ + size_t init_len= strlen(dst); + if (init_len >= dst_size - 1) + return 1; + return safe_strcpy(dst + init_len, dst_size - init_len, src); +} + #ifdef __cplusplus static inline char *safe_str(char *str) { return str ? str : const_cast<char*>(""); } |