]> granicus.if.org Git - postgresql/commitdiff
Fix pnstrdup() to not memcpy() the maximum allowed length.
authorAndres Freund <andres@anarazel.de>
Mon, 9 Oct 2017 22:20:42 +0000 (15:20 -0700)
committerAndres Freund <andres@anarazel.de>
Mon, 9 Oct 2017 22:20:42 +0000 (15:20 -0700)
The previous behaviour was dangerous if the length passed wasn't the
size of the underlying buffer, but the maximum size of the underlying
buffer.

Author: Andres Freund
Discussion: https://postgr.es/m/20161003215524.mwz5p45pcverrkyk@alap3.anarazel.de

src/backend/utils/mmgr/mcxt.c

index cd696f16bc764238b8706f67bc7486a5c2c1d98e..64e0408d5afc9d19d8ee2e6a9b0e6d5743a8fc35 100644 (file)
@@ -21,6 +21,7 @@
 
 #include "postgres.h"
 
+#include "common/string.h"
 #include "miscadmin.h"
 #include "utils/memdebug.h"
 #include "utils/memutils.h"
@@ -1086,10 +1087,14 @@ pstrdup(const char *in)
 char *
 pnstrdup(const char *in, Size len)
 {
-       char       *out = palloc(len + 1);
+       char       *out;
 
+       len = pg_strnlen(in, len);
+
+       out = palloc(len + 1);
        memcpy(out, in, len);
        out[len] = '\0';
+
        return out;
 }