diff --git a/src/bin/pg_probackup/backup.cpp b/src/bin/pg_probackup/backup.cpp index b4d79c57b0e8e79537b5a8f8f18f0de00ea8b46b..f3f2114f926334c59a94fbe59593f88617cb8dd8 100644 --- a/src/bin/pg_probackup/backup.cpp +++ b/src/bin/pg_probackup/backup.cpp @@ -1166,6 +1166,7 @@ pg_start_backup(const char *label, bool smooth, pgBackup *backup, securec_check_for_sscanf_s(ret, 2, "\0", "\0"); /* Calculate LSN */ startLsn = ((uint64) lsn_hi )<< 32 | lsn_lo; + PQclear(res); if (backup_replslots) { logical_replslot = parray_new(); @@ -1190,10 +1191,9 @@ pg_start_backup(const char *label, bool smooth, pgBackup *backup, elog(WARNING, "logical replication slots for subscriptions will be backed up. " "If don't use them after restoring, please drop them to avoid affecting xlog recycling."); } + PQclear(res); } backup->start_lsn = startLsn; - - PQclear(res); } @@ -1282,6 +1282,7 @@ get_database_map(PGconn *conn) parray_append(database_map, db_entry); } + PQclear(res); return database_map; } diff --git a/src/bin/pg_probackup/catalog.cpp b/src/bin/pg_probackup/catalog.cpp index 2d1f50a827aaa46c7891aa984e5be22696aa52d5..adfc05f0a3959e9845ccb15fd61544718fa97a62 100644 --- a/src/bin/pg_probackup/catalog.cpp +++ b/src/bin/pg_probackup/catalog.cpp @@ -2253,7 +2253,7 @@ readBackupControlFile(const char *path) { elog(WARNING, "Control file \"%s\" doesn't exist", path); pgBackupFree(backup); - return NULL; + goto finish; } parsed_options = config_read_opt(path, options, WARNING, true, true); @@ -2262,28 +2262,26 @@ readBackupControlFile(const char *path) { elog(WARNING, "Control file \"%s\" is empty", path); pgBackupFree(backup); - return NULL; + goto finish; } if (recovery_name) { - rc = snprintf_s(backup->recovery_name, lengthof(backup->recovery_name), - lengthof(backup->recovery_name) - 1, recovery_name); - securec_check_ss_c(rc, "\0", "\0"); - free(recovery_name); + rc = snprintf_s(backup->recovery_name, lengthof(backup->recovery_name), + lengthof(backup->recovery_name) - 1, recovery_name); + securec_check_ss_c(rc, "\0", "\0"); } if (backup->start_time == 0) { elog(WARNING, "Invalid ID/start-time, control file \"%s\" is corrupted", path); pgBackupFree(backup); - return NULL; + goto finish; } if (backup_mode) { backup->backup_mode = parse_backup_mode(backup_mode); - free(backup_mode); } if (start_lsn) @@ -2295,7 +2293,6 @@ readBackupControlFile(const char *path) backup->start_lsn = (XLogRecPtr) ((uint64) xlogid << 32) | xrecoff; else elog(WARNING, "Invalid START_LSN \"%s\"", start_lsn); - free(start_lsn); } if (stop_lsn) @@ -2307,7 +2304,6 @@ readBackupControlFile(const char *path) backup->stop_lsn = (XLogRecPtr) ((uint64) xlogid << 32) | xrecoff; else elog(WARNING, "Invalid STOP_LSN \"%s\"", stop_lsn); - free(stop_lsn); } set_backup_status(status, backup); @@ -2315,13 +2311,11 @@ readBackupControlFile(const char *path) if (parent_backup) { backup->parent_backup = base36dec(parent_backup); - free(parent_backup); } if (merge_dest_backup) { backup->merge_dest_backup = base36dec(merge_dest_backup); - free(merge_dest_backup); } if (program_version) @@ -2329,7 +2323,6 @@ readBackupControlFile(const char *path) rc = strncpy_s(backup->program_version, sizeof(backup->program_version),program_version, sizeof(backup->program_version) - 1); securec_check_c(rc, "", ""); - pfree(program_version); } if (server_version) @@ -2337,14 +2330,30 @@ readBackupControlFile(const char *path) rc = strncpy_s(backup->server_version, sizeof(backup->server_version),server_version, sizeof(backup->server_version) - 1); securec_check_c(rc, "", ""); - pfree(server_version); } if (compress_alg) + { backup->compress_alg = parse_compress_alg(compress_alg); + } if (storage_type) + { backup->storage_type = str2dev(storage_type); + } + +finish: + pg_free(backup_mode); + pg_free(start_lsn); + pg_free(stop_lsn); + pg_free(status); + pg_free(parent_backup); + pg_free(merge_dest_backup); + pg_free(program_version); + pg_free(server_version); + pg_free(compress_alg); + pg_free(recovery_name); + pg_free(storage_type); return backup; } diff --git a/src/bin/pg_probackup/dir.cpp b/src/bin/pg_probackup/dir.cpp index 95d500f7ba60b44b5e1d95e1f9ab23d84bfcea2d..2207b64d67c8ac48c1976a9d1e9c392774c34059 100644 --- a/src/bin/pg_probackup/dir.cpp +++ b/src/bin/pg_probackup/dir.cpp @@ -411,7 +411,12 @@ pgFileFree(void *file) file_ptr = (pgFile *) file; pfree(file_ptr->linked); - pfree(file_ptr->rel_path); + + if (file_ptr->rel_path != NULL) { + pfree(file_ptr->rel_path); + } else if (file_ptr->name != NULL) { + pfree(file_ptr->name); + } pfree(file); }