From 086c189456655846707d9a260a3919f4404ecd9e Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Thu, 8 Feb 2007 11:10:27 +0000 Subject: [PATCH] Normalize fgets() calls to use sizeof() for calculating the buffer size where possible, and fix some sites that apparently thought that fgets() will overwrite the buffer by one byte. Also add some strlcpy() to eliminate some weird memory handling. --- contrib/tsearch2/dict_syn.c | 4 ++-- contrib/tsearch2/stopword.c | 2 +- src/backend/access/transam/xlog.c | 6 +++--- src/bin/pg_dump/pg_backup_files.c | 13 ++++++------- src/bin/psql/common.c | 4 ++-- src/bin/psql/copy.c | 4 ++-- src/bin/psql/prompt.c | 29 ++++++++++++++--------------- src/interfaces/libpq/fe-connect.c | 8 ++++---- src/interfaces/libpq/fe-secure.c | 5 ++--- src/tools/entab/entab.c | 4 ++-- 10 files changed, 38 insertions(+), 41 deletions(-) diff --git a/contrib/tsearch2/dict_syn.c b/contrib/tsearch2/dict_syn.c index 05cb110250..1e3a71cee1 100644 --- a/contrib/tsearch2/dict_syn.c +++ b/contrib/tsearch2/dict_syn.c @@ -1,4 +1,4 @@ -/* $PostgreSQL: pgsql/contrib/tsearch2/dict_syn.c,v 1.11 2006/12/04 09:26:57 teodor Exp $ */ +/* $PostgreSQL: pgsql/contrib/tsearch2/dict_syn.c,v 1.12 2007/02/08 11:10:26 petere Exp $ */ /* * ISpell interface @@ -101,7 +101,7 @@ syn_init(PG_FUNCTION_ARGS) } memset(d, 0, sizeof(DictSyn)); - while (fgets(buf, SYNBUFLEN, fin)) + while (fgets(buf, sizeof(buf), fin)) { slen = strlen(buf) - 1; buf[slen] = '\0'; diff --git a/contrib/tsearch2/stopword.c b/contrib/tsearch2/stopword.c index b9b7699594..d8bb54aca3 100644 --- a/contrib/tsearch2/stopword.c +++ b/contrib/tsearch2/stopword.c @@ -45,7 +45,7 @@ readstoplist(text *in, StopList * s) errmsg("could not open file \"%s\": %m", filename))); - while (fgets(buf, STOPBUFLEN, hin)) + while (fgets(buf, sizeof(buf), hin)) { buf[strlen(buf) - 1] = '\0'; pg_verifymbstr(buf, strlen(buf), false); diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index b1a5a57b2f..fa6731a386 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.262 2007/02/07 16:44:47 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.263 2007/02/08 11:10:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -3374,7 +3374,7 @@ readTimeLineHistory(TimeLineID targetTLI) /* * Parse the file... */ - while (fgets(fline, MAXPGPATH, fd) != NULL) + while (fgets(fline, sizeof(fline), fd) != NULL) { /* skip leading whitespace and check for # comment */ char *ptr; @@ -4248,7 +4248,7 @@ readRecoveryCommandFile(void) /* * Parse the file... */ - while (fgets(cmdline, MAXPGPATH, fd) != NULL) + while (fgets(cmdline, sizeof(cmdline), fd) != NULL) { /* skip leading whitespace and check for # comment */ char *ptr; diff --git a/src/bin/pg_dump/pg_backup_files.c b/src/bin/pg_dump/pg_backup_files.c index 8216d979d8..72eedac2e4 100644 --- a/src/bin/pg_dump/pg_backup_files.c +++ b/src/bin/pg_dump/pg_backup_files.c @@ -20,7 +20,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.29 2006/07/14 14:52:26 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_backup_files.c,v 1.30 2007/02/08 11:10:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -321,26 +321,25 @@ _getBlobTocEntry(ArchiveHandle *AH, Oid *oid, char fname[K_STD_BUF_SIZE]) { lclContext *ctx = (lclContext *) AH->formatData; char blobTe[K_STD_BUF_SIZE]; - size_t fpos; - size_t eos; - if (fgets(&blobTe[0], K_STD_BUF_SIZE - 1, ctx->blobToc) != NULL) + if (fgets(blobTe, sizeof(blobTe), ctx->blobToc) != NULL) { + size_t fpos; + size_t eos; + *oid = atooid(blobTe); fpos = strcspn(blobTe, " "); - strncpy(fname, &blobTe[fpos + 1], K_STD_BUF_SIZE - 1); + strlcpy(fname, &blobTe[fpos + 1], K_STD_BUF_SIZE); eos = strlen(fname) - 1; if (fname[eos] == '\n') fname[eos] = '\0'; - } else { - *oid = 0; fname[0] = '\0'; } diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 024cf1cd9c..d05c241c69 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -3,7 +3,7 @@ * * Copyright (c) 2000-2007, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.132 2007/01/05 22:19:49 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.133 2007/02/08 11:10:27 petere Exp $ */ #include "postgres_fe.h" #include "common.h" @@ -1497,7 +1497,7 @@ expand_tilde(char **filename) if (*(fn + 1) == '\0') get_home_path(home); /* ~ or ~/ only */ else if ((pw = getpwnam(fn + 1)) != NULL) - StrNCpy(home, pw->pw_dir, MAXPGPATH); /* ~user */ + strlcpy(home, pw->pw_dir, sizeof(home)); /* ~user */ *p = oldp; if (strlen(home) != 0) diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c index e655f46c34..eb205ecbc2 100644 --- a/src/bin/psql/copy.c +++ b/src/bin/psql/copy.c @@ -3,7 +3,7 @@ * * Copyright (c) 2000-2007, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.73 2007/02/05 15:22:18 adunstan Exp $ + * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.74 2007/02/08 11:10:27 petere Exp $ */ #include "postgres_fe.h" #include "copy.h" @@ -801,7 +801,7 @@ handleCopyIn(PGconn *conn, FILE *copystream, bool isbinary) /* enable longjmp while waiting for input */ sigint_interrupt_enabled = true; - fgresult = fgets(buf, COPYBUFSIZ, copystream); + fgresult = fgets(buf, sizeof(buf), copystream); sigint_interrupt_enabled = false; diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index b7628e7a7f..1df630ae6b 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -3,7 +3,7 @@ * * Copyright (c) 2000-2007, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/psql/prompt.c,v 1.49 2007/01/05 22:19:49 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/psql/prompt.c,v 1.50 2007/02/08 11:10:27 petere Exp $ */ #include "postgres_fe.h" @@ -96,10 +96,10 @@ get_prompt(promptStatus_t status) destination[0] = '\0'; for (p = prompt_string; - *p && strlen(destination) < MAX_PROMPT_SIZE; + *p && strlen(destination) < sizeof(destination) - 1; p++) { - memset(buf, 0, MAX_PROMPT_SIZE + 1); + memset(buf, 0, sizeof(buf)); if (esc) { switch (*p) @@ -107,7 +107,7 @@ get_prompt(promptStatus_t status) /* Current database */ case '/': if (pset.db) - strncpy(buf, PQdb(pset.db), MAX_PROMPT_SIZE); + strlcpy(buf, PQdb(pset.db), sizeof(buf)); break; case '~': if (pset.db) @@ -116,9 +116,9 @@ get_prompt(promptStatus_t status) if (strcmp(PQdb(pset.db), PQuser(pset.db)) == 0 || ((var = getenv("PGDATABASE")) && strcmp(var, PQdb(pset.db)) == 0)) - strcpy(buf, "~"); + strlcpy(buf, "~", sizeof(buf)); else - strncpy(buf, PQdb(pset.db), MAX_PROMPT_SIZE); + strlcpy(buf, PQdb(pset.db), sizeof(buf)); } break; @@ -132,7 +132,7 @@ get_prompt(promptStatus_t status) /* INET socket */ if (host && host[0] && !is_absolute_path(host)) { - strncpy(buf, host, MAX_PROMPT_SIZE); + strlcpy(buf, host, sizeof(buf)); if (*p == 'm') buf[strcspn(buf, ".")] = '\0'; } @@ -143,9 +143,9 @@ get_prompt(promptStatus_t status) if (!host || strcmp(host, DEFAULT_PGSOCKET_DIR) == 0 || *p == 'm') - strncpy(buf, "[local]", MAX_PROMPT_SIZE); + strlcpy(buf, "[local]", sizeof(buf)); else - snprintf(buf, MAX_PROMPT_SIZE, "[local:%s]", host); + snprintf(buf, sizeof(buf), "[local:%s]", host); } #endif } @@ -153,12 +153,12 @@ get_prompt(promptStatus_t status) /* DB server port number */ case '>': if (pset.db && PQport(pset.db)) - strncpy(buf, PQport(pset.db), MAX_PROMPT_SIZE); + strlcpy(buf, PQport(pset.db), sizeof(buf)); break; /* DB server user name */ case 'n': if (pset.db) - strncpy(buf, session_username(), MAX_PROMPT_SIZE); + strlcpy(buf, session_username(), sizeof(buf)); break; case '0': @@ -252,7 +252,7 @@ get_prompt(promptStatus_t status) fd = popen(file, "r"); if (fd) { - fgets(buf, MAX_PROMPT_SIZE - 1, fd); + fgets(buf, sizeof(buf), fd); pclose(fd); } if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') @@ -274,7 +274,7 @@ get_prompt(promptStatus_t status) name[nameend] = '\0'; val = GetVariable(pset.vars, name); if (val) - strncpy(buf, val, MAX_PROMPT_SIZE); + strlcpy(buf, val, sizeof(buf)); free(name); p += nameend + 1; break; @@ -312,9 +312,8 @@ get_prompt(promptStatus_t status) } if (!esc) - strncat(destination, buf, MAX_PROMPT_SIZE - strlen(destination)); + strlcat(destination, buf, sizeof(destination)); } - destination[MAX_PROMPT_SIZE] = '\0'; return destination; } diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index cc0c6613c4..891bf3f9ac 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.341 2007/01/05 22:20:00 momjian Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.342 2007/02/08 11:10:27 petere Exp $ * *------------------------------------------------------------------------- */ @@ -2845,11 +2845,11 @@ parseServiceInfo(PQconninfoOption *options, PQExpBuffer errorMessage) return 1; } - while ((line = fgets(buf, MAXBUFSIZE - 1, f)) != NULL) + while ((line = fgets(buf, sizeof(buf), f)) != NULL) { linenr++; - if (strlen(line) >= MAXBUFSIZE - 2) + if (strlen(line) >= sizeof(buf) - 1) { fclose(f); printfPQExpBuffer(errorMessage, @@ -3654,7 +3654,7 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) *ret; int len; - fgets(buf, LINELEN - 1, fp); + fgets(buf, sizeof(buf), fp); len = strlen(buf); if (len == 0) diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index a471c0b11f..2d387b19d2 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.91 2007/01/26 17:45:41 neilc Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-secure.c,v 1.92 2007/02/08 11:10:27 petere Exp $ * * NOTES * [ Most of these notes are wrong/obsolete, but perhaps not all ] @@ -1018,8 +1018,7 @@ SSLerrmessage(void) errreason = ERR_reason_error_string(errcode); if (errreason != NULL) { - strncpy(errbuf, errreason, SSL_ERR_LEN - 1); - errbuf[SSL_ERR_LEN - 1] = '\0'; + strlcpy(errbuf, errreason, SSL_ERR_LEN); return errbuf; } snprintf(errbuf, SSL_ERR_LEN, libpq_gettext("SSL error code %lu"), errcode); diff --git a/src/tools/entab/entab.c b/src/tools/entab/entab.c index 62279122f8..7a87e0d5ab 100644 --- a/src/tools/entab/entab.c +++ b/src/tools/entab/entab.c @@ -2,7 +2,7 @@ ** entab.c - add tabs to a text file ** by Bruce Momjian (root@candle.pha.pa.us) ** -** $PostgreSQL: pgsql/src/tools/entab/entab.c,v 1.17 2007/02/01 19:10:30 momjian Exp $ +** $PostgreSQL: pgsql/src/tools/entab/entab.c,v 1.18 2007/02/08 11:10:27 petere Exp $ ** ** version 1.3 ** @@ -108,7 +108,7 @@ main(int argc, char **argv) escaped = FALSE; - while (fgets(in_line, BUFSIZ, in_file) != NULL) + while (fgets(in_line, sizeof(in_line), in_file) != NULL) { col_in_tab = 0; prv_spaces = 0;