]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
Fix sstrndup
authorDagobert Michelsen <dam@opencsw.org>
Fri, 28 Feb 2020 10:36:50 +0000 (11:36 +0100)
committerDagobert Michelsen <dam@opencsw.org>
Fri, 28 Feb 2020 10:36:50 +0000 (11:36 +0100)
src/utils/common/common.c
src/utils/common/common.h

index bf86ab28b985f01f1a5dbf352dab2fb3158f87db..dd91dabc260ce214e995a16766d9fafa2516e883 100644 (file)
@@ -160,6 +160,15 @@ char *sstrdup(const char *s) {
   return r;
 } /* char *sstrdup */
 
+size_t sstrnlen(const char *s, size_t n) {
+  const char *p = s;
+
+  while(n-- > 0 && *p)
+    p++;
+
+  return p - s;
+} /* size_t sstrnlen */
+
 char *sstrndup(const char *s, size_t n) {
   char *r;
   size_t sz;
@@ -167,10 +176,7 @@ char *sstrndup(const char *s, size_t n) {
   if (s == NULL)
     return NULL;
 
-  sz = strlen(s);
-  if (sz > n) {
-    sz = n;
-  }
+  sz = sstrnlen(s, n);
   r = malloc(sz + 1);
   if (r == NULL) {
     ERROR("sstrndup: Out of memory.");
@@ -180,7 +186,7 @@ char *sstrndup(const char *s, size_t n) {
   r[sz] = '\0';
 
   return r;
-} /* char *sstrdup */
+} /* char *sstrndup */
 
 /* Even though Posix requires "strerror_r" to return an "int",
  * some systems (e.g. the GNU libc) return a "char *" _and_
index 7cd8c4c1301ef7de7883c0f893c5634e3925acb6..fce2d12bbbc611e2e0683055b297869d05faf3c3 100644 (file)
@@ -73,6 +73,7 @@ __attribute__((format(printf, 1, 2))) char *ssnprintf_alloc(char const *format,
                                                             ...);
 
 char *sstrdup(const char *s);
+size_t sstrnlen(const char *s, size_t n);
 char *sstrndup(const char *s, size_t n);
 void *smalloc(size_t size);
 char *sstrerror(int errnum, char *buf, size_t buflen);