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.94.2) (envelope-from ) id 1tAFUt-00EZHY-Bd for pgsql-hackers@arkaria.postgresql.org; Sun, 10 Nov 2024 21:29:27 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tAFTr-009Ait-BF for pgsql-hackers@arkaria.postgresql.org; Sun, 10 Nov 2024 21:28:23 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tAFTp-009Aic-SI for pgsql-hackers@lists.postgresql.org; Sun, 10 Nov 2024 21:28:23 +0000 Received: from fhigh-a3-smtp.messagingengine.com ([103.168.172.154]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tAFTm-001Bhm-QU for pgsql-hackers@lists.postgresql.org; Sun, 10 Nov 2024 21:28:20 +0000 Received: from phl-compute-11.internal (phl-compute-11.phl.internal [10.202.2.51]) by mailfhigh.phl.internal (Postfix) with ESMTP id 9A0B311400EC for ; Sun, 10 Nov 2024 16:28:17 -0500 (EST) Received: from phl-imap-02 ([10.202.2.81]) by phl-compute-11.internal (MEProxy); Sun, 10 Nov 2024 16:28:17 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:content-type:content-type:date:date:from:from:in-reply-to :message-id:mime-version:reply-to:subject:subject:to:to; s=fm3; t=1731274097; x=1731360497; bh=S1/DtrU/Y7pHuHARmOZjifqOs3AaP9Vk R45EoGUUqdM=; b=Ru85ieJEctXUWaR6hOtgbPX0sYPyEM9zNp3w9U1CYbhn6wr7 gM3ia79sUjJpnXijXuhtepSUnGZW/o3yi3yzpjFBt91mJglBL6tzdPFSWvCqPtgl yMRDHyvF9BJxc16grYNyW7oOVRxYymT2U4eIr/jSlovjoO3d0Rk4AwXhInraLc2C SImae81LvAa4vQ1VAM8auPTQuKugCDjhtkCiNclX3g1n1Dv20Hp8UNoctn8TS7uO 746p3Ehrw5v/YYDiToOwPrWBEdbhEDJSp3lBP4OBAKJMln8mEObYy0M8cQlqJy6i Rlp+Pt8Zqo9cFuJbn/brQbUdujB5XKuLq9xP7Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1731274097; x= 1731360497; bh=S1/DtrU/Y7pHuHARmOZjifqOs3AaP9VkR45EoGUUqdM=; b=n cLKLVq0ZGgpPuuH105DbaNbM0AAhqFdy1JnOTVP8tFkNk2PAhy2dYFmr9Awa3/uP BpAN7OBZQuEAzkkIxrmJKu8pNDCq7ithIGpLJcHpYHnNVJ1ynpvHJdjY7vditKoD 1Vbwgr/FiO3iBYKyG8i5pG6UpfYaKweTWlqHqmoivFbmIQN8RxfVAHobgHqGPKIr mscrUYzC8V9kp9BIR6Yii7+TzhAuLXM8w04+yv9oVWgmztCt+8p1gHXuY3+J8gOD ZlNVTmg2QEeOAhtgWcqIgwUWHizfXAkesrquTy33KA7OUglG/CtijOGVGIbR90c5 Lp/Gbmj9JEgsL9XSVHB0A== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddruddtgddugeejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggvpdfu rfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucenucfjughrpefoggffhf fvkffutgesmhdtreerredttdenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcu oehjohgvlhestghomhhpihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpedujefffe ekhffhudffvdetvdetkeetleekgfekleeijedutdehieehudduieeufeenucevlhhushht vghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehjohgvlhestghomhhpih hlvghrrdhorhhgpdhnsggprhgtphhtthhopedupdhmohguvgepshhmthhpohhuthdprhgt phhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlh drohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id 0F6FBB00068; Sun, 10 Nov 2024 16:28:17 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 Date: Sun, 10 Nov 2024 22:26:20 +0100 From: "Joel Jacobson" To: pgsql-hackers@lists.postgresql.org Message-Id: <5eabc9e4-509c-4f83-92c8-36d298cf930f@app.fastmail.com> Subject: [BUG] psql: Make \copy from 'text' and 'csv' formats fail on NUL bytes Content-Type: multipart/mixed; boundary=1b8e9d2340e44b4ab63e7b25b237d35d List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --1b8e9d2340e44b4ab63e7b25b237d35d Content-Type: text/plain Content-Transfer-Encoding: 7bit Hi hackers, When using \copy from in psql to import files containing NUL bytes (\0) in 'text' or 'csv' format, the NUL bytes were not detected and did not result in an error, leading to silent data corruption. This behavior is inconsistent with server-side COPY FROM, which reports an error upon encountering NUL bytes in the 'text' and 'csv' formats. Fix by adjusting handleCopyIn() to use the binary code path also when the copy source is a file (i.e., copystream != pset.cur_cmd_source), even in textual copies. This ensures that NUL bytes are detected and reported in the same way as server-side COPY. Example: % printf 'test_col\nfoo\n\x00\nbar\nbaz\x00aar\nbizarre\n' > nul_bytes.data % cat -v nul_bytes.data test_col foo ^@ bar baz^@aar bizarre % psql create table nul_bytes_test (test_col text); -- -- HEAD -- \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format csv, header match); COPY 3 select * from nul_bytes_test; test_col ------------ foo bar bazbizarre (3 rows) \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format text, header match); select * from nul_bytes_test; test_col ------------ foo bar bazbizarre (3 rows) -- -- 0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.patch -- \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format csv, header match); ERROR: invalid byte sequence for encoding "UTF8": 0x00 CONTEXT: COPY nul_bytes_test, line 3 \copy nul_bytes_test (test_col) from 'nul_bytes.data' (format text, header match); ERROR: invalid byte sequence for encoding "UTF8": 0x00 CONTEXT: COPY nul_bytes_test, line 3 /Joel --1b8e9d2340e44b4ab63e7b25b237d35d Content-Disposition: attachment; filename*0="0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.pat"; filename*1="ch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-psql-Make-copy-from-text-and-csv-formats-fail-on-NUL.patc?= =?UTF-8?Q?h?=" Content-Transfer-Encoding: base64 RnJvbSBiNjgyNGZhZjAzZDRkNGJkYjkwOWIzMzIzMGZhYjAwMTFjYmNmYzY5IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAxMCBOb3YgMjAyNCAyMjoxODo0OCArMDEwMApTdWJqZWN0OiBbUEFU Q0hdIHBzcWw6IE1ha2UgXGNvcHkgZnJvbSAndGV4dCcgYW5kICdjc3YnIGZvcm1hdHMgZmFp bCBvbiBOVUwKIGJ5dGVzCgpXaGVuIHVzaW5nIFxjb3B5IGZyb20gaW4gcHNxbCB0byBpbXBv cnQgZmlsZXMgY29udGFpbmluZyBOVUwgYnl0ZXMgKFwwKSBpbgondGV4dCcgb3IgJ2Nzdicg Zm9ybWF0LCB0aGUgTlVMIGJ5dGVzIHdlcmUgbm90IGRldGVjdGVkIGFuZCBkaWQgbm90IHJl c3VsdCBpbgphbiBlcnJvciwgbGVhZGluZyB0byBzaWxlbnQgZGF0YSBjb3JydXB0aW9uLgoK VGhpcyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQgd2l0aCBzZXJ2ZXItc2lkZSBDT1BZIEZS T00sIHdoaWNoIHJlcG9ydHMgYW4gZXJyb3IKdXBvbiBlbmNvdW50ZXJpbmcgTlVMIGJ5dGVz IGluIHRoZSAndGV4dCcgYW5kICdjc3YnIGZvcm1hdHMuCgpGaXggYnkgYWRqdXN0aW5nIGhh bmRsZUNvcHlJbigpIHRvIHVzZSB0aGUgYmluYXJ5IGNvZGUgcGF0aCBhbHNvIHdoZW4gdGhl IGNvcHkKc291cmNlIGlzIGEgZmlsZSAoaS5lLiwgY29weXN0cmVhbSAhPSBwc2V0LmN1cl9j bWRfc291cmNlKSwgZXZlbiBpbiB0ZXh0dWFsCmNvcGllcy4gVGhpcyBlbnN1cmVzIHRoYXQg TlVMIGJ5dGVzIGFyZSBkZXRlY3RlZCBhbmQgcmVwb3J0ZWQgaW4gdGhlIHNhbWUgd2F5CmFz IHNlcnZlci1zaWRlIENPUFkuCi0tLQogc3JjL2Jpbi9wc3FsL2NvcHkuYyB8IDIgKy0KIDEg ZmlsZSBjaGFuZ2VkLCAxIGluc2VydGlvbigrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdp dCBhL3NyYy9iaW4vcHNxbC9jb3B5LmMgYi9zcmMvYmluL3BzcWwvY29weS5jCmluZGV4IGUw MjBlNGQ2NjVkLi4zMDZmNTE2MWUxZCAxMDA2NDQKLS0tIGEvc3JjL2Jpbi9wc3FsL2NvcHku YworKysgYi9zcmMvYmluL3BzcWwvY29weS5jCkBAIC01NDQsNyArNTQ0LDcgQEAgaGFuZGxl Q29weUluKFBHY29ubiAqY29ubiwgRklMRSAqY29weXN0cmVhbSwgYm9vbCBpc2JpbmFyeSwg UEdyZXN1bHQgKipyZXMpCiAKIAlPSyA9IHRydWU7CiAKLQlpZiAoaXNiaW5hcnkpCisJaWYg KGlzYmluYXJ5IHx8IGNvcHlzdHJlYW0gIT0gcHNldC5jdXJfY21kX3NvdXJjZSkKIAl7CiAJ CS8qIGludGVyYWN0aXZlIGlucHV0IHByb2JhYmx5IHNpbGx5LCBidXQgZ2l2ZSBvbmUgcHJv bXB0IGFueXdheSAqLwogCQlpZiAoc2hvd3Byb21wdCkKLS0gCjIuNDUuMQoK --1b8e9d2340e44b4ab63e7b25b237d35d--