From: Todd C. Miller Date: Sun, 28 Feb 2010 20:09:50 +0000 (-0500) Subject: Add estrndup() X-Git-Tag: SUDO_1_8_0~854 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=76c90bc301cdac90e2dc072a2d2d9fc4eb8301dc;p=sudo Add estrndup() --- diff --git a/include/alloc.h b/include/alloc.h index ef9d7c27a..84fd8dd82 100644 --- a/include/alloc.h +++ b/include/alloc.h @@ -27,5 +27,6 @@ void *emalloc2(size_t, size_t); void *erealloc(void *, size_t); void *erealloc3(void *, size_t, size_t); char *estrdup(const char *); +char *estrndup(const char *, size_t); #endif /* _SUDO_ALLOC_H */ diff --git a/src/alloc.c b/src/alloc.c index 83997f54d..465b24d9f 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -156,12 +156,36 @@ estrdup(src) const char *src; { char *dst = NULL; - size_t size; + size_t len; + + if (src != NULL) { + len = strlen(src); + dst = (char *) emalloc(len + 1); + (void) memcpy(dst, src, len); + dst[len] = '\0'; + } + return(dst); +} + +/* + * estrdup() is like strndup(3) except that it exits with an error if + * malloc(3) fails. NOTE: unlike strdup(3), estrdup(NULL) is legal. + */ +char * +estrndup(src, maxlen) + const char *src; + size_t maxlen; +{ + char *dst = NULL; + size_t len; if (src != NULL) { - size = strlen(src) + 1; - dst = (char *) emalloc(size); - (void) memcpy(dst, src, size); + len = strlen(src); + if (len > maxlen) + len = maxlen; + dst = (char *) emalloc(len + 1); + (void) memcpy(dst, src, len); + dst[len] = '\0'; } return(dst); }