Le 2014-08-12 19:54, Anton Khirnov a écrit :
---
 doc/APIchanges      |  3 +++
 libavutil/mem.c     | 20 ++++++++++++++++++++
 libavutil/mem.h     | 10 ++++++++++
 libavutil/version.h |  2 +-
 4 files changed, 34 insertions(+), 1 deletion(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 6e5242e..fc56677 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:     2014-08-09

 API changes, most recent first:

+2014-08-xx - xxxxxxx - lavu 54.2.0 - mem.h
+  Add av_strndup().
+
 2014-04-xx - xxxxxxx - lavr 2.1.0 - avresample.h
   Add avresample_convert_frame() and avresample_config().

diff --git a/libavutil/mem.c b/libavutil/mem.c
index be42342..129aff1 100644
--- a/libavutil/mem.c
+++ b/libavutil/mem.c
@@ -222,6 +222,26 @@ char *av_strdup(const char *s)
     return ptr;
 }

+char *av_strndup(const char *s, size_t len)
+{
+    size_t len1;
+    char *ret = NULL;
+
+    if (!s)
+        return NULL;
+
+    len1 = strlen(s);

This is suboptimal if strlen(s) is much larger than len.
Worst, it will yield to undefined behaviour if s is not nul-terminated but warranted as least len bytes long by the caller.

I would advise using strnlen() (which is really just an alias for memchr(,0,)).

+    len  = FFMIN(len, len1);
+
+    ret = av_realloc(NULL, len + 1);
+    if (!ret)
+        return NULL;
+
+    memcpy(ret, s, len);
+    ret[len] = 0;
+    return ret;
+}
+
 static void fill16(uint8_t *dst, int len)
 {
     uint32_t v = AV_RN16(dst - 2);
--
Rémi Denis-Courmont
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to