Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q6C76-0004zm-61 for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Jun 2023 15:27:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1q6C74-0007Tv-Ve for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Jun 2023 15:27:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1q6C74-0007Ta-K9 for pgsql-hackers@lists.postgresql.org; Mon, 05 Jun 2023 15:27:18 +0000 Received: from mail-oi1-x22a.google.com ([2607:f8b0:4864:20::22a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1q6C70-000Op4-KM for pgsql-hackers@postgresql.org; Mon, 05 Jun 2023 15:27:17 +0000 Received: by mail-oi1-x22a.google.com with SMTP id 5614622812f47-38c35975545so4374876b6e.1 for ; Mon, 05 Jun 2023 08:27:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=datadoghq.com; s=google; t=1685978832; x=1688570832; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=WV+c6KSjP9/2+0ufkD+cBBL3DzBQWFxVy6CeXQMqs4Y=; b=NrDndXcxsUK3SGKFbU+73pqEAILxVS/pIytDNvfWr6GXrMyxy4WALy5Gz8SB+lb5aq s3+9bQzbKTqCtJpE+5skHpA7t06WdVtaFRxKUySilTxsx/d+/SGM6MBBqra7CwSl3tGx 5gj6t52MzvWSmsJLvtZkRy6TVJqlDIwAkldvs= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685978832; x=1688570832; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=WV+c6KSjP9/2+0ufkD+cBBL3DzBQWFxVy6CeXQMqs4Y=; b=iNbPZRiOBKaqG2DpmQC92IHZE3EiANh0uzSnOtt2BJjPE7+1y7tunSBHb+SxvtNfT+ D4vzAVUew+oiY1u+ZByPx3w4lAV4lSTVEcZ9nssUSAsXFNft8JHU0wHaqF+WSH08AXNY zbGuTXqhg3huQu/MKhESz1sFIe8y2/scKPuwXeJu+KS1N2YKbVdCBYcmE98Ca+xyFAg4 hqp4RTJasBtYUi8lc/Dp+YThGE1RbG1c39NyUGKqBQpW9XLmzuLu76VBhAC9uyKkabcP ZsKv71fP1eUOX44ynhIRHR83v0Mlx45FeM1uG/bE9AIeXN0emNnwmgiiQL9IxtncxMem woKQ== X-Gm-Message-State: AC+VfDy+KcCP2xzUcg3bQewoACBJlDlrBtdo8pfZLXV8VC1gnO7b5Aqg 7fV7xcfK+5g7Qq6mn1slvzLH5+4lDpW4hnnFH3MqMeeMN1p3eQfRQLzpPQ== X-Google-Smtp-Source: ACHHUZ6mHprL0Slad7pw8F3QLDn6A2IWEGrV8vaxBpaR5bLyYaz/gyoeWo6eDsBxGlXJLXiPzL1ojrw3I8DAT7mAGR0= X-Received: by 2002:aca:120d:0:b0:39a:a65c:42a2 with SMTP id 13-20020aca120d000000b0039aa65c42a2mr5136380ois.49.1685978832401; Mon, 05 Jun 2023 08:27:12 -0700 (PDT) MIME-Version: 1.0 From: Evan Jones Date: Mon, 5 Jun 2023 11:26:56 -0400 Message-ID: Subject: [PATCH] hstore: Fix parsing on Mac OS X: isspace() is locale specific To: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000006922ae05fd638900" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006922ae05fd638900 Content-Type: multipart/alternative; boundary="0000000000006922ad05fd6389fe" --0000000000006922ad05fd6389fe Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable This patch fixes a rare parsing bug with unicode characters on Mac OS X. The problem is that isspace() on Mac OS X changes its behaviour with the locale. Use scanner_isspace instead, which only returns true for ASCII whitespace. It appears other places in the Postgres code have already run into this, since a number of places use scanner_isspace instead. However, there are still a lot of other calls to isspace(). I'll try to take a quick look to see if there might be other instances of this bug. The bug is that in the following hstore value, the unicode character "disappears", and is replaced with "key\xc4", because it is parsed incorrectly: select E'key=C4=85=3D>value'::hstore; hstore ----------------- "key=C4=85"=3D>"value" (1 row) select 'key=C4=85=3D>value'::hstore::text::bytea; bytea ---------------------------------- \x226b6579c4223d3e2276616c756522 (1 row) The correct result should be: hstore ----------------- "key=C4=85"=3D>"value" (1 row) That query is added to the regression test. The query works on Linux, but failed on Mac OS X. For a more detailed explanation of how isspace() works, on Mac OS X, see: https://github.com/evanj/isspace_locale Thanks! Evan Jones --0000000000006922ad05fd6389fe Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
This patch fixes a rare parsing bug with unicode character= s on Mac OS X. The problem is that isspace() on Mac OS X changes its behavi= our with the locale. Use scanner_isspace instead, which only returns true f= or ASCII whitespace. It appears other places in the Postgres code have alre= ady run into this, since a number of places=C2=A0use scanner_isspace instea= d. However, there are still a lot of other calls to isspace(). I'll try= to take a quick look to see if there might be other instances of this bug.=

The bug is that in the following hstore value, the unic= ode character "disappears", and is replaced with "key\xc4&qu= ot;, because it is parsed incorrectly:

select E= 9;key=C4=85=3D>value'::hstore;
=C2=A0 =C2=A0 =C2=A0hstore =C2=A0 = =C2=A0 =C2=A0
-----------------
=C2=A0"key=C4=85"=3D>&qu= ot;value"
(1 row)

select 'key=C4= =85=3D>value'::hstore::text::bytea;
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bytea =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0
----------------------------------
=C2=A0\x226b6579c42= 23d3e2276616c756522
(1 row)

The correct res= ult=C2=A0should be:

=C2=A0 =C2=A0 =C2=A0hstore =C2= =A0 =C2=A0 =C2=A0
-----------------
=C2=A0"key=C4=85"=3D>= ;"value"
(1 row)

That query is ad= ded to the regression test. The query works on Linux, but failed on Mac OS = X.

For a more detailed=C2=A0explanation of how iss= pace() works, on Mac OS X, see:=C2=A0https://github.com/evanj/isspace_locale

Thanks!

Evan Jones

--0000000000006922ad05fd6389fe-- --0000000000006922ae05fd638900 Content-Type: application/octet-stream; name="hstore-isspace.patch" Content-Disposition: attachment; filename="hstore-isspace.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lij08kl50 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvaHN0b3JlL2V4cGVjdGVkL2hzdG9yZS5vdXQgYi9jb250cmli L2hzdG9yZS9leHBlY3RlZC9oc3RvcmUub3V0CmluZGV4IDE4MzZjOWFjZjMuLjI2ODE1Y2JjN2Yg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaHN0b3JlL2V4cGVjdGVkL2hzdG9yZS5vdXQKKysrIGIvY29u dHJpYi9oc3RvcmUvZXhwZWN0ZWQvaHN0b3JlLm91dApAQCAtMjQzLDYgKzI0MywxNCBAQCBzZWxl Y3QgJwknOjpoc3RvcmU7CiAgCiAoMSByb3cpCiAKKy0tIFVURi04IE1hYyBPUyBYIGVuX1VTLlVU Ri04IGxvY2FsZSBidWc6IGlzc3BhY2UoMHg4NSkgcmV0dXJucyB0cnVlCistLSBcdTAxMDUgZW5j b2RlcyBhcyAweGM0IDB4ODUgaW4gVVRGLTg7IHRoZSAweDg1IHdhcyBpbnRlcnByZXRlZCBhcyB3 aGl0ZXNwYWNlCitzZWxlY3QgRSdrZXlcdTAxMDU9PnZhbHVlJzo6aHN0b3JlOworICAgICBoc3Rv cmUgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tCisgImtlecSFIj0+InZhbHVlIgorKDEgcm93KQor CiAtLSBpbnZhbGlkIGlucHV0CiBzZWxlY3QgJyAgPT5udWxsJzo6aHN0b3JlOwogRVJST1I6ICBz eW50YXggZXJyb3IgaW4gaHN0b3JlLCBuZWFyICI9IiBhdCBwb3NpdGlvbiAyCmRpZmYgLS1naXQg YS9jb250cmliL2hzdG9yZS9oc3RvcmVfaW8uYyBiL2NvbnRyaWIvaHN0b3JlL2hzdG9yZV9pby5j CmluZGV4IGNlYzdkZjcxYTIuLjk5OWRkYWQ3NmQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaHN0b3Jl L2hzdG9yZV9pby5jCisrKyBiL2NvbnRyaWIvaHN0b3JlL2hzdG9yZV9pby5jCkBAIC0xMyw2ICsx Myw3IEBACiAjaW5jbHVkZSAibGliL3N0cmluZ2luZm8uaCIKICNpbmNsdWRlICJsaWJwcS9wcWZv cm1hdC5oIgogI2luY2x1ZGUgIm5vZGVzL21pc2Nub2Rlcy5oIgorI2luY2x1ZGUgInBhcnNlci9z Y2Fuc3VwLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9q c29uLmgiCiAjaW5jbHVkZSAidXRpbHMvanNvbmIuaCIKQEAgLTExOCw3ICsxMTksNyBAQCBnZXRf dmFsKEhTUGFyc2VyICpzdGF0ZSwgYm9vbCBpZ25vcmVlcSwgYm9vbCAqZXNjYXBlZCkKIAkJCXsK IAkJCQlzdCA9IEdWX1dBSVRFU0NJTjsKIAkJCX0KLQkJCWVsc2UgaWYgKCFpc3NwYWNlKCh1bnNp Z25lZCBjaGFyKSAqKHN0YXRlLT5wdHIpKSkKKwkJCWVsc2UgaWYgKCFzY2FubmVyX2lzc3BhY2Uo KHVuc2lnbmVkIGNoYXIpICooc3RhdGUtPnB0cikpKQogCQkJewogCQkJCSooc3RhdGUtPmN1cikg PSAqKHN0YXRlLT5wdHIpOwogCQkJCXN0YXRlLT5jdXIrKzsKQEAgLTE0MSw3ICsxNDIsNyBAQCBn ZXRfdmFsKEhTUGFyc2VyICpzdGF0ZSwgYm9vbCBpZ25vcmVlcSwgYm9vbCAqZXNjYXBlZCkKIAkJ CQlzdGF0ZS0+cHRyLS07CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9Ci0JCQllbHNlIGlmIChpc3Nw YWNlKCh1bnNpZ25lZCBjaGFyKSAqKHN0YXRlLT5wdHIpKSkKKwkJCWVsc2UgaWYgKHNjYW5uZXJf aXNzcGFjZSgodW5zaWduZWQgY2hhcikgKihzdGF0ZS0+cHRyKSkpCiAJCQl7CiAJCQkJcmV0dXJu IHRydWU7CiAJCQl9CkBAIC0yNTUsNyArMjU2LDcgQEAgcGFyc2VfaHN0b3JlKEhTUGFyc2VyICpz dGF0ZSkKIAkJCXsKIAkJCQlQUlNFT0Y7CiAJCQl9Ci0JCQllbHNlIGlmICghaXNzcGFjZSgodW5z aWduZWQgY2hhcikgKihzdGF0ZS0+cHRyKSkpCisJCQllbHNlIGlmICghc2Nhbm5lcl9pc3NwYWNl KCh1bnNpZ25lZCBjaGFyKSAqKHN0YXRlLT5wdHIpKSkKIAkJCXsKIAkJCQlQUlNTWU5UQVhFUlJP UjsKIAkJCX0KQEAgLTMwOSw3ICszMTAsNyBAQCBwYXJzZV9oc3RvcmUoSFNQYXJzZXIgKnN0YXRl KQogCQkJewogCQkJCXJldHVybiB0cnVlOwogCQkJfQotCQkJZWxzZSBpZiAoIWlzc3BhY2UoKHVu c2lnbmVkIGNoYXIpICooc3RhdGUtPnB0cikpKQorCQkJZWxzZSBpZiAoIXNjYW5uZXJfaXNzcGFj ZSgodW5zaWduZWQgY2hhcikgKihzdGF0ZS0+cHRyKSkpCiAJCQl7CiAJCQkJUFJTU1lOVEFYRVJS T1I7CiAJCQl9CmRpZmYgLS1naXQgYS9jb250cmliL2hzdG9yZS9zcWwvaHN0b3JlLnNxbCBiL2Nv bnRyaWIvaHN0b3JlL3NxbC9oc3RvcmUuc3FsCmluZGV4IGVmZWY5MTI5MmEuLjM2Yzc0MjIwMTgg MTAwNjQ0Ci0tLSBhL2NvbnRyaWIvaHN0b3JlL3NxbC9oc3RvcmUuc3FsCisrKyBiL2NvbnRyaWIv aHN0b3JlL3NxbC9oc3RvcmUuc3FsCkBAIC01Myw2ICs1MywxMCBAQCBzZWxlY3QgZSdcXCJhPT5x IncnOjpoc3RvcmU7CiBzZWxlY3QgJyc6OmhzdG9yZTsKIHNlbGVjdCAnCSc6OmhzdG9yZTsKIAor LS0gVVRGLTggTWFjIE9TIFggZW5fVVMuVVRGLTggbG9jYWxlIGJ1ZzogaXNzcGFjZSgweDg1KSBy ZXR1cm5zIHRydWUKKy0tIFx1MDEwNSBlbmNvZGVzIGFzIDB4YzQgMHg4NSBpbiBVVEYtODsgdGhl IDB4ODUgd2FzIGludGVycHJldGVkIGFzIHdoaXRlc3BhY2UKK3NlbGVjdCBFJ2tleVx1MDEwNT0+ dmFsdWUnOjpoc3RvcmU7CisKIC0tIGludmFsaWQgaW5wdXQKIHNlbGVjdCAnICA9Pm51bGwnOjpo c3RvcmU7CiBzZWxlY3QgJ2FhPT4iJzo6aHN0b3JlOwo= --0000000000006922ae05fd638900--