From 1d45168f4b4d21c33d7aaa23b8203e2a4a43545e Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Wed, 27 Sep 2006 16:19:42 +0000
Subject: [PATCH] Fix some misuses of strncat().

---
 src/bin/pg_config/pg_config.c |  4 ++--
 src/tutorial/funcs.c          | 11 ++++++-----
 src/tutorial/funcs_new.c      | 11 ++++++-----
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/bin/pg_config/pg_config.c b/src/bin/pg_config/pg_config.c
index e84cd7a1307..edd4a6af368 100644
--- a/src/bin/pg_config/pg_config.c
+++ b/src/bin/pg_config/pg_config.c
@@ -17,7 +17,7 @@
  *
  * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.20 2006/06/06 22:41:09 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_config/pg_config.c,v 1.21 2006/09/27 16:19:42 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -213,7 +213,7 @@ show_pgxs(bool all)
 	if (all)
 		printf("PGXS = ");
 	get_pkglib_path(mypath, path);
-	strncat(path, "/pgxs/src/makefiles/pgxs.mk", MAXPGPATH - 1);
+	strncat(path, "/pgxs/src/makefiles/pgxs.mk", MAXPGPATH - 1 - strlen(path));
 	cleanup_path(path);
 	printf("%s\n", path);
 }
diff --git a/src/tutorial/funcs.c b/src/tutorial/funcs.c
index 2ac798f81b6..18f8467dddb 100644
--- a/src/tutorial/funcs.c
+++ b/src/tutorial/funcs.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/tutorial/funcs.c,v 1.15 2006/05/31 20:58:09 tgl Exp $ */
+/* $PostgreSQL: pgsql/src/tutorial/funcs.c,v 1.16 2006/09/27 16:19:42 tgl Exp $ */
 
 /******************************************************************************
   These are user-defined functions that can be bound to a Postgres backend
@@ -85,13 +85,14 @@ copytext(text *t)
 text *
 concat_text(text *arg1, text *arg2)
 {
-	int32		new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
+	int32		arg1_size = VARSIZE(arg1) - VARHDRSZ;
+	int32		arg2_size = VARSIZE(arg2) - VARHDRSZ;
+	int32		new_text_size = arg1_size + arg2_size + VARHDRSZ;
 	text	   *new_text = (text *) palloc(new_text_size);
 
-	memset((void *) new_text, 0, new_text_size);
 	VARATT_SIZEP(new_text) = new_text_size;
-	strncpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
-	strncat(VARDATA(new_text), VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
+	memcpy(VARDATA(new_text), VARDATA(arg1), arg1_size);
+	memcpy(VARDATA(new_text) + arg1_size, VARDATA(arg2), arg2_size);
 	return new_text;
 }
 
diff --git a/src/tutorial/funcs_new.c b/src/tutorial/funcs_new.c
index b42f495d019..88fff266c4e 100644
--- a/src/tutorial/funcs_new.c
+++ b/src/tutorial/funcs_new.c
@@ -1,4 +1,4 @@
-/* $PostgreSQL: pgsql/src/tutorial/funcs_new.c,v 1.11 2006/07/14 14:52:27 momjian Exp $ */
+/* $PostgreSQL: pgsql/src/tutorial/funcs_new.c,v 1.12 2006/09/27 16:19:42 tgl Exp $ */
 
 /******************************************************************************
   These are user-defined functions that can be bound to a Postgres backend
@@ -101,13 +101,14 @@ concat_text(PG_FUNCTION_ARGS)
 {
 	text	   *arg1 = PG_GETARG_TEXT_P(0);
 	text	   *arg2 = PG_GETARG_TEXT_P(1);
-	int32		new_text_size = VARSIZE(arg1) + VARSIZE(arg2) - VARHDRSZ;
+	int32		arg1_size = VARSIZE(arg1) - VARHDRSZ;
+	int32		arg2_size = VARSIZE(arg2) - VARHDRSZ;
+	int32		new_text_size = arg1_size + arg2_size + VARHDRSZ;
 	text	   *new_text = (text *) palloc(new_text_size);
 
-	memset((void *) new_text, 0, new_text_size);
 	VARATT_SIZEP(new_text) = new_text_size;
-	strncpy(VARDATA(new_text), VARDATA(arg1), VARSIZE(arg1) - VARHDRSZ);
-	strncat(VARDATA(new_text), VARDATA(arg2), VARSIZE(arg2) - VARHDRSZ);
+	memcpy(VARDATA(new_text), VARDATA(arg1), arg1_size);
+	memcpy(VARDATA(new_text) + arg1_size, VARDATA(arg2), arg2_size);
 	PG_RETURN_TEXT_P(new_text);
 }
 
-- 
GitLab