]> granicus.if.org Git - sudo/commitdiff
Add estrndup()
authorTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 28 Feb 2010 20:09:50 +0000 (15:09 -0500)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Sun, 28 Feb 2010 20:09:50 +0000 (15:09 -0500)
include/alloc.h
src/alloc.c

index ef9d7c27aa66f724f44a4c104303624ebe67b96c..84fd8dd829a0107ef644617415dfa231df47b28f 100644 (file)
@@ -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 */
index 83997f54d46e42249b25b07c96f3d317bfd5da1e..465b24d9ff2350a1fc4216185073295ba2f1541e 100644 (file)
@@ -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);
 }