From: Peter Eisentraut Date: Thu, 8 Feb 2007 11:10:27 +0000 (+0000) Subject: Normalize fgets() calls to use sizeof() for calculating the buffer size X-Git-Tag: REL8_3_BETA1~1285 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=086c189456655846707d9a260a3919f4404ecd9e;p=thirdparty%2Fpostgresql.git 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. --- diff --git a/contrib/tsearch2/dict_syn.c b/contrib/tsearch2/dict_syn.c index 05cb1102502..1e3a71cee12 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 b9b7699594e..d8bb54aca31 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 b1a5a57b2f4..fa6731a3869 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 8216d979d81..72eedac2e43 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 024cf1cd9cb..d05c241c698 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 e655f46c349..eb205ecbc27 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 b7628e7a7f9..1df630ae6bb 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 cc0c6613c4a..891bf3f9ac7 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 a471c0b11fe..2d387b19d27 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 62279122f89..7a87e0d5abb 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;