From f9ad8a2802a67ee99f1ed7a16999b5faa3c2602f Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Tue, 17 May 2005 17:30:29 +0000
Subject: [PATCH] Guard against duplicate IDs in input file in
 SortTocFromFile(). Per report from Brian Hackett.

---
 src/bin/pg_dump/pg_backup_archiver.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c
index 85368ca6abb..be12cc4e592 100644
--- a/src/bin/pg_dump/pg_backup_archiver.c
+++ b/src/bin/pg_dump/pg_backup_archiver.c
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *		$PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.108 2005/04/30 08:08:51 neilc Exp $
+ *		$PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_archiver.c,v 1.109 2005/05/17 17:30:29 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -891,24 +891,21 @@ SortTocFromFile(Archive *AHX, RestoreOptions *ropt)
 	if (!fh)
 		die_horribly(AH, modulename, "could not open TOC file\n");
 
-	while (fgets(buf, 1024, fh) != NULL)
+	while (fgets(buf, sizeof(buf), fh) != NULL)
 	{
-		/* Find a comment */
+		/* Truncate line at comment, if any */
 		cmnt = strchr(buf, ';');
-		if (cmnt == buf)
-			continue;
-
-		/* End string at comment */
 		if (cmnt != NULL)
 			cmnt[0] = '\0';
 
-		/* Skip if all spaces */
-		if (strspn(buf, " \t") == strlen(buf))
+		/* Ignore if all blank */
+		if (strspn(buf, " \t\r") == strlen(buf))
 			continue;
 
-		/* Get an ID */
+		/* Get an ID, check it's valid and not already seen */
 		id = strtol(buf, &endptr, 10);
-		if (endptr == buf || id <= 0 || id > AH->maxDumpId)
+		if (endptr == buf || id <= 0 || id > AH->maxDumpId ||
+			ropt->idWanted[id - 1])
 		{
 			write_msg(modulename, "WARNING: line ignored: %s\n", buf);
 			continue;
-- 
GitLab