Skip to content

Commit f1899f2

Browse files
committed
pg_amcheck: Fix block number parsing on command line
The previous code wouldn't handle higher block numbers on systems where sizeof(long) == 4. Reviewed-by: Mark Dilger <mark.dilger@enterprisedb.com> Discussion: https://www.postgresql.org/message-id/flat/6a10a211-872b-3c4c-106b-909ae5fefa61%40enterprisedb.com
1 parent 8d2d6ec commit f1899f2

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

src/bin/pg_amcheck/pg_amcheck.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ main(int argc, char *argv[])
298298
long_options, &optindex)) != -1)
299299
{
300300
char *endptr;
301+
unsigned long optval;
301302

302303
switch (c)
303304
{
@@ -407,30 +408,34 @@ main(int argc, char *argv[])
407408
}
408409
break;
409410
case 7:
410-
opts.startblock = strtol(optarg, &endptr, 10);
411-
if (*endptr != '\0')
411+
errno = 0;
412+
optval = strtoul(optarg, &endptr, 10);
413+
if (endptr == optarg || *endptr != '\0' || errno != 0)
412414
{
413415
pg_log_error("invalid start block");
414416
exit(1);
415417
}
416-
if (opts.startblock > MaxBlockNumber || opts.startblock < 0)
418+
if (optval > MaxBlockNumber)
417419
{
418420
pg_log_error("start block out of bounds");
419421
exit(1);
420422
}
423+
opts.startblock = optval;
421424
break;
422425
case 8:
423-
opts.endblock = strtol(optarg, &endptr, 10);
424-
if (*endptr != '\0')
426+
errno = 0;
427+
optval = strtoul(optarg, &endptr, 10);
428+
if (endptr == optarg || *endptr != '\0' || errno != 0)
425429
{
426430
pg_log_error("invalid end block");
427431
exit(1);
428432
}
429-
if (opts.endblock > MaxBlockNumber || opts.endblock < 0)
433+
if (optval > MaxBlockNumber)
430434
{
431435
pg_log_error("end block out of bounds");
432436
exit(1);
433437
}
438+
opts.endblock = optval;
434439
break;
435440
case 9:
436441
opts.rootdescend = true;

0 commit comments

Comments
 (0)