Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita146e7b

Browse files
committed
Don't override arguments set via options with positional arguments.
A number of utility programs were rather careless about paremetersthat can be set via both an option argument and a positionalargument. This leads to results which can violate the PrincipalOf Least Astonishment. These changes refuse to use positionalarguments to override settings that have been made via positionalarguments. The changes are backpatched to all live branches.
1 parent10fcfad commita146e7b

File tree

6 files changed

+75
-38
lines changed

6 files changed

+75
-38
lines changed

‎src/bin/initdb/initdb.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2644,8 +2644,11 @@ main(int argc, char *argv[])
26442644
}
26452645

26462646

2647-
/* Non-option argument specifies data directory */
2648-
if (optind<argc)
2647+
/*
2648+
* Non-option argument specifies data directory
2649+
* as long as it wasn't already specified with -D / --pgdata
2650+
*/
2651+
if (optind<argc&&strlen(pg_data)==0)
26492652
{
26502653
pg_data=xstrdup(argv[optind]);
26512654
optind++;

‎src/bin/scripts/clusterdb.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,18 +106,22 @@ main(int argc, char *argv[])
106106
}
107107
}
108108

109-
switch (argc-optind)
109+
/*
110+
* Non-option argument specifies database name
111+
* as long as it wasn't already specified with -d / --dbname
112+
*/
113+
if (optind<argc&&dbname==NULL)
110114
{
111-
case0:
112-
break;
113-
case1:
114-
dbname=argv[optind];
115-
break;
116-
default:
117-
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),
118-
progname,argv[optind+1]);
119-
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
120-
exit(1);
115+
dbname=argv[optind];
116+
optind++;
117+
}
118+
119+
if (optind<argc)
120+
{
121+
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),
122+
progname,argv[optind+1]);
123+
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
124+
exit(1);
121125
}
122126

123127
setup_cancel_handler();

‎src/bin/scripts/createlang.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,24 @@ main(int argc, char *argv[])
9191
}
9292
}
9393

94+
/*
95+
* We set dbname from positional arguments if it is not
96+
* already set by option arguments -d. If not doing
97+
* listlangs, positional dbname must follow positional
98+
* langname.
99+
*/
100+
94101
if (argc-optind>0)
95102
{
96103
if (listlangs)
97-
dbname=argv[optind++];
104+
{
105+
if (dbname==NULL)
106+
dbname=argv[optind++];
107+
}
98108
else
99109
{
100110
langname=argv[optind++];
101-
if (argc-optind>0)
111+
if (argc-optind>0&&dbname==NULL)
102112
dbname=argv[optind++];
103113
}
104114
}

‎src/bin/scripts/droplang.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,24 @@ main(int argc, char *argv[])
9090
}
9191
}
9292

93+
/*
94+
* We set dbname from positional arguments if it is not
95+
* already set by option arguments -d. If not doing
96+
* listlangs, positional dbname must follow positional
97+
* langname.
98+
*/
99+
93100
if (argc-optind>0)
94101
{
95102
if (listlangs)
96-
dbname=argv[optind++];
103+
{
104+
if (dbname==NULL)
105+
dbname=argv[optind++];
106+
}
97107
else
98108
{
99109
langname=argv[optind++];
100-
if (argc-optind>0)
110+
if (argc-optind>0&&dbname==NULL)
101111
dbname=argv[optind++];
102112
}
103113
}

‎src/bin/scripts/reindexdb.c

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,22 @@ main(int argc, char *argv[])
116116
}
117117
}
118118

119-
switch (argc-optind)
119+
/*
120+
* Non-option argument specifies database name
121+
* as long as it wasn't already specified with -d / --dbname
122+
*/
123+
if (optind<argc&&dbname==NULL)
120124
{
121-
case0:
122-
break;
123-
case1:
124-
dbname=argv[optind];
125-
break;
126-
default:
127-
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),progname,argv[optind+1]);
128-
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
129-
exit(1);
125+
dbname=argv[optind];
126+
optind++;
127+
}
128+
129+
if (optind<argc)
130+
{
131+
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),
132+
progname,argv[optind+1]);
133+
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
134+
exit(1);
130135
}
131136

132137
setup_cancel_handler();

‎src/bin/scripts/vacuumdb.c

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -129,18 +129,23 @@ main(int argc, char *argv[])
129129
}
130130
}
131131

132-
switch (argc-optind)
132+
133+
/*
134+
* Non-option argument specifies database name
135+
* as long as it wasn't already specified with -d / --dbname
136+
*/
137+
if (optind<argc&&dbname==NULL)
133138
{
134-
case0:
135-
break;
136-
case1:
137-
dbname=argv[optind];
138-
break;
139-
default:
140-
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),
141-
progname,argv[optind+1]);
142-
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
143-
exit(1);
139+
dbname=argv[optind];
140+
optind++;
141+
}
142+
143+
if (optind<argc)
144+
{
145+
fprintf(stderr,_("%s: too many command-line arguments (first is \"%s\")\n"),
146+
progname,argv[optind+1]);
147+
fprintf(stderr,_("Try \"%s --help\" for more information.\n"),progname);
148+
exit(1);
144149
}
145150

146151
if (analyze_only)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp