aboutsummaryrefslogtreecommitdiff
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
commit5fc7b1e939c432439f7c74885b7d053e5c1cab6f (patch)
treea02074628d2eea903baa8a54a4375c3232986d0d
parentee18293a4e722e7681e264dfeab9f0af24d4adb1 (diff)
downloadpostgresql-5fc7b1e939c432439f7c74885b7d053e5c1cab6f.tar.gz
postgresql-5fc7b1e939c432439f7c74885b7d053e5c1cab6f.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
-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 be57574cd32..d688a5d7d6c 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -634,15 +634,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:
{