aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2019-08-25 15:04:04 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2019-08-25 15:04:04 -0400
commit6338fa3e715ad1cb12e0760bf73ffc2a906098ea (patch)
tree65f73fa82cc34c2175cc9c658b58f71948725b7e /src
parentfaee5a12ecf13190d7ca11d6dcc7078e494f46ca (diff)
downloadpostgresql-6338fa3e715ad1cb12e0760bf73ffc2a906098ea.tar.gz
postgresql-6338fa3e715ad1cb12e0760bf73ffc2a906098ea.zip
Avoid platform-specific null pointer dereference in psql.
POSIX permits getopt() to advance optind beyond argc when the last argv entry is an option that requires an argument and hasn't got one. It seems that no major platforms actually do that, but musl does, so that something like "psql -f" would crash with that libc. Add a check that optind is in range before trying to look at the possibly-bogus option. Report and fix by Quentin Rameau. Back-patch to all supported branches. Discussion: https://postgr.es/m/20190825100617.GA6087@fifth.space
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/startup.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index 4730c733962..e4c0a7eacbf 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -666,15 +666,18 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts *options)
options->single_txn = true;
break;
case '?':
- /* Actual help option given */
- if (strcmp(argv[optind - 1], "-?") == 0)
+ if (optind <= argc &&
+ strcmp(argv[optind - 1], "-?") == 0)
{
+ /* actual help option given */
usage(NOPAGER);
exit(EXIT_SUCCESS);
}
- /* unknown option reported by getopt */
else
+ {
+ /* getopt error (unknown option or missing argument) */
goto unknown_option;
+ }
break;
case 1:
{