diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index 5982d171a4a..453236f6d63 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -789,11 +789,8 @@ SortTocFromFile(Archive *AHX, RestoreOptions *ropt) { ArchiveHandle *AH = (ArchiveHandle *) AHX; FILE *fh; - char buf[1024]; - char *cmnt; - char *endptr; - DumpId id; - TocEntry *te; + char buf[100]; + bool incomplete_line; TocEntry *tePrev; /* Allocate space for the 'wanted' array, and init it */ @@ -809,8 +806,30 @@ SortTocFromFile(Archive *AHX, RestoreOptions *ropt) die_horribly(AH, modulename, "could not open TOC file: %s\n", strerror(errno)); + incomplete_line = false; while (fgets(buf, sizeof(buf), fh) != NULL) { + bool prev_incomplete_line = incomplete_line; + int buflen; + char *cmnt; + char *endptr; + DumpId id; + TocEntry *te; + + /* + * Some lines in the file might be longer than sizeof(buf). This is + * no problem, since we only care about the leading numeric ID which + * can be at most a few characters; but we have to skip continuation + * bufferloads when processing a long line. + */ + buflen = strlen(buf); + if (buflen > 0 && buf[buflen - 1] == '\n') + incomplete_line = false; + else + incomplete_line = true; + if (prev_incomplete_line) + continue; + /* Truncate line at comment, if any */ cmnt = strchr(buf, ';'); if (cmnt != NULL)