diff --git a/contrib/pg_logicalinspect/expected/pg_logicalinspect.out b/contrib/pg_logicalinspect/expected/pg_logicalinspect.out index f1f0712bec2..f6c9b625d6b 100644 --- a/contrib/pg_logicalinspect/expected/pg_logicalinspect.out +++ b/contrib/pg_logicalinspect/expected/pg_logicalinspect.out @@ -4,6 +4,10 @@ CREATE EXTENSION pg_logicalinspect; -- =================================================================== SELECT pg_get_logical_snapshot_info('0-40796E18.foo'); ERROR: invalid snapshot file name "0-40796E18.foo" +SELECT pg_get_logical_snapshot_info('0--40796E18.snap'); +ERROR: invalid snapshot file name "0--40796E18.snap" +SELECT pg_get_logical_snapshot_info('-1--40796E18.snap'); +ERROR: invalid snapshot file name "-1--40796E18.snap" SELECT pg_get_logical_snapshot_info('0/40796E18.foo.snap'); ERROR: invalid snapshot file name "0/40796E18.foo.snap" SELECT pg_get_logical_snapshot_info('0/40796E18.snap'); @@ -18,6 +22,8 @@ SELECT pg_get_logical_snapshot_info(NULL); SELECT pg_get_logical_snapshot_info('../snapshots'); ERROR: invalid snapshot file name "../snapshots" +SELECT pg_get_logical_snapshot_info('../snapshots/0-40796E18.snap'); +ERROR: invalid snapshot file name "../snapshots/0-40796E18.snap" SELECT pg_get_logical_snapshot_meta('0-40796E18.foo'); ERROR: invalid snapshot file name "0-40796E18.foo" SELECT pg_get_logical_snapshot_meta('0-40796E18.foo.snap'); diff --git a/contrib/pg_logicalinspect/pg_logicalinspect.c b/contrib/pg_logicalinspect/pg_logicalinspect.c index 57bc622f06b..dea3d0d5d3c 100644 --- a/contrib/pg_logicalinspect/pg_logicalinspect.c +++ b/contrib/pg_logicalinspect/pg_logicalinspect.c @@ -52,38 +52,32 @@ get_snapbuild_state_desc(SnapBuildState state) * Extract the LSN from the given serialized snapshot file name. */ static XLogRecPtr -parse_snapshot_filename(const char *filename) +parse_snapshot_filename(char *filename) { uint32 hi; uint32 lo; XLogRecPtr lsn; - bool report_error = false; + char tmpfname[MAXPGPATH]; /* Extract the values to build the LSN */ - if (sscanf(filename, "%X-%X", &hi, &lo) != 2) - report_error = true; + if (sscanf(filename, "%X-%X.snap", &hi, &lo) != 2) + goto parse_error; - /* Ensure filename is %X-%X.snap */ - if (!report_error) - { - size_t buffer_size = strlen(filename) + 1; - char *buffer = palloc(buffer_size); - - snprintf(buffer, buffer_size, "%X-%X.snap", hi, lo); - - if (strcmp(buffer, filename) != 0) - report_error = true; - - pfree(buffer); - } - - if (report_error) - ereport(ERROR, - errmsg("invalid snapshot file name \"%s\"", filename)); + /* + * Bring back the LSN to the snapshot file format and compare + * it to the given name to see if the extracted LSN is sane. + */ + sprintf(tmpfname, "%X-%X.snap", hi, lo); + if (strcmp(tmpfname, filename) != 0) + goto parse_error; lsn = ((uint64) hi) << 32 | lo; return lsn; + +parse_error: + ereport(ERROR, + errmsg("invalid snapshot file name \"%s\"", filename)); } /* diff --git a/contrib/pg_logicalinspect/sql/pg_logicalinspect.sql b/contrib/pg_logicalinspect/sql/pg_logicalinspect.sql index 7d4951f30b0..143cf45dc12 100644 --- a/contrib/pg_logicalinspect/sql/pg_logicalinspect.sql +++ b/contrib/pg_logicalinspect/sql/pg_logicalinspect.sql @@ -5,11 +5,14 @@ CREATE EXTENSION pg_logicalinspect; -- =================================================================== SELECT pg_get_logical_snapshot_info('0-40796E18.foo'); +SELECT pg_get_logical_snapshot_info('0--40796E18.snap'); +SELECT pg_get_logical_snapshot_info('-1--40796E18.snap'); SELECT pg_get_logical_snapshot_info('0/40796E18.foo.snap'); SELECT pg_get_logical_snapshot_info('0/40796E18.snap'); SELECT pg_get_logical_snapshot_info(''); SELECT pg_get_logical_snapshot_info(NULL); SELECT pg_get_logical_snapshot_info('../snapshots'); +SELECT pg_get_logical_snapshot_info('../snapshots/0-40796E18.snap'); SELECT pg_get_logical_snapshot_meta('0-40796E18.foo'); SELECT pg_get_logical_snapshot_meta('0-40796E18.foo.snap');