From 9c5327b99be079f9052efaee210f7e517bc48219 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 27 Nov 2000 02:20:36 +0000 Subject: [PATCH] Pay attention to failure returns from fgets() in all cases. Avoid infinite loop prompting for password at stdin EOF. --- src/bin/psql/command.c | 7 ++++--- src/bin/psql/common.c | 14 ++++++++------ src/bin/psql/input.c | 4 ++-- src/bin/psql/prompt.c | 4 ++-- src/bin/psql/startup.c | 5 +++-- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index b17d37b674..782c161c23 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.40 2000/11/26 11:09:32 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/command.c,v 1.41 2000/11/27 02:20:36 tgl Exp $ */ #include "postgres.h" #include "command.h" @@ -1236,7 +1236,8 @@ do_connect(const char *new_dbname, const char *new_user) NULL, NULL, dbparam, userparam, pwparam); if (PQstatus(pset.db) == CONNECTION_BAD && - strcmp(PQerrorMessage(pset.db), "fe_sendauth: no password supplied\n") == 0) + strcmp(PQerrorMessage(pset.db), "fe_sendauth: no password supplied\n") == 0 && + !feof(stdin)) { PQfinish(pset.db); need_pass = true; @@ -1491,7 +1492,7 @@ do_edit(const char *filename_arg, PQExpBuffer query_buf) char line[1024]; resetPQExpBuffer(query_buf); - while (fgets(line, 1024, stream)) + while (fgets(line, sizeof(line), stream) != NULL) appendPQExpBufferStr(query_buf, line); if (ferror(stream)) diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c index 66eeb0ef6b..05b11651e9 100644 --- a/src/bin/psql/common.c +++ b/src/bin/psql/common.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.26 2000/11/27 01:28:40 tgl Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/common.c,v 1.27 2000/11/27 02:20:36 tgl Exp $ */ #include "postgres.h" #include "common.h" @@ -201,7 +201,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo) } #endif - fgets(destination, maxlen, stdin); + if (fgets(destination, maxlen, stdin) == NULL) + destination[0] = '\0'; #ifdef HAVE_TERMIOS_H if (!echo) @@ -222,7 +223,8 @@ simple_prompt(const char *prompt, int maxlen, bool echo) do { - fgets(buf, sizeof(buf), stdin); + if (fgets(buf, sizeof(buf), stdin) == NULL) + break; buflen = strlen(buf); } while (buflen > 0 && buf[buflen - 1] != '\n'); } @@ -389,9 +391,9 @@ SendQuery(const char *query) "***(press return to proceed or enter x and return to cancel)********************\n", query); fflush(stdout); - fgets(buf, 3, stdin); - if (buf[0] == 'x') - return false; + if (fgets(buf, sizeof(buf), stdin) != NULL) + if (buf[0] == 'x') + return false; } else { diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c index 86200ad052..78e2ae3568 100644 --- a/src/bin/psql/input.c +++ b/src/bin/psql/input.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.13 2000/04/12 17:16:22 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/input.c,v 1.14 2000/11/27 02:20:36 tgl Exp $ */ #include "postgres.h" #include "input.h" @@ -91,7 +91,7 @@ gets_fromFile(FILE *source) initPQExpBuffer(&buffer); - while (fgets(line, 1024, source) != NULL) + while (fgets(line, sizeof(line), source) != NULL) { appendPQExpBufferStr(&buffer, line); if (buffer.data[buffer.len - 1] == '\n') diff --git a/src/bin/psql/prompt.c b/src/bin/psql/prompt.c index 4788c2ce12..7927a9caa2 100644 --- a/src/bin/psql/prompt.c +++ b/src/bin/psql/prompt.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.15 2000/11/13 23:37:53 momjian Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/prompt.c,v 1.16 2000/11/27 02:20:36 tgl Exp $ */ #include "postgres.h" #include "prompt.h" @@ -277,7 +277,7 @@ get_prompt(promptStatus_t status) fgets(buf, MAX_PROMPT_SIZE - 1, fd); pclose(fd); } - if (buf[strlen(buf) - 1] == '\n') + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') buf[strlen(buf) - 1] = '\0'; free(file); p += cmdend + 1; diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c index 1a66d5fce3..e551347371 100644 --- a/src/bin/psql/startup.c +++ b/src/bin/psql/startup.c @@ -3,7 +3,7 @@ * * Copyright 2000 by PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.40 2000/11/25 19:05:44 petere Exp $ + * $Header: /cvsroot/pgsql/src/bin/psql/startup.c,v 1.41 2000/11/27 02:20:36 tgl Exp $ */ #include "postgres.h" @@ -180,7 +180,8 @@ main(int argc, char *argv[]) username, password); if (PQstatus(pset.db) == CONNECTION_BAD && - strcmp(PQerrorMessage(pset.db), "fe_sendauth: no password supplied\n") == 0) + strcmp(PQerrorMessage(pset.db), "fe_sendauth: no password supplied\n") == 0 && + !feof(stdin)) { PQfinish(pset.db); need_pass = true;