Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vtJHL-00FpgA-0V for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 05:42:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vtJHG-006c2Y-3C for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Feb 2026 05:42:11 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vtJHG-006c2P-24 for pgsql-hackers@lists.postgresql.org; Fri, 20 Feb 2026 05:42:10 +0000 Received: from common.ash.relay.mailchannels.net ([23.83.222.38]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1vtJHC-00000000KiP-31qP for pgsql-hackers@postgresql.org; Fri, 20 Feb 2026 05:42:10 +0000 X-Sender-Id: hostingeremail|x-authuser|david@pgbackrest.org Received: from relay.mailchannels.net (localhost [127.0.0.1]) by relay.mailchannels.net (Postfix) with ESMTP id 8D378561A95 for ; Fri, 20 Feb 2026 05:42:03 +0000 (UTC) Received: from fr-int-smtpout27.hostinger.io (trex-green-8.trex.outbound.svc.cluster.local [100.101.111.62]) (Authenticated sender: hostingeremail) by relay.mailchannels.net (Postfix) with ESMTPA id B9E7456179C for ; Fri, 20 Feb 2026 05:42:02 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; d=mailchannels.net; s=arc-2022; cv=none; t=1771566123; b=EVAMllDqSfCzVMNK4nIGLV5PsmQVB6DeW1Amv8oAhxTYlLPqBkCqJmoqPnPl+cOWD1l2ON hZZPi0qDAuFkfZ/jzpZrAr+9Ykuuw861A2JzecXPBxJBAZARhA8o9FqfUwBu8s9tR86lQz rlsWhYZhlQ7vjvM551RfR7nTDtqS5QYXZWcRBMXsT3UxnmfpfDsUdJOKWNqFxrnu3ktieR jjJ0lIYAszRQk1c1kdVsfcecDU23cyJFQ6VQRD2FLWSVSZd6+RAcWAfMuDTkBp6EaHd8bJ /QgFpqP51qd7UrzsG6/lnr01Xt+72bbWQg3hrmVXx/Zr18UO8poombp71RM+/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=mailchannels.net; s=arc-2022; t=1771566123; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: dkim-signature; bh=Cjj63w5M7QaDPs7901ZhV2M8TOqmCpdLRMZ7rbp9NKY=; b=X7zHKxc9i6wvtFQYtMd6Ahnhq3lHxSIR44iXM4JuCvIo921sno7Do3iJek5MHyyU2PB3N8 9CjwX2spq4hAcbzdunQK0ElfeMXVM0lnuz/qYtPa5ZWy7Cxsjl9iih43zx7VDq7rQqX5l4 4p/YW5M/n5x+W3SNg30GAIlKxS5hpDVkBat7fnUclgjDjMGHerL8E/UjClMdkyfxXfJp0y S4pt79zShxt13O3pO2VQbMUnU8KI6CbEta2eVGx/uoEL+SI2AhYYyFw7NLcmxGy8+MMR83 pg3vs5/AE1BQHXIC5mOrzkX4VjYUR1AG/PB3/F03GYBr8Lb4TxBDjbjN0wUHWg== ARC-Authentication-Results: i=1; rspamd-84c84ff4fc-42wd6; auth=pass smtp.auth=hostingeremail smtp.mailfrom=david@pgbackrest.org X-Sender-Id: hostingeremail|x-authuser|david@pgbackrest.org X-MC-Relay: Neutral X-MailChannels-SenderId: hostingeremail|x-authuser|david@pgbackrest.org X-MailChannels-Auth-Id: hostingeremail X-Average-Bored: 1d2958267f6aae47_1771566123400_3901448220 X-MC-Loop-Signature: 1771566123400:999693484 X-MC-Ingress-Time: 1771566123400 Received: from fr-int-smtpout27.hostinger.io (fr-int-smtpout27.hostinger.io [148.222.54.8]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384) by 100.101.111.62 (trex/7.1.3); Fri, 20 Feb 2026 05:42:03 +0000 Received: from [10.5.0.2] (unknown [185.216.231.117]) (Authenticated sender: david@pgbackrest.org) by smtp.hostinger.com (smtp.hostinger.com) with ESMTPSA id 4fHJzD2Dj3z2yN6 for ; Fri, 20 Feb 2026 05:41:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pgbackrest.org; s=hostingermail1; t=1771566121; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type; bh=Cjj63w5M7QaDPs7901ZhV2M8TOqmCpdLRMZ7rbp9NKY=; b=BFqx31MI2PfYeRUTx6ShmO6lrgMZHfWLXoD0HJUmKWGpF37saXaqbLq/VKstSq+PkZ5kah e6bSVaIjSQilJUsqH8ekkStEyp6AXbPTr3ItHAZkTmCxIAURGKym2vK9DQE3K49/zsiemU AfhPDtDazIOxwA2lFNXMhbLmgL8cDdzGZ/+fMBSaNR8xLK1F1yCSavVxzSRiy6fy3luiPW AGYJ+oCTvdfPmUQCoSo+xJ3WETWNREo2QR12iRGzM5Fe+1NkpDR0iAM8i1cIMAxrHuiQSj n17DVSHNWebPAz5ZCtzapAeMsfSWkKTQZQtNmNEuzzwO2vptUNr3hg5qnXdS8g== Content-Type: multipart/mixed; boundary="------------kxlDD7cupeqYKVx2tGCnsq0U" Message-ID: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Pg Hackers From: David Steele Subject: Improve checks for GUC recovery_target_xid Date: Fri, 20 Feb 2026 05:41:59 +0000 (UTC) X-CM-Envelope: MS4xfEJoOqeQ0PGp49OTz4ET6fhTSX4kRlqY3nieIoPTk1stG4Ivf1nrdk7hJF+DAMPmfz+OEgvSrrh8vPtvpf0SRu7RcEvXG3pnvoB7epohze+0B9QsKpHx VWwE0F0jaQ66ZX+tnfQBsTtz3HTBRkc/ukvhfkZC6wZGFPcRwC8T76FMhYxMWLZ8FvUMeLp+TO47eMr11xUSqqHyMEm8QPVarho= X-CM-Analysis: v=2.4 cv=UN2PHzfy c=1 sm=1 tr=0 ts=6997f429 a=+Jx7PF/Ig9cTSiVk8psDuw==:117 a=+Jx7PF/Ig9cTSiVk8psDuw==:17 a=r77TgQKjGQsHNAKrUKIA:9 a=epTmVMiNAAAA:8 a=jixU_1hUAAAA:8 a=48T0UoIlOixVQjJTpjMA:9 a=QEXdDO2ut3YA:10 a=1wDIiH70AAAA:8 a=YVOxtBk8b2NG7jooXRQA:9 a=B2y7HmGcmWMA:10 a=q5YM_uMBw6irhRasv8ad:22 a=uCsh6WI2SJRHIg0NT2Eg:22 X-AuthUser: david@pgbackrest.org List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------kxlDD7cupeqYKVx2tGCnsq0U Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hackers, Currently check_recovery_target_xid() converts invalid values to 0. So, for example, the following configuration added to postgresql.conf followed by a startup: recovery_target_xid = 'bogus' recovery_target_xid = '1.1' recovery_target_xid = '0' ... does not generate an error but recovery does not complete. There are many values that can prevent recovery from completing but we should at least catch obvious misconfiguration by the user. The origin of the problem is that we do not perform a range check in the GUC value passed-in for recovery_target_xid. This commit improves the situation by using adding end checking to strtou64() and by providing stricter range checks. Some test cases are added for the cases of an incorrect or a lower-bound timeline value, checking the sanity of the reports based on the contents of the server logs. Also add a comment that truncation of the input value is expected since users will generally be using the output from pg_current_xact_id() (or similar) to set recovery_target_xid (just as our tests do). This patch was promised in [1] -- here at last! Regards, -David [1] https://www.postgresql.org/message-id/cf04b7c6-7774-4ffb-86f5-ca85462d5fd6%40pgbackrest.org --------------kxlDD7cupeqYKVx2tGCnsq0U Content-Type: text/plain; charset=UTF-8; name="recovery-target-xid-v1.patch" Content-Disposition: attachment; filename="recovery-target-xid-v1.patch" Content-Transfer-Encoding: base64 RnJvbSAwZjNjMzRhNWY5NTAzNTM1YjA0NmVhNTgyMWFlMDdhOWU0OGMxODVjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBEYXZpZCBTdGVlbGUgPGRhdmlkQHBnbWFzdGVycy5u ZXQ+CkRhdGU6IEZyaSwgMjAgRmViIDIwMjYgMDU6NDA6MjggKzAwMDAKU3ViamVjdDogSW1w cm92ZSBjaGVja3MgZm9yIEdVQyByZWNvdmVyeV90YXJnZXRfeGlkCgpDdXJyZW50bHkgY2hl Y2tfcmVjb3ZlcnlfdGFyZ2V0X3hpZCgpIGNvbnZlcnRzIGludmFsaWQgdmFsdWVzIHRvIDAu IFNvLApmb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIGFkZGVkIHRv IHBvc3RncmVzcWwuY29uZgpmb2xsb3dlZCBieSBhIHN0YXJ0dXA6CgpyZWNvdmVyeV90YXJn ZXRfeGlkID0gJ2JvZ3VzJwpyZWNvdmVyeV90YXJnZXRfeGlkID0gJzEuMScKcmVjb3Zlcnlf dGFyZ2V0X3hpZCA9ICcwJwoKLi4uIGRvZXMgbm90IGdlbmVyYXRlIGFuIGVycm9yIGJ1dCBy ZWNvdmVyeSBkb2VzIG5vdCBjb21wbGV0ZS4gVGhlcmUgYXJlCm1hbnkgdmFsdWVzIHRoYXQg Y2FuIHByZXZlbnQgcmVjb3ZlcnkgZnJvbSBjb21wbGV0aW5nIGJ1dCB3ZSBzaG91bGQgYXQK bGVhc3QgY2F0Y2ggb2J2aW91cyBtaXNjb25maWd1cmF0aW9uIGJ5IHRoZSB1c2VyLgoKVGhl IG9yaWdpbiBvZiB0aGUgcHJvYmxlbSBpcyB0aGF0IHdlIGRvIG5vdCBwZXJmb3JtIGEgcmFu Z2UgY2hlY2sgaW4gdGhlCkdVQyB2YWx1ZSBwYXNzZWQtaW4gZm9yIHJlY292ZXJ5X3Rhcmdl dF94aWQuIFRoaXMgY29tbWl0IGltcHJvdmVzIHRoZQpzaXR1YXRpb24gYnkgdXNpbmcgYWRk aW5nIGVuZCBjaGVja2luZyB0byBzdHJ0b3U2NCgpIGFuZCBieSBwcm92aWRpbmcKc3RyaWN0 ZXIgcmFuZ2UgY2hlY2tzLiBTb21lIHRlc3QgY2FzZXMgYXJlIGFkZGVkIGZvciB0aGUgY2Fz ZXMgb2YgYW4KaW5jb3JyZWN0IG9yIGEgbG93ZXItYm91bmQgdGltZWxpbmUgdmFsdWUsIGNo ZWNraW5nIHRoZSBzYW5pdHkgb2YgdGhlCnJlcG9ydHMgYmFzZWQgb24gdGhlIGNvbnRlbnRz IG9mIHRoZSBzZXJ2ZXIgbG9ncy4KCkFsc28gYWRkIGEgY29tbWVudCB0aGF0IHRydW5jYXRp b24gb2YgdGhlIGlucHV0IHZhbHVlIGlzIGV4cGVjdGVkIHNpbmNlCnVzZXJzIHdpbGwgZ2Vu ZXJhbGx5IGJlIHVzaW5nIHRoZSBvdXRwdXQgZnJvbSBwZ19jdXJyZW50X3hhY3RfaWQoKSAo b3IKc2ltaWxhcikgdG8gc2V0IHJlY292ZXJ5X3RhcmdldF94aWQgKGp1c3QgYXMgb3VyIHRl c3RzIGRvKS4KLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3Zlcnku YyAgIHwgMjIgKysrKysrKysrKystLQogc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wMDNfcmVjb3Zl cnlfdGFyZ2V0cy5wbCB8IDM0ICsrKysrKysrKysrKysrKysrKysrKwogMiBmaWxlcyBjaGFu Z2VkLCA1NCBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2dyZWNvdmVyeS5jIGIvc3JjL2JhY2tlbmQv YWNjZXNzL3RyYW5zYW0veGxvZ3JlY292ZXJ5LmMKaW5kZXggYzBjMjc0NGQ0NWIuLjU1NGE4 ZmNmZTU5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVj b3ZlcnkuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ncmVjb3Zlcnku YwpAQCAtNTEwNywxMSArNTEwNywyOSBAQCBjaGVja19yZWNvdmVyeV90YXJnZXRfeGlkKGNo YXIgKipuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNvdXJjZSkKIAl7CiAJCVRy YW5zYWN0aW9uSWQgeGlkOwogCQlUcmFuc2FjdGlvbklkICpteWV4dHJhOworCQljaGFyICAg ICAgICAgICplbmRwOwogCiAJCWVycm5vID0gMDsKLQkJeGlkID0gKFRyYW5zYWN0aW9uSWQp IHN0cnRvdTY0KCpuZXd2YWwsIE5VTEwsIDApOwotCQlpZiAoZXJybm8gPT0gRUlOVkFMIHx8 IGVycm5vID09IEVSQU5HRSkKKworCQkvKgorCQkgKiBUaGlzIGNhc3Qgd2lsbCByZW1vdmUg dGhlIGVwb2NoLCBpZiBhbnkKKwkJICovCisJCXhpZCA9IChUcmFuc2FjdGlvbklkKSBzdHJ0 b3U2NCgqbmV3dmFsLCAmZW5kcCwgMCk7CisKKwkJaWYgKCplbmRwICE9ICdcMCcgfHwgZXJy bm8gPT0gRUlOVkFMIHx8IGVycm5vID09IEVSQU5HRSkKKwkJeworCQkJR1VDX2NoZWNrX2Vy cmRldGFpbCgiXCIlc1wiIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLAorCQkJCQkJCQkicmVj b3ZlcnlfdGFyZ2V0X3hpZCIpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKHhp ZCA8IEZpcnN0Tm9ybWFsVHJhbnNhY3Rpb25JZCkKKwkJeworCQkJR1VDX2NoZWNrX2VycmRl dGFpbCgiXCIlc1wiIHdpdGhvdXQgZXBvY2ggbXVzdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwg dG8gJXUuIiwKKwkJCQkJCQkJInJlY292ZXJ5X3RhcmdldF94aWQiLAorCQkJCQkJCQlGaXJz dE5vcm1hbFRyYW5zYWN0aW9uSWQpOwogCQkJcmV0dXJuIGZhbHNlOworCQl9CiAKIAkJbXll eHRyYSA9IChUcmFuc2FjdGlvbklkICopIGd1Y19tYWxsb2MoTE9HLCBzaXplb2YoVHJhbnNh Y3Rpb25JZCkpOwogCQlpZiAoIW15ZXh0cmEpCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWNv dmVyeS90LzAwM19yZWNvdmVyeV90YXJnZXRzLnBsIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8w MDNfcmVjb3ZlcnlfdGFyZ2V0cy5wbAppbmRleCBlMGRmMWEyMzQyMy4uMWZmM2YzYzg2NzYg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlY292ZXJ5L3QvMDAzX3JlY292ZXJ5X3RhcmdldHMu cGwKKysrIGIvc3JjL3Rlc3QvcmVjb3ZlcnkvdC8wMDNfcmVjb3ZlcnlfdGFyZ2V0cy5wbApA QCAtMjQwLDQgKzI0MCwzOCBAQCBvayghJHJlcywgJ2ludmFsaWQgdGltZWxpbmUgdGFyZ2V0 ICh1cHBlciBib3VuZCBjaGVjayknKTsKICRsb2dfc3RhcnQgPQogICAkbm9kZV9zdGFuZGJ5 LT53YWl0X2Zvcl9sb2coIm11c3QgYmUgYmV0d2VlbiAxIGFuZCA0Mjk0OTY3Mjk1IiwgJGxv Z19zdGFydCk7CiAKKyMgSW52YWxpZCB4aWQgdGFyZ2V0Ciskbm9kZV9zdGFuZGJ5ID0gUG9z dGdyZVNRTDo6VGVzdDo6Q2x1c3Rlci0+bmV3KCdzdGFuZGJ5XzEwJyk7Ciskbm9kZV9zdGFu ZGJ5LT5pbml0X2Zyb21fYmFja3VwKCRub2RlX3ByaW1hcnksICdteV9iYWNrdXAnLAorCWhh c19yZXN0b3JpbmcgPT4gMSk7Ciskbm9kZV9zdGFuZGJ5LT5hcHBlbmRfY29uZigncG9zdGdy ZXNxbC5jb25mJywKKwkicmVjb3ZlcnlfdGFyZ2V0X3hpZCA9ICdib2d1cyciKTsKKworJHJl cyA9IHJ1bl9sb2coCisJWworCQkncGdfY3RsJywKKwkJJy0tcGdkYXRhJyA9PiAkbm9kZV9z dGFuZGJ5LT5kYXRhX2RpciwKKwkJJy0tbG9nJyA9PiAkbm9kZV9zdGFuZGJ5LT5sb2dmaWxl LAorCQknc3RhcnQnLAorCV0pOworb2soISRyZXMsICdpbnZhbGlkIHhpZCB0YXJnZXQgKGJv Z3VzIHZhbHVlKScpOworCiskbG9nX3N0YXJ0ID0gJG5vZGVfc3RhbmRieS0+d2FpdF9mb3Jf bG9nKCJpcyBub3QgYSB2YWxpZCBudW1iZXIiKTsKKworIyBUaW1lbGluZSB0YXJnZXQgb3V0 IG9mIG1pbiByYW5nZQorJG5vZGVfc3RhbmRieS0+YXBwZW5kX2NvbmYoJ3Bvc3RncmVzcWwu Y29uZicsCisJInJlY292ZXJ5X3RhcmdldF94aWQgPSAnMCciKTsKKworJHJlcyA9IHJ1bl9s b2coCisJWworCQkncGdfY3RsJywKKwkJJy0tcGdkYXRhJyA9PiAkbm9kZV9zdGFuZGJ5LT5k YXRhX2RpciwKKwkJJy0tbG9nJyA9PiAkbm9kZV9zdGFuZGJ5LT5sb2dmaWxlLAorCQknc3Rh cnQnLAorCV0pOworb2soISRyZXMsICdpbnZhbGlkIHhpZCB0YXJnZXQgKGxvd2VyIGJvdW5k IGNoZWNrKScpOworCiskbG9nX3N0YXJ0ID0gJG5vZGVfc3RhbmRieS0+d2FpdF9mb3JfbG9n KAorCSJ3aXRob3V0IGVwb2NoIG11c3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMiLCAk bG9nX3N0YXJ0KTsKKwogZG9uZV90ZXN0aW5nKCk7Ci0tIAoyLjM0LjEKCg== --------------kxlDD7cupeqYKVx2tGCnsq0U--