2017-07-05 8:57 GMT+02:00 Robert Foss <robert.f...@collabora.com>: > Add local strlcpy implementation. > > Signed-off-by: Robert Foss <robert.f...@collabora.com> > --- > Changes since v5: > Actually include changes from v5 in patch > > Changes since v4: > Gustaw Smolarczyk <wielkie...@gmail.com> > - Make util_strlcpy have the same behaviour as strlcpy > > Changes since v3: > Matt Turner <matts...@gmail.com> > - Change name of util_strncpy to util_strlcpy > > Changes since v2: > Brian Paul <bri...@vmware.com> > - Patch added > > > src/util/u_string.h | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/src/util/u_string.h b/src/util/u_string.h > index e88e13f42c..bbabcbc7cb 100644 > --- a/src/util/u_string.h > +++ b/src/util/u_string.h > @@ -48,6 +48,15 @@ > extern "C" { > #endif > > +static inline size_t > +util_strlcpy(char *dst, const char *src, size_t n) > +{ > + strncpy(dst, src, n); > + dst[n-1] = '\0'; > + > + return strnlen(src, n);
I don't think you can use strnlen here. strlcpy returns the number of characters in src without any restrictions. If src happens not to be null-terminated, it is already undefined behavior (and strnlen won't necessarily help if src is just before an unmapped page and n is sufficiently large). In general, you shouldn't use strn* functions when working with null-terminated strings. You might also use strlen+memcpy instead of strncpy+strlen to potentially achieve higher performance (strlen and memcpy are probably ones of the most optimized functions in any runtime). Maybe something like this: static inline size_t util_strlcpy(char *dst, const char *src, size_t n) { const size_t src_len = strlen(src); if (src_len < n) { memcpy(dst, src, src_len + 1); } else { memcpy(dst, src, n - 1); dst[n - 1] = '\0'; } return src_len; } > +} > + > #ifdef _GNU_SOURCE > > #define util_strchrnul strchrnul > -- > 2.11.0 > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev