diff options
author | Sergei Golubchik <serg@mariadb.org> | 2023-02-15 16:30:53 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2023-02-15 16:30:53 +0100 |
commit | b45ed284a69cdbffac61bdcf74bf86fa7b7391a4 (patch) | |
tree | de26ce8e0a5aa40889e889d758e3a3a98b9f71a8 /include/m_string.h | |
parent | cc182aca9352fb7efde0deb0a83844e1d5f0c64c (diff) | |
parent | cafba8761af55ae16cc69c9b53a341340a845b36 (diff) | |
download | mariadb-git-bb-11.0-all-builders.tar.gz |
Merge branch '10.11' into 11.0bb-11.0-all-builders
Diffstat (limited to 'include/m_string.h')
-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*>(""); } |