NetBSD Problem Report #60496

From www@netbsd.org  Fri Jul 24 15:05:15 2026
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (2048 bits)
	 client-signature RSA-PSS (2048 bits))
	(Client CN "mail.netbsd.org", Issuer "YR2" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 567D91A923B
	for <gnats-bugs@gnats.NetBSD.org>; Fri, 24 Jul 2026 15:05:15 +0000 (UTC)
Message-Id: <20260724150514.851F61A923C@mollari.NetBSD.org>
Date: Fri, 24 Jul 2026 15:05:14 +0000 (UTC)
From: dreibh@simula.no
Reply-To: dreibh@simula.no
To: gnats-bugs@NetBSD.org
Subject: Locale-dependent UTF-8 issue over SSH session
X-Send-Pr-Version: www-1.0
X-From4GNATS: "dreibh@simula.no via gnats" <gnats-admin@NetBSD.org>

>Number:         60496
>Notify-List:    riastradh@NetBSD.org
>Category:       bin
>Synopsis:       Locale-dependent UTF-8 issue over SSH session
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    kre
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri Jul 24 15:10:00 +0000 2026
>Closed-Date:    Thu Oct 29 06:16:18 +0000 2026
>Last-Modified:  Thu Oct 29 06:16:18 +0000 2026
>Originator:     Thomas Dreibholz
>Release:        11.0_RC6
>Organization:
SimulaMet
>Environment:
NetBSD netbsd11 11.0_RC6 NetBSD 11.0_RC6 (CUSTOM_SCTP) #0: Thu Jul 23 15:24:45 UTC 2026  root@:/usr/src/sys/arch/amd64/compile/CUSTOM_SCTP amd64
>Description:
When logged in via SSH session, NetBSD 11.0_RC6 produces an invalid separator for printf "%'d\n" when the locale is set to nb_NO.UTF-8.

Example:
$ LC_ALL=nb_NO.UTF-8 printf "%'d\n" 12345
12&#65533;345

The separator should be a space in Norwegian locale (nb_NO.UTF-8). Instead, it sends &#65533;.

$ LC_ALL=nb_NO.UTF-8 printf "%'d\n" 12345 | hexdump
0000000 3231 33c2 3534 000a                    
0000007

In the console, the "&#65533;" is shown as space, so the issue is not visible there.


For example in de_DE.UTF-8, the output is correct ("." is used here):

$ LC_ALL=de_DE.UTF-8 printf "%'d\n" 12345 
12.345

>How-To-Repeat:
$ LC_ALL=nb_NO.UTF-8 printf "%'d\n" 12345
12&#65533;345

>Fix:

>Release-Note:

>Audit-Trail:

State-Changed-From-To: open->analyzed
State-Changed-By: riastradh@NetBSD.org
State-Changed-When: Fri, 24 Jul 2026 17:36:04 +0000
State-Changed-Why:
Well, that's a silly bug.

It's trying to print the octet sequence 0xc2 0xa0, but only the 0xc2 is
coming out, because...

    631 	char thousands_sep;	/* locale specific thousands separator */
...
    923 			thousands_sep = *(localeconv_l(loc)->thousands_sep);

https://nxr.netbsd.org/xref/src/lib/libc/stdio/vfwprintf.c?r=1.41#631

I.e., it's just working with the first byte of the string!


From: Taylor R Campbell <riastradh@NetBSD.org>
To: gnats-bugs@netbsd.org
Cc: gnats-admin@netbsd.org, netbsd-bugs@netbsd.org, dreibh@simula.no
Subject: Re: bin/60496 (Locale-dependent UTF-8 issue over SSH session)
Date: Fri, 24 Jul 2026 17:43:39 +0000

 Looks like FreeBSD made a couple of changes to fix multibyte
 separators and decimal points back in 2009:

 https://cgit.freebsd.org/src/commit/lib/libc/stdio/vfprintf.c?id=3D5004a238=
 c38aecce2abe202ae920a07c2d9c3576
 https://cgit.freebsd.org/src/commit/lib/libc/stdio/vfprintf.c?id=3D21ca178e=
 ce5d3877714d167a673c0b54948640e5

 Perhaps we should pick those up.

Responsible-Changed-From-To: bin-bug-people->kre
Responsible-Changed-By: kre@NetBSD.org
Responsible-Changed-When: Sat, 25 Jul 2026 01:50:20 +0000
Responsible-Changed-Why:
I will fix this one, it will give me something to do (and yes, I will
look at the FreeBSD changes, and if possible, do the same).


From: Robert Elz <kre@munnari.OZ.AU>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Sat, 25 Jul 2026 12:09:11 +0700

     Date:        Fri, 24 Jul 2026 15:10:00 +0000 (UTC)
     From:        "dreibh@simula.no via gnats" <gnats-admin@NetBSD.org>
     Message-ID:  <20260724151000.AEC3C1A923D@mollari.NetBSD.org>

   | In the console, the "&#65533;" is shown as space, so the issue
   | is not visible there.

 It is the substitution character, used for invalid values,
 which in different environments can appear as almost anything.

 I will deal with the decimal point issues that Taylor pointed out
 the FreeBSD fix for first, though those are (kind of) unrelated to this PR,
 as they're simpler changes, and then deal with the grouping character
 (the thousands_sep case, though "thousands" isn't necessarily it)
 that is, the issue here, after that.

 In this case I am not sure that the immediate problem isn't an issue
 with the locale definition however.  What do you expect to see in the
 Norweigan locale for this?   If it is the same as the German version,
 then nothing I do to fix printf (printf(1) or printf(3) - here printf(1)
 is simply printing whatever printf(3) produces) will achieve that, as the
 German locale has the grouping character set to '.', whereas Norweigan
 locale has the grouping character defined to be 0xFFFF which seems to me
 to be an implausible value (unless perhaps it is intended to suppress
 grouping), but so does the French (fr_FR at least) locale, so perhaps that
 value does mean something special to the locale compiler (beyond my sphere
 of influence for sure).

 I can however, with FreeBSD's assistance, fix things so that multi-byte
 values (such as an unbreakable space, as one possibility) which exist in
 the compiled locale module, work as they should.

 kre


From: Valery Ushakov <uwe@stderr.spb.ru>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Sun, 26 Jul 2026 01:33:52 +0300

 On Fri, Jul 24, 2026 at 15:10:00 +0000, dreibh@simula.no via gnats wrote:

 > The separator should be a space in Norwegian locale (nb_NO.UTF-8).
 > Instead, it sends &#65533;.
 >
 > $ LC_ALL=nb_NO.UTF-8 printf "%'d\n" 12345 | hexdump
 > 0000000 3231 33c2 3534 000a
 > 0000007

 It sends 0xc2 byte, which makes an invalid UTF-8 sequence.

 The locale source (share/locale/numeric/nb_NO.UTF-8.src in this case)
 has \ua0 non-breaking space (as UTF-8 \xc2\xa0)

 The bug is that thousands_sep in vfwprintf.c is char, not a string,
 hence truncated 0xc2.

 -uwe

From: Valery Ushakov <uwe@stderr.spb.ru>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Sun, 26 Jul 2026 01:35:22 +0300

 On Sun, Jul 26, 2026 at 01:33:53 +0300, Valery Ushakov wrote:

 > The bug is that thousands_sep in vfwprintf.c is char, not a string,
 > hence truncated 0xc2.

 Bah, I somehow managed to miss the rest of the thread where riastradh
 and kre already answered... Sorry for the noise.

 -uwe

From: Thomas Dreibholz <dreibh@simula.no>
To: gnats-bugs@netbsd.org, kre@netbsd.org, gnats-admin@netbsd.org,
 netbsd-bugs@netbsd.org
Cc: riastradh@NetBSD.org
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Sun, 26 Jul 2026 16:36:45 +0200

 This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
 --------------a8EXg9Cjr0cxZbJVnRmu0SDa
 Content-Type: multipart/mixed; boundary="------------3bn0oay5V5Lt7nY542evW68z";
  protected-headers="v1"; hp="clear"
 Message-ID: <df67540e-6bb9-4cda-90c0-579dd702045c@simula.no>
 Date: Sun, 26 Jul 2026 16:36:45 +0200
 MIME-Version: 1.0
 User-Agent: Mozilla Thunderbird
 Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
 To: gnats-bugs@netbsd.org, kre@netbsd.org, gnats-admin@netbsd.org,
  netbsd-bugs@netbsd.org
 Cc: riastradh@NetBSD.org
 References: <pr-bin-60496@gnats.netbsd.org>
  <20260724150514.851F61A923C@mollari.NetBSD.org>
  <20260725051504.3C6DA1A923D@mollari.NetBSD.org>
 Content-Language: en-US
 From: Thomas Dreibholz <dreibh@simula.no>
 Autocrypt: addr=dreibh@simula.no; keydata=
  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
 Organization: Simula Research Laboratory
 In-Reply-To: <20260725051504.3C6DA1A923D@mollari.NetBSD.org>

 --------------3bn0oay5V5Lt7nY542evW68z
 Content-Type: multipart/alternative;
  boundary="------------ZKpeYNrHUj2Gwlc9ZEPnLiXo"

 --------------ZKpeYNrHUj2Gwlc9ZEPnLiXo
 Content-Type: text/plain; charset=UTF-8; format=flowed
 Content-Transfer-Encoding: base64

 SGksDQoNCnRoZSBzYW1lIGlzc3VlIGFsc28gb2NjdXJzIHVuZGVyIFNvbGFyaXMgKE9wZW5J
 bmRpYW5hIDIwMjYuMDQpIC0+IA0KaHR0cHM6Ly93d3cuaWxsdW1vcy5vcmcvaXNzdWVzLzE4
 MjgzLg0KDQpCYWNrZ3JvdW5kOiBJIGFtIG1ha2luZyBhdXRvbWF0ZWQgaW5zdGFsbGF0aW9u
 cyBvZiBWTXMgdXNpbmcgdGhlIFZpcnR1YWwgDQpNYWNoaW5lIEltYWdlIEJ1aWxkZXIgYW5k
 IFN5c3RlbSBJbnN0YWxsYXRpb24gU2NyaXB0cyANCihodHRwczovL3d3dy5ubnRiLm5vL35k
 cmVpYmgvdm1pbWFnZS1idWlsZGVyLXNjcmlwdHMvIDsgR2l0OiANCmh0dHBzOi8vZ2l0aHVi
 LmNvbS9zaW11bGEvbm9ybmV0LXZtaW1hZ2UtYnVpbGRlci1zY3JpcHRzKSwgd2hpY2ggDQpn
 ZW5lcmF0ZSBWTXMgd2l0aCBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpbnN0YWxsYXRp
 b25zIGFuZCBjZXJ0YWluIA0Kc2V0cyBvZiBhcHBsaWNhdGlvbnMuIEEgcGFja2FnZSBpbnN0
 YWxsZWQgb24gYWxsIHN5c3RlbXMgaXMgU3lzdGVtLVRvb2xzIA0KKGh0dHBzOi8vd3d3Lm5u
 dGIubm8vfmRyZWliaC9zeXN0ZW0tdG9vbHMvIDsgR2l0OiANCmh0dHBzOi8vZ2l0aHViLmNv
 bS9kcmVpYmgvc3lzdGVtLXRvb2xzKSwgd2hpY2ggZGlzcGxheXMgbG9naW4gYmFubmVycyAN
 CmFuZCBiYXNpYyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3lzdGVtIChsaWtlIG1lbW9yeSBh
 bmQgc3RvcmFnZSBzdGF0dXMgDQp3aXRoIGxvY2FsZS1kZXBlbmRlbnQgZm9ybWF0dGluZywg
 aS5lLiAiJSc2LjBmIiBvciAiJSdkIiwgZXRjLiksIA0KYXV0b21hdGljYWxseSBvbiBsb2ct
 aW4uIFN5c3RlbS1Ub29scyBzdXBwb3J0cyBpMThuLCBpLmUuIGl0IGNhbiB3b3JrIA0Kd2l0
 aCBkaWZmZXJlbnQgbG9jYWxlcyBhbmQgdHJhbnNsYXRpb25zLg0KVGhlcmVmb3JlLCBpdCBp
 cyBwb3NzaWJsZSB0byBzZWUgdGhlIG91dHB1dCBvZiB0aGUgc2FtZSBzb2Z0d2FyZSB1bmRl
 ciANCmRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgbG9jYWxlIHNldHRpbmdzLiBU
 aGUgb2JzZXJ2ZWQgaXNzdWUgDQpvY2N1cnMgdW5kZXIgTmV0QlNEIGFuZCBPcGVuSW5kaWFu
 YSwgYnV0IG5vdCB1bmRlciBGcmVlQlNELCBPcGVuQlNEIGFuZCANCmRpZmZlcmVudCBMaW51
 eCBkaXN0cmlidXRpb25zLg0KDQpTb21lIHRlc3Rpbmcgb24gZGlmZmVyZW50IHN5c3RlbXM6
 DQoNCiMhL3Vzci9iaW4vZW52IGJhc2gNCnVuYW1lIC1hDQpMQ19BTEw9bmJfTk8uVVRGLTgg
 cHJpbnRmICIlJ2RcbiIgMTIzNDUNCkxDX0FMTD1uYl9OTy5VVEYtOCBwcmludGYgIiUnZFxu
 IiAxMjM0NSB8IGhleGR1bXANCkxDX0FMTD1mcl9GUi5VVEYtOCBwcmludGYgIiUnZFxuIiAx
 MjM0NQ0KTENfQUxMPWZyX0ZSLlVURi04IHByaW50ZiAiJSdkXG4iIDEyMzQ1IHwgaGV4ZHVt
 cA0KDQpMaW51eCAoVWJ1bnR1IDI0LjA0KToNCg0KTGludXggYmVzc2VydWQucHJveG1veC5j
 cm5hbGFiLm5ldCA2LjE3LjAtMzUtZ2VuZXJpYyAjMzV+MjQuMDQuMS1VYnVudHUgDQpTTVAg
 UFJFRU1QVF9EWU5BTUlDIFR1ZSBNYXkgMjYgMTk6MzA6NDIgVVRDIDIgeDg2XzY0IHg4Nl82
 NCB4ODZfNjQgDQpHTlUvTGludXgNCjEy4oCvMzQ1DQowMDAwMDAwIDMyMzEgODBlMiAzM2Fm
 IDM1MzQgMDAwYQ0KMDAwMDAwOQ0KMTLigK8zNDUNCjAwMDAwMDAgMzIzMSA4MGUyIDMzYWYg
 MzUzNCAwMDBhDQowMDAwMDA5DQoNCkZyZWVCU0QgKDE1LjEtUkVMRUFTRSk6DQoNCkZyZWVC
 U0QgbGlsbGV2YW5uLnByb3htb3guY3JuYWxhYi5uZXQgMTUuMS1SRUxFQVNFIEZyZWVCU0Qg
 MTUuMS1SRUxFQVNFIA0KcmVsZW5nLzE1LjEtbjI4MzU2Mi05Njg0MWVhMDhkY2YgR0VORVJJ
 QyBhbWQ2NA0KMTLCoDM0NQ0KMDAwMDAwMCAzMjMxIGEwYzIgMzQzMyAwYTM1DQowMDAwMDA4
 DQoxMuKArzM0NQ0KMDAwMDAwMCAzMjMxIDgwZTIgMzNhZiAzNTM0IDAwMGENCjAwMDAwMDkN
 Cg0KU29sYXJpcyAoT3BlbkluZGlhbmEgMjAyNi4wNCk6DQoNClN1bk9TIGxvY2FsaG9zdCA1
 LjExIGlsbHVtb3MtNDY0OGI5YjhjMyBpODZwYyBpMzg2IGk4NnBjDQoxMu+/vTM0NQ0KMDAw
 MDAwMCAzMjMxIDMzYzIgMzUzNCAwMDBhDQowMDAwMDA3DQoxMu+/vTM0NQ0KMDAwMDAwMCAz
 MjMxIDMzYzIgMzUzNCAwMDBhDQowMDAwMDA3DQoNCk9wZW5CU0QgNy45Og0KT3BlbkJTRCBs
 b2NhbGhvc3QubGFuIDcuOSBHRU5FUklDLk1QIzQgYW1kNjQNCjEyMzQ1DQowMDAwMDAwIMKg
 wqDCoDMyMzEgwqDCoMKgMzQzMyDCoMKgwqAwYTM1DQowMDAwMDA2DQoxMjM0NQ0KMDAwMDAw
 MCDCoMKgwqAzMjMxIMKgwqDCoDM0MzMgwqDCoMKgMGEzNQ0KMDAwMDAwNg0KDQpOZXRCU0Qg
 MTEuMF9SQzc6DQoNCk5ldEJTRCBsb2NhbGhvc3QgMTEuMF9SQzcgTmV0QlNEIDExLjBfUkM3
 IChDVVNUT01fU0NUUCkgIzA6IFNhdCBKdWwgMjUgDQoxMDowNjowMCBVVEMgMjAyNiDCoHJv
 b3RAOi91c3Ivc3JjL3N5cy9hcmNoL2FtZDY0L2NvbXBpbGUvQ1VTVE9NX1NDVFAgYW1kNjQN
 CjEy77+9MzQ1DQowMDAwMDAwIDMyMzEgMzNjMiAzNTM0IDAwMGENCjAwMDAwMDcNCjEy77+9
 MzQ1DQowMDAwMDAwIDMyMzEgMzNjMiAzNTM0IDAwMGENCjAwMDAwMDcNCg0KRGVuIDI1LjA3
 LjIwMjYgMDc6MTUsIHNrcmV2IFJvYmVydCBFbHogdmlhIGduYXRzOg0KPiBUaGUgZm9sbG93
 aW5nIHJlcGx5IHdhcyBtYWRlIHRvIFBSIGJpbi82MDQ5NjsgaXQgaGFzIGJlZW4gbm90ZWQg
 YnkgR05BVFMuDQo+DQo+IEZyb206IFJvYmVydCBFbHo8a3JlQG11bm5hcmkuT1ouQVU+DQo+
 IFRvOmduYXRzLWJ1Z3NAbmV0YnNkLm9yZw0KPiBDYzoNCj4gU3ViamVjdDogUmU6IGJpbi82
 MDQ5NjogTG9jYWxlLWRlcGVuZGVudCBVVEYtOCBpc3N1ZSBvdmVyIFNTSCBzZXNzaW9uDQo+
 IERhdGU6IFNhdCwgMjUgSnVsIDIwMjYgMTI6MDk6MTEgKzA3MDANCj4NCj4gICAgICAgRGF0
 ZTogICAgICAgIEZyaSwgMjQgSnVsIDIwMjYgMTU6MTA6MDAgKzAwMDAgKFVUQykNCj4gICAg
 ICAgRnJvbToiZHJlaWJoQHNpbXVsYS5ubyB2aWEgZ25hdHMiIDxnbmF0cy1hZG1pbkBOZXRC
 U0Qub3JnPg0KPiAgICAgICBNZXNzYWdlLUlEOjwyMDI2MDcyNDE1MTAwMC5BRUMzQzFBOTIz
 REBtb2xsYXJpLk5ldEJTRC5vcmc+DQo+ICAgDQo+ICAgICB8IEluIHRoZSBjb25zb2xlLCB0
 aGUgIiYjNjU1MzM7IiBpcyBzaG93biBhcyBzcGFjZSwgc28gdGhlIGlzc3VlDQo+ICAgICB8
 IGlzIG5vdCB2aXNpYmxlIHRoZXJlLg0KPiAgIA0KPiAgIEl0IGlzIHRoZSBzdWJzdGl0dXRp
 b24gY2hhcmFjdGVyLCB1c2VkIGZvciBpbnZhbGlkIHZhbHVlcywNCj4gICB3aGljaCBpbiBk
 aWZmZXJlbnQgZW52aXJvbm1lbnRzIGNhbiBhcHBlYXIgYXMgYWxtb3N0IGFueXRoaW5nLg0K
 PiAgIA0KPiAgIEkgd2lsbCBkZWFsIHdpdGggdGhlIGRlY2ltYWwgcG9pbnQgaXNzdWVzIHRo
 YXQgVGF5bG9yIHBvaW50ZWQgb3V0DQo+ICAgdGhlIEZyZWVCU0QgZml4IGZvciBmaXJzdCwg
 dGhvdWdoIHRob3NlIGFyZSAoa2luZCBvZikgdW5yZWxhdGVkIHRvIHRoaXMgUFIsDQo+ICAg
 YXMgdGhleSdyZSBzaW1wbGVyIGNoYW5nZXMsIGFuZCB0aGVuIGRlYWwgd2l0aCB0aGUgZ3Jv
 dXBpbmcgY2hhcmFjdGVyDQo+ICAgKHRoZSB0aG91c2FuZHNfc2VwIGNhc2UsIHRob3VnaCAi
 dGhvdXNhbmRzIiBpc24ndCBuZWNlc3NhcmlseSBpdCkNCj4gICB0aGF0IGlzLCB0aGUgaXNz
 dWUgaGVyZSwgYWZ0ZXIgdGhhdC4NCj4gICANCj4gICBJbiB0aGlzIGNhc2UgSSBhbSBub3Qg
 c3VyZSB0aGF0IHRoZSBpbW1lZGlhdGUgcHJvYmxlbSBpc24ndCBhbiBpc3N1ZQ0KPiAgIHdp
 dGggdGhlIGxvY2FsZSBkZWZpbml0aW9uIGhvd2V2ZXIuICBXaGF0IGRvIHlvdSBleHBlY3Qg
 dG8gc2VlIGluIHRoZQ0KPiAgIE5vcndlaWdhbiBsb2NhbGUgZm9yIHRoaXM/ICAgSWYgaXQg
 aXMgdGhlIHNhbWUgYXMgdGhlIEdlcm1hbiB2ZXJzaW9uLA0KPiAgIHRoZW4gbm90aGluZyBJ
 IGRvIHRvIGZpeCBwcmludGYgKHByaW50ZigxKSBvciBwcmludGYoMykgLSBoZXJlIHByaW50
 ZigxKQ0KPiAgIGlzIHNpbXBseSBwcmludGluZyB3aGF0ZXZlciBwcmludGYoMykgcHJvZHVj
 ZXMpIHdpbGwgYWNoaWV2ZSB0aGF0LCBhcyB0aGUNCj4gICBHZXJtYW4gbG9jYWxlIGhhcyB0
 aGUgZ3JvdXBpbmcgY2hhcmFjdGVyIHNldCB0byAnLicsIHdoZXJlYXMgTm9yd2VpZ2FuDQo+
 ICAgbG9jYWxlIGhhcyB0aGUgZ3JvdXBpbmcgY2hhcmFjdGVyIGRlZmluZWQgdG8gYmUgMHhG
 RkZGIHdoaWNoIHNlZW1zIHRvIG1lDQo+ICAgdG8gYmUgYW4gaW1wbGF1c2libGUgdmFsdWUg
 KHVubGVzcyBwZXJoYXBzIGl0IGlzIGludGVuZGVkIHRvIHN1cHByZXNzDQo+ICAgZ3JvdXBp
 bmcpLCBidXQgc28gZG9lcyB0aGUgRnJlbmNoIChmcl9GUiBhdCBsZWFzdCkgbG9jYWxlLCBz
 byBwZXJoYXBzIHRoYXQNCj4gICB2YWx1ZSBkb2VzIG1lYW4gc29tZXRoaW5nIHNwZWNpYWwg
 dG8gdGhlIGxvY2FsZSBjb21waWxlciAoYmV5b25kIG15IHNwaGVyZQ0KPiAgIG9mIGluZmx1
 ZW5jZSBmb3Igc3VyZSkuDQo+ICAgDQo+ICAgSSBjYW4gaG93ZXZlciwgd2l0aCBGcmVlQlNE
 J3MgYXNzaXN0YW5jZSwgZml4IHRoaW5ncyBzbyB0aGF0IG11bHRpLWJ5dGUNCj4gICB2YWx1
 ZXMgKHN1Y2ggYXMgYW4gdW5icmVha2FibGUgc3BhY2UsIGFzIG9uZSBwb3NzaWJpbGl0eSkg
 d2hpY2ggZXhpc3QgaW4NCj4gICB0aGUgY29tcGlsZWQgbG9jYWxlIG1vZHVsZSwgd29yayBh
 cyB0aGV5IHNob3VsZC4NCj4gICANCj4gICBrcmUNCj4gICANCj4gICANCg0KLS0gDQpCZXN0
 IHJlZ2FyZHMgLyBNaXQgZnJldW5kbGljaGVuIEdyw7zDn2VuIC8gTWVkIHZlbm5saWcgaGls
 c2VuDQoNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09DQogIFRob21hcyBEcmVpYmhvbHoNCg0KICBTaW11
 bGEgTWV0cm9wb2xpdGFuIENlbnRyZSBmb3IgRGlnaXRhbCBFbmdpbmVlcmluZw0KICBDZW50
 cmUgZm9yIFJlc2lsaWVudCBOZXR3b3JrcyBhbmQgQXBwbGljYXRpb25zDQogIFN0ZW5zYmVy
 Z2dhdGEgMjcNCiAgMDE3MCBPc2xvLCBOb3J3YXkNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
 LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEUt
 TWFpbDpkcmVpYmhAc2ltdWxhLm5vDQogIEhvbWVwYWdlOmh0dHA6Ly9zaW11bGEubm8vcGVv
 cGxlL2RyZWliaA0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0K
 --------------ZKpeYNrHUj2Gwlc9ZEPnLiXo
 Content-Type: text/html; charset=UTF-8
 Content-Transfer-Encoding: quoted-printable

 <!DOCTYPE html>
 <html>
   <head>
     <meta http-equiv=3D"Content-Type" content=3D"text/html; charset=3DUTF=
 -8">
   </head>
   <body>
     <p>Hi,</p>
     <p>the same issue also occurs under Solaris (OpenIndiana 2026.04)
       -&gt; <a moz-do-not-send=3D"true"
         href=3D"https://www.illumos.org/issues/18283"
         class=3D"moz-txt-link-freetext">https://www.illumos.org/issues/18=
 283</a>.</p>
     <p>Background: I am making automated installations of VMs using the
       Virtual Machine Image Builder and System Installation Scripts (<a
         moz-do-not-send=3D"true"
         href=3D"https://www.nntb.no/~dreibh/vmimage-builder-scripts/"
         class=3D"moz-txt-link-freetext">https://www.nntb.no/~dreibh/vmima=
 ge-builder-scripts/
       </a>; Git: <a moz-do-not-send=3D"true"
         href=3D"https://github.com/simula/nornet-vmimage-builder-scripts"=

         class=3D"moz-txt-link-freetext">https://github.com/simula/nornet-=
 vmimage-builder-scripts</a>),
       which generate VMs with different operating system installations
       and certain sets of applications. A package installed on all
       systems is System-Tools (<a moz-do-not-send=3D"true"
         href=3D"https://www.nntb.no/~dreibh/system-tools/"
         class=3D"moz-txt-link-freetext">https://www.nntb.no/~dreibh/syste=
 m-tools/</a>
       ; Git: <a moz-do-not-send=3D"true"
         href=3D"https://github.com/dreibh/system-tools"
         class=3D"moz-txt-link-freetext">https://github.com/dreibh/system-=
 tools</a>),
       which displays login banners and basic information about the
       system (like memory and storage status with locale-dependent
       formatting, i.e. "%'6.0f" or "%'d", etc.), automatically on
       log-in. System-Tools supports i18n, i.e. it can work with
       different locales and translations.<br>
       Therefore, it is possible to see the output of the same software
       under different operating systems and locale settings. The
       observed issue occurs under NetBSD and OpenIndiana, but not under
       FreeBSD, OpenBSD and different Linux distributions.</p>
     <p>Some testing on different systems:</p>
     <p><span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;">#!/usr/bin/en=
 v
           bash<br>
           uname -a<br>
           LC_ALL=3Dnb_NO.UTF-8 printf "%'d\n" 12345<br>
           LC_ALL=3Dnb_NO.UTF-8 printf "%'d\n" 12345 | hexdump<br>
           LC_ALL=3Dfr_FR.UTF-8 printf "%'d\n" 12345<br>
           LC_ALL=3Dfr_FR.UTF-8 printf "%'d\n" 12345 | hexdump</span><br>
         <br>
       </span>Linux (Ubuntu 24.04):</p>
     <p><span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;">Linux
           besserud.proxmox.crnalab.net 6.17.0-35-generic
           #35~24.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 19:30:42 UTC
           2 x86_64 x86_64 x86_64 GNU/Linux
         </span><br>
         12=E2=80=AF345
         <br>
         0000000 3231 80e2 33af 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0<br>
         0000009
         <br>
         12=E2=80=AF345
         <br>
         0000000 3231 80e2 33af 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0<br>
         0000009<br>
         <br>
       </span>FreeBSD (15.1-RELEASE):</p>
     <p><span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;">FreeBSD
           lillevann.proxmox.crnalab.net 15.1-RELEASE FreeBSD
           15.1-RELEASE releng/15.1-n283562-96841ea08dcf GENERIC amd64
         </span><br>
         12=C2=A0345
         <br>
         0000000 3231 a0c2 3433 0a35 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0<br>
         0000008
         <br>
         12=E2=80=AF345
         <br>
         0000000 3231 80e2 33af 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0<br>
         0000009</span></p>
     <p>Solaris (OpenIndiana 2026.04):</p>
     <p><span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;">SunOS
           localhost 5.11 illumos-4648b9b8c3 i86pc i386 i86pc
         </span><br>
         12=EF=BF=BD345
         <br>
         0000000 3231 33c2 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0<br>
         0000007
         <br>
         12=EF=BF=BD345
         <br>
         0000000 3231 33c2 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0<br>
         0000007</span></p>
     <p>OpenBSD 7.9:<br>
       <span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;"><span
             style=3D"font-family:monospace"><span
               style=3D"color:#000000;background-color:#ffffff;">OpenBSD
               localhost.lan 7.9 GENERIC.MP#4 amd64
             </span><br>
             12345
             <br>
             0000000 =C2=A0=C2=A0=C2=A03231 =C2=A0=C2=A0=C2=A03433 =C2=A0=C2=
 =A0=C2=A00a35
             =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0<br>
             0000006
             <br>
             12345
             <br>
             0000000 =C2=A0=C2=A0=C2=A03231 =C2=A0=C2=A0=C2=A03433 =C2=A0=C2=
 =A0=C2=A00a35
             =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0<br>
             0000006</span></span></span></p>
     <p>NetBSD 11.0_RC7:</p>
     <p><span style=3D"font-family:monospace"><span
           style=3D"color:#000000;background-color:#ffffff;">NetBSD
           localhost 11.0_RC7 NetBSD 11.0_RC7 (CUSTOM_SCTP) #0: Sat Jul
           25 10:06:00 UTC 2026
           =C2=A0root@:/usr/src/sys/arch/amd64/compile/CUSTOM_SCTP amd64
         </span><br>
         12=EF=BF=BD345
         <br>
         0000000 3231 33c2 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0<br>
         0000007
         <br>
         12=EF=BF=BD345
         <br>
         0000000 3231 33c2 3534 000a =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
 =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
 =C2=A0<br>
         0000007</span></p>
     <div class=3D"moz-cite-prefix">Den 25.07.2026 07:15, skrev Robert Elz=

       via gnats:<br>
     </div>
     <blockquote type=3D"cite"
       cite=3D"mid:20260725051504.3C6DA1A923D@mollari.NetBSD.org">
       <pre wrap=3D"" class=3D"moz-quote-pre">The following reply was made=
  to PR bin/60496; it has been noted by GNATS.

 From: Robert Elz <a class=3D"moz-txt-link-rfc2396E" href=3D"mailto:kre@mu=
 nnari.OZ.AU">&lt;kre@munnari.OZ.AU&gt;</a>
 To: <a class=3D"moz-txt-link-abbreviated" href=3D"mailto:gnats-bugs@netbs=
 d.org">gnats-bugs@netbsd.org</a>
 Cc:=20
 Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
 Date: Sat, 25 Jul 2026 12:09:11 +0700

      Date:        Fri, 24 Jul 2026 15:10:00 +0000 (UTC)
      From:        <a class=3D"moz-txt-link-rfc2396E" href=3D"mailto:dreib=
 h@simula.noviagnats">"dreibh@simula.no via gnats"</a> <a class=3D"moz-txt=
 -link-rfc2396E" href=3D"mailto:gnats-admin@NetBSD.org">&lt;gnats-admin@Ne=
 tBSD.org&gt;</a>
      Message-ID:  <a class=3D"moz-txt-link-rfc2396E" href=3D"mailto:20260=
 724151000.AEC3C1A923D@mollari.NetBSD.org">&lt;20260724151000.AEC3C1A923D@=
 mollari.NetBSD.org&gt;</a>
 =20
    | In the console, the "&amp;#65533;" is shown as space, so the issue
    | is not visible there.
 =20
  It is the substitution character, used for invalid values,
  which in different environments can appear as almost anything.
 =20
  I will deal with the decimal point issues that Taylor pointed out
  the FreeBSD fix for first, though those are (kind of) unrelated to this =
 PR,
  as they're simpler changes, and then deal with the grouping character
  (the thousands_sep case, though "thousands" isn't necessarily it)
  that is, the issue here, after that.
 =20
  In this case I am not sure that the immediate problem isn't an issue
  with the locale definition however.  What do you expect to see in the
  Norweigan locale for this?   If it is the same as the German version,
  then nothing I do to fix printf (printf(1) or printf(3) - here printf(1)=

  is simply printing whatever printf(3) produces) will achieve that, as th=
 e
  German locale has the grouping character set to '.', whereas Norweigan
  locale has the grouping character defined to be 0xFFFF which seems to me=

  to be an implausible value (unless perhaps it is intended to suppress
  grouping), but so does the French (fr_FR at least) locale, so perhaps th=
 at
  value does mean something special to the locale compiler (beyond my sphe=
 re
  of influence for sure).
 =20
  I can however, with FreeBSD's assistance, fix things so that multi-byte
  values (such as an unbreakable space, as one possibility) which exist in=

  the compiled locale module, work as they should.
 =20
  kre
 =20
 =20
 </pre>
     </blockquote>
     <pre class=3D"moz-signature" cols=3D"72">--=20
 Best regards / Mit freundlichen Gr=C3=BC=C3=9Fen / Med vennlig hilsen

 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
  Thomas Dreibholz

  Simula Metropolitan Centre for Digital Engineering
  Centre for Resilient Networks and Applications
  Stensberggata 27
  0170 Oslo, Norway
 -----------------------------------------------------------------------
  E-Mail:     <a class=3D"moz-txt-link-abbreviated" href=3D"mailto:dreibh@=
 simula.no">dreibh@simula.no</a>
  Homepage:   <a class=3D"moz-txt-link-freetext" href=3D"http://simula.no/=
 people/dreibh">http://simula.no/people/dreibh</a>
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D</pre>
   </body>
 </html>

 --------------ZKpeYNrHUj2Gwlc9ZEPnLiXo--

 --------------3bn0oay5V5Lt7nY542evW68z--

 --------------a8EXg9Cjr0cxZbJVnRmu0SDa
 Content-Type: application/pgp-signature; name="OpenPGP_signature.asc"
 Content-Description: OpenPGP digital signature
 Content-Disposition: attachment; filename="OpenPGP_signature.asc"

 -----BEGIN PGP SIGNATURE-----

 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
 =SvH8
 -----END PGP SIGNATURE-----

 --------------a8EXg9Cjr0cxZbJVnRmu0SDa--

From: Robert Elz <kre@munnari.OZ.AU>
To: Thomas Dreibholz <dreibh@simula.no>
Cc: gnats-bugs@netbsd.org, gnats-admin@netbsd.org, netbsd-bugs@netbsd.org,
        riastradh@NetBSD.org
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Mon, 27 Jul 2026 02:29:25 +0700

     Date:        Sun, 26 Jul 2026 16:36:45 +0200
     From:        Thomas Dreibholz <dreibh=40simula.no>
     Message-ID:  <df67540e-6bb9-4cda-90c0-579dd702045c=40simula.no>

   =7C the same issue also occurs under Solaris (OpenIndiana 2026.04) ->=20

   =7C The observed issue=20
   =7C occurs under NetBSD and OpenIndiana, but not under FreeBSD, OpenBSD=
  and=20
   =7C different Linux distributions.

   =7C Linux (Ubuntu 24.04):
   =7C
   =7C Linux besserud.proxmox.crnalab.net 6.17.0-35-generic =2335=7E24.04.=
 1-Ubuntu=20
   =7C SMP PREEMPT_DYNAMIC Tue May 26 19:30:42 UTC 2 x86_64 x86_64 x86_64 =

   =7C GNU/Linux
   =7C 12 345
   =7C 0000000 3231 80e2 33af 3534 000a
   =7C 0000009
   =7C 12 345
   =7C 0000000 3231 80e2 33af 3534 000a
   =7C 0000009

 That one is simple enough, E2 80 AF is UTF-8 for code-point 8239 (0x202f)=

 a narrow no-break space (which would appear as just a space in a fixed
 width font like terminal emulators use).

   =7C FreeBSD (15.1-RELEASE):
   =7C
   =7C FreeBSD lillevann.proxmox.crnalab.net 15.1-RELEASE FreeBSD 15.1-REL=
 EASE=20
   =7C releng/15.1-n283562-96841ea08dcf GENERIC amd64
   =7C 12=A0345
   =7C 0000000 3231 a0c2 3433 0a35
   =7C 0000008
   =7C 12 345
   =7C 0000000 3231 80e2 33af 3534 000a
   =7C 0000009

 That is more interesting, for nb_NO.UTF-8 FreeBSD is using a regular
 width no-break space (Code point 160, 0xA0), and for fr_FR.UTF-8 they're
 using the narrow one that Linux uses.

 Is Norweigan intended to be different from French in that way, or not?
 (ie: do Linux or FreeBSD have it correct) ?   Or perhaps neither, and
 both French & Norweigan should be a normal width no-break space?

 If this is to get changed in NetBSD, we might as well try to get it right=
 .

 The others don't need comments.

 kre


From: Valery Ushakov <uwe@stderr.spb.ru>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Sun, 26 Jul 2026 23:02:14 +0300

 On Mon, Jul 27, 2026 at 02:29:25 +0700, Robert Elz wrote:

 > If this is to get changed in NetBSD, we might as well try to get it right.

 https://en.wikipedia.org/wiki/Non-breaking_space#Narrow_non-breaking_space

   The narrow non-breaking space is used in numbers as a group
   separator in French (starting in Unicode CLDR 34[16]) and Venetian
   (starting in Unicode CLDR 44[17]).  In Spanish, the Royal Spanish
   Academy and Association of Academies of the Spanish Language's
   Diccionario panhispánico de dudas prescribes a small space as the
   number group separator,[18] although this is not the case in
   Unicode's Common Locale Data Repository (CLDR).[19]

 -uwe

From: Robert Elz <kre@munnari.OZ.AU>
To: Thomas Dreibholz <dreibh@simula.no>
Cc: gnats-bugs@netbsd.org, netbsd-bugs@netbsd.org, riastradh@NetBSD.org
Subject: Re: bin/60496: Locale-dependent UTF-8 issue over SSH session
Date: Tue, 22 Sep 2026 00:29:10 +0700

 There is progress on this issue, it hasn't been forgotten!

 Given the test program:

 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <locale.h>

 int
 main(int argc __unused, char **argv __unused)
 {
         char buf[129];

         setlocale(LC_ALL, "");
         memset(buf, 0, sizeof buf);

         sprintf(buf, "%'d\n", 123456789);
         write(1, buf, strlen(buf));

         sprintf(buf, "%'40.4f\n", 123456789012.76543);
         write(1, buf, strlen(buf));

         return 0;
 }

 [Just using the sprintf/write combination as it was easier for debugging
  - the changes are all buried inside the __vfprintf_unlocked_l or
  __vfwprintf_unlocked_l function (as appropriate) and the subordinate
  routines it calls, which are used for all *printf() variations, so this
  should be the same for any kind of printf().]

 When built to make (the imaginatively named) binary) "t" I now get:

 LC_ALL=nb_NO.UTF-8 ./t
 123 456 789
                  123 456 789 012,7654

 LC_ALL=nb_NO.UTF-8 ./t | hexdump
 0000000 3231 c233 34a0 3635 a0c2 3837 0a39 2020
 0000010 2020 2020 2020 2020 2020 2020 2020 3120
 0000020 3332 a0c2 3534 c236 37a0 3938 a0c2 3130
 0000030 2c32 3637 3435 000a

 That is, the grouping characters are properly C2A0
 aka \u00A0 (the unbreakable space) which I believe
 is what is intended (it is what is in our locale data
 anyway, if incorrect that can be a different change).


 In my fake test locale, I get:

 LC_ALL=x1_X1.UTF-8 ./t | hexdump
 0000000 3231 d933 34ac 3635 d937 38ac 0a39 2020
 0000010 2020 2020 2020 2020 2020 3120 d932 33ac
 0000020 acd9 3534 d936 37ac 3938 d930 31ac e232
 0000030 8e97 3637 3435 000a

 There the grouping characters are D9AC (\u066c)
 and the decimal point is E2978E (\u25ce) - not
 because they're particularly likely values to
 ever exist, but just because they're not impossible
 either:

 LC_ALL=x1_X1.UTF-8 ./t
 123٬4567٬89
              12٬3٬456٬7890٬12◎7654

 (and yes, this fake locale also uses a rather odd grouping
 specification, not just every N digits).

 I am still working on improving the ATF tests before this
 gets committed, but I believe the libc parts are all OK
 (wrt this issue anyway) now.   The decimal point change is
 identical to (obtained from) the FreeBSD changes to fix
 the same problem, the grouping changes are done differently,
 FreeBSD's implementation has diverged from ours in other
 ways, and it was (for just this) easier to simply reimplement
 the changes in ways that fit our current sources.

 kre

From: "Robert Elz" <kre@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60496 CVS commit: src/lib/libc/stdio
Date: Mon, 21 Sep 2026 19:12:51 +0000

 Module Name:	src
 Committed By:	kre
 Date:		Mon Sep 21 19:12:51 UTC 2026

 Modified Files:
 	src/lib/libc/stdio: vfwprintf.c

 Log Message:
 PR lib/60708 - include 'F' format when fetching %n$ args.

 XXX pullup -10 -11 (to be done along with PR bin/60496 pullups).


 To generate a diff of this commit:
 cvs rdiff -u -r1.41 -r1.42 src/lib/libc/stdio/vfwprintf.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Robert Elz" <kre@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60496 CVS commit: src/lib/libc/stdio
Date: Tue, 13 Oct 2026 04:36:55 +0000

 Module Name:	src
 Committed By:	kre
 Date:		Tue Oct 13 04:36:55 UTC 2026

 Modified Files:
 	src/lib/libc/stdio: vfwprintf.c

 Log Message:
 PR bin/60496 - fix printf(3) with non-single-byte decimal point & thousands sep

 These fixes are relatively simple, and should be safe -- I have had them
 in my source tree for ages now.

 The fix for the decimal point case is taken more or less directly from
 an old FreeBSD fix for the same issue.

 The thousands separator case is different - our code and FreeBSD's have
 diverged so much in this area that simply using their method would have
 been more trouble than it was worth, so I reimplemented it differently
 to better fit our code model.

 There are ATF tests that go with this, which will be committed one day,
 but have been waiting on strfmon(3) fixes, which are related.   I decided
 these code changes should wait no longer.  The tests will come later.

 XXX pullup -11 -10


 To generate a diff of this commit:
 cvs rdiff -u -r1.42 -r1.43 src/lib/libc/stdio/vfwprintf.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: analyzed->needs-pullups
State-Changed-By: kre@NetBSD.org
State-Changed-When: Tue, 13 Oct 2026 05:30:40 +0000
State-Changed-Why:
Needs pullups (along with PR lib/60708) to -10 and -11


State-Changed-From-To: needs-pullups->pending-pullups
State-Changed-By: kre@NetBSD.org
State-Changed-When: Wed, 14 Oct 2026 18:21:50 +0000
State-Changed-Why:
[pullup-10 #1363] [pullup-11 #531]


From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60496 CVS commit: [netbsd-11] src/lib/libc/stdio
Date: Wed, 14 Oct 2026 18:30:55 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Wed Oct 14 18:30:55 UTC 2026

 Modified Files:
 	src/lib/libc/stdio [netbsd-11]: vfwprintf.c

 Log Message:
 Pull up following revision(s) (requested by kre in ticket #531):

 	lib/libc/stdio/vfwprintf.c: revision 1.42,1.43

 PR lib/60708 - include 'F' format when fetching %n$ args.

 PR bin/60496 - fix printf(3) with non-single-byte decimal point & thousands sep

 These fixes are relatively simple, and should be safe -- I have had them
 in my source tree for ages now.

 The fix for the decimal point case is taken more or less directly from
 an old FreeBSD fix for the same issue.

 The thousands separator case is different - our code and FreeBSD's have
 diverged so much in this area that simply using their method would have
 been more trouble than it was worth, so I reimplemented it differently
 to better fit our code model.

 There are ATF tests that go with this, which will be committed one day,
 but have been waiting on strfmon(3) fixes, which are related.   I decided
 these code changes should wait no longer.  The tests will come later.


 To generate a diff of this commit:
 cvs rdiff -u -r1.41 -r1.41.4.1 src/lib/libc/stdio/vfwprintf.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60496 CVS commit: [netbsd-10] src/lib/libc/stdio
Date: Wed, 14 Oct 2026 18:33:23 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Wed Oct 14 18:33:22 UTC 2026

 Modified Files:
 	src/lib/libc/stdio [netbsd-10]: vfwprintf.c

 Log Message:
 Pull up following revision(s) (requested by kre in ticket #1363):

 	lib/libc/stdio/vfwprintf.c: revision 1.42,1.43

 PR lib/60708 - include 'F' format when fetching %n$ args.

 PR bin/60496 - fix printf(3) with non-single-byte decimal point & thousands sep

 These fixes are relatively simple, and should be safe -- I have had them
 in my source tree for ages now.

 The fix for the decimal point case is taken more or less directly from
 an old FreeBSD fix for the same issue.

 The thousands separator case is different - our code and FreeBSD's have
 diverged so much in this area that simply using their method would have
 been more trouble than it was worth, so I reimplemented it differently
 to better fit our code model.

 There are ATF tests that go with this, which will be committed one day,
 but have been waiting on strfmon(3) fixes, which are related.   I decided
 these code changes should wait no longer.  The tests will come later.


 To generate a diff of this commit:
 cvs rdiff -u -r1.39.2.1 -r1.39.2.2 src/lib/libc/stdio/vfwprintf.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: pending-pullups->feedback
State-Changed-By: kre@NetBSD.org
State-Changed-When: Wed, 14 Oct 2026 18:45:38 +0000
State-Changed-Why:
Pullups completed.

This problem should be fixed in versions of all of HEAD -11 and -10
built from sources from after the date of this e-mail (and HEAD
somewhat earlier).

Please let us know if there are still any issues with these systems.

Thanks for the PR.


From: "Robert Elz" <kre@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/60496 CVS commit: src/tests/lib/libc/locale
Date: Wed, 28 Oct 2026 17:35:20 +0000

 Module Name:	src
 Committed By:	kre
 Date:		Wed Oct 28 17:35:20 UTC 2026

 Modified Files:
 	src/tests/lib/libc/locale: t_sprintf.c

 Log Message:
 PR lib/60885 and PR lib/60886 - add test cases to demonstrate bugs

 The changes in this test (amongst others, including adding tests of
 the nb_NO.UTF-8 domain for PR bin/60496 which should already be fixed)
 should expose the problems in printf(3) and scanf(3) noted in the PRs.
 Note that we do not currently have tests for wscanf(3) which has a similar
 problem to PR lib/60885, and consequently remains untested.

 These new tests are currently expected to fail - but are not going to
 be marked as expected fails, I want to see them actually fail.

 Fixes for the issues already exist, and will be committed to the tree
 soon after test failures have been observed.  Similarly, a fix for the
 wscanf(3) issue will be made at the same time (the bug is glaringly obvious,
 and its fix is considerably simpler than that for scanf(3) - not that that
 one was difficult) without that one ever having been observed - unless
 the proverbial someone quickly implements a test case for that.

 None of this is intended to be pulled up to any already released version
 of NetBSD (apart from the 60496 fixes, which already have been), as no
 existing release has an installed locale which can trigger any of the other
 bugs.  The scanf issue (60585, incl wscanf - it is the same issue, just
 occurring in a different way) is a plausible one - a real locale could
 trigger it, but none of NetBSD's existing locales do.   The 60886 issue is
 bizarre, no real locale is ever going to trigger that one.

 In addition to the added tests for the bugs, and simply to torture the
 implementation in ways the tests had not done before, the tests have
 been upgraded to not stop upon the first failure - all failing sub-tests
 will be reported before each test case fails.


 To generate a diff of this commit:
 cvs rdiff -u -r1.8 -r1.9 src/tests/lib/libc/locale/t_sprintf.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: Taylor R Campbell <riastradh@NetBSD.org>
To: Robert Elz <kre@NetBSD.org>
Cc: gnats-bugs@NetBSD.org, gnats-admin@NetBSD.org, netbsd-bugs@NetBSD.org,
	dreibh@simula.no, source-changes-d@NetBSD.org
Subject: Re: PR/60496 CVS commit: src/tests/lib/libc/locale
Date: Wed, 28 Oct 2026 17:52:47 +0000

 > Date: Wed, 28 Oct 2026 17:35:20 +0000
 > From: "Robert Elz" <kre@netbsd.org>
 > 
 > These new tests are currently expected to fail - but are not going to
 > be marked as expected fails, I want to see them actually fail.

 Please mark the tests as xfail.

 Verifying that they actually fail is _exactly the point_ of marking
 them as xfail:

 0. The tests pass but are missing anything to trigger a certain bug.

 1. You add a new test marked xfail.
    => The tests should still pass, verifying the bug is there.  (The
       new test will be counted among the expected failures rather than
       among the successes.)

 2. You fix the bug and remove the xfail marker in a single changeset.
    => The tests should still pass, verifying that the fix changed the
       test from failing to passing.

 If test detects the bug and the change fixes the bug as you intended,
 the whole test suite will pass at every step of the way.

 If you got anything wrong -- if the test failed to detect the bug, if
 the changeset failed to fix the bug -- only _then_ will the test suite
 fail.  That should be cause for alarm, and shouldn't be used for
 routine verification of whether your change worked.

State-Changed-From-To: feedback->closed
State-Changed-By: kre@NetBSD.org
State-Changed-When: Thu, 29 Oct 2026 06:16:18 +0000
State-Changed-Why:
Feedback timeout, problem fixed, verified fixed by ATF tests


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.51 2026/08/10 02:28:17 riastradh Exp $
$NetBSD: gnats_config.sh,v 1.10 2026/05/13 22:00:09 riastradh Exp $
Copyright © 1994-2026 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.