From 3ba74ad02d3a20d50c068faa02797fafba105508 Mon Sep 17 00:00:00 2001 From: Stephen Gallagher Date: Wed, 25 Aug 2010 10:44:14 -0400 Subject: Add utility function sss_strnlen() This is useful for guaranteeing the size of an input buffer. --- src/sss_client/common.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'src/sss_client/common.c') diff --git a/src/sss_client/common.c b/src/sss_client/common.c index 6b79c7830..3bfa89281 100644 --- a/src/sss_client/common.c +++ b/src/sss_client/common.c @@ -761,3 +761,32 @@ const char *ssscli_err2string(int err) return _("Unexpected error while looking for an error description"); } + +/* Return strlen(str) or maxlen, whichever is shorter + * Returns EINVAL if str is NULL, EFBIG if str is longer than maxlen + * _len will return the result + * + * This function is useful for preventing buffer overflow attacks. + */ +errno_t sss_strnlen(const char *str, size_t maxlen, size_t *len) +{ + if (!str) { + return EINVAL; + } + +#if defined __USE_GNU + *len = strnlen(str, maxlen); +#else + *len = 0; + while (*len < maxlen) { + if (str[*len] == '\0') break; + len++; + } +#endif + + if (*len == maxlen && str[*len] != '\0') { + return EFBIG; + } + + return 0; +} -- cgit