From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#42904: [PATCH] Non-Unicode frame title crashes Emacs on macOS Date: Mon, 17 Aug 2020 16:11:52 +0200 Message-ID: Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.15\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_7D2C7DE5-27F7-4A73-B54D-103F8253896E" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="16118"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Alan Third To: 42904@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Mon Aug 17 16:14:40 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1k7fuJ-00042U-C4 for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 17 Aug 2020 16:14:39 +0200 Original-Received: from localhost ([::1]:46450 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k7fuI-0007AP-F7 for geb-bug-gnu-emacs@m.gmane-mx.org; Mon, 17 Aug 2020 10:14:38 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33962) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k7fsl-0006up-0g for bug-gnu-emacs@gnu.org; Mon, 17 Aug 2020 10:13:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:49499) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k7fsk-0002rr-Nv for bug-gnu-emacs@gnu.org; Mon, 17 Aug 2020 10:13:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1k7fsk-0006jM-Jl for bug-gnu-emacs@gnu.org; Mon, 17 Aug 2020 10:13:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Mon, 17 Aug 2020 14:13:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 42904 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.159767352925803 (code B ref -1); Mon, 17 Aug 2020 14:13:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 17 Aug 2020 14:12:09 +0000 Original-Received: from localhost ([127.0.0.1]:32810 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k7frt-0006i7-FR for submit@debbugs.gnu.org; Mon, 17 Aug 2020 10:12:09 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:52844) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1k7fro-0006hu-QN for submit@debbugs.gnu.org; Mon, 17 Aug 2020 10:12:08 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33812) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k7fro-0006OO-M3 for bug-gnu-emacs@gnu.org; Mon, 17 Aug 2020 10:12:04 -0400 Original-Received: from mail208c50.megamailservers.eu ([91.136.10.218]:34164 helo=mail194c50.megamailservers.eu) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k7frm-0002nY-Qu for bug-gnu-emacs@gnu.org; Mon, 17 Aug 2020 10:12:04 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1597673519; bh=HPu8Tct+Ww9MiEKyK52ACctlM3C6v2af/KpPdeCECCU=; h=From:Subject:Date:Cc:To:From; b=FfWHwdtHpF0Sh94925eMLzwvbz68oEC03IKkQjcS1t8//HMGaEkrd/QsNvNccCKl7 +O+4HQqOre4P3bowtax/Zwi7qpKK/M9gaCZfPEZ8AIvbE+IASR8i3tv9jhW9oe+H2r 9lbaIgdSgyawl8Mzk80uISfMWq4MUNpG8JHFrTVk= Feedback-ID: mattiase@acm.or Original-Received: from [192.168.0.4] (c188-150-171-71.bredband.comhem.se [188.150.171.71]) (authenticated bits=0) by mail194c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id 07HEBqpD028942; Mon, 17 Aug 2020 14:11:58 +0000 X-Mailer: Apple Mail (2.3445.104.15) X-CTCH-RefID: str=0001.0A782F22.5F3A902F.000A, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=KsozJleN c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=M51BFTxLslgA:10 a=bjBGVWMq7zkxmT2rhq8A:9 a=CjuIK1q_8ugA:10 a=98GMzcCnwbVNXY-RbesA:9 a=B2y7HmGcmWMA:10 X-Origin-Country: SE Received-SPF: softfail client-ip=91.136.10.218; envelope-from=mattiase@acm.org; helo=mail194c50.megamailservers.eu X-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/17 10:12:00 X-ACL-Warn: Detected OS = Linux 2.2.x-3.x (no timestamps) [generic] X-Spam_score_int: -11 X-Spam_score: -1.2 X-Spam_bar: - X-Spam_report: (-1.2 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_SOFTFAIL=0.665, URIBL_BLOCKED=0.001 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:185380 Archived-At: --Apple-Mail=_7D2C7DE5-27F7-4A73-B54D-103F8253896E Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Setting a frame title that contains non-Unicode characters causes a = crash in the NS backend. (Other platforms may or may not deal with it = appropriately -- if you have the opportunity to test, please report.) Since the title is typically derived from the buffer name, this is = easily reproduced by (rename-buffer "n\351") The crash occurs in ns_set_name_internal: encoded_name =3D ENCODE_UTF_8 (name); Here encoded_name is still "n\351" (a 2 byte unibyte string), because = the \351 couldn't be encoded. str =3D [NSString stringWithUTF8String: SSDATA (encoded_name)]; Now str is nil since "n\351" isn't valid UTF-8. [[view window] setTitle: str]; Here we get an NS crash because nil isn't a valid setTitle: argument. Proposed patch attached. I didn't find any obvious way to encode an = Emacs string into valid UTF-8 (with bad parts replaced) so a new = function was written. The corresponding Lisp function was marked = internal because it's only there for test purposes, but it could of = course be promoted to non-internal if someone wants it. --Apple-Mail=_7D2C7DE5-27F7-4A73-B54D-103F8253896E Content-Disposition: attachment; filename=0001-Fix-NS-crash-on-invalid-frame-title-string.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Fix-NS-crash-on-invalid-frame-title-string.patch" Content-Transfer-Encoding: quoted-printable =46rom=2013b43b826a7f7f539484babc275cd9a19a64da9e=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Mon,=2017=20Aug=202020=2015:37:33=20+0200=0A= Subject:=20[PATCH]=20Fix=20NS=20crash=20on=20invalid=20frame=20title=20= string=0A=0AInstead=20of=20blindly=20assuming=20that=20Emacs=20strings=20= are=20valid=20UTF-8,=20which=0Athey=20are=20not,=20convert=20them=20in=20= a=20more=20careful=20way=20using=20U+FFFD=20for=0Areplacing=20invalid=20= values.=0A=0A*=20src/coding.c=20(string_to_valid_utf_8)=0A= Finternal_string_to_valid_utf_8):=20New=20functions.=0A*=20src/coding.h:=20= Prototype.=0A*=20src/nsfns.m=20(ns_set_name_internal):=20Use=20= string_to_valid_utf_8.=0A*=20test/src/coding-tests.el=20= (coding-string-to-valid-utf-8):=20New=20test.=0A---=0A=20src/coding.c=20=20= =20=20=20=20=20=20=20=20=20=20=20|=2056=20= ++++++++++++++++++++++++++++++++++++++++=0A=20src/coding.h=20=20=20=20=20= =20=20=20=20=20=20=20=20|=20=202=20++=0A=20src/nsfns.m=20=20=20=20=20=20=20= =20=20=20=20=20=20=20|=20=206=20++---=0A=20test/src/coding-tests.el=20|=20= 14=20++++++++++=0A=204=20files=20changed,=2074=20insertions(+),=204=20= deletions(-)=0A=0Adiff=20--git=20a/src/coding.c=20b/src/coding.c=0Aindex=20= 51bd441de9..65493b07ac=20100644=0A---=20a/src/coding.c=0A+++=20= b/src/coding.c=0A@@=20-9564,6=20+9564,61=20@@=20= code_convert_string_norecord=20(Lisp_Object=20string,=20Lisp_Object=20= coding_system,=0A=20}=0A=20=0A=20=0A+/*=20Convert=20STRING=20to=20a=20= pure=20Unicode=20string.=0A+=20=20=20Non-Unicode=20values=20are=20= substituted=20with=20U+FFFD=20REPLACEMENT=20CHARACTER.=0A+=20=20=20= Return=20a=20unibyte=20or=20multibyte=20string,=20possibly=20STRING=20= itself,=0A+=20=20=20whose=20SDATA=20is=20guaranteed=20to=20be=20UTF-8.=20= =20*/=0A+Lisp_Object=0A+string_to_valid_utf_8=20(Lisp_Object=20string)=0A= +{=0A+=20=20if=20(string_ascii_p=20(string))=0A+=20=20=20=20return=20= string;=0A+=20=20if=20(!STRING_MULTIBYTE=20(string))=0A+=20=20=20=20= string=20=3D=20string_to_multibyte=20(string);=0A+=0A+=20=20/*=20Now=20= STRING=20is=20multibyte.=20=20*/=0A+=20=20unsigned=20char=20*buf=20=3D=20= NULL;=0A+=20=20unsigned=20char=20*d=20=3D=20NULL;=0A+=20=20unsigned=20= char=20*s=20=3D=20SDATA=20(string);=0A+=20=20unsigned=20char=20*end=20=3D=20= s=20+=20SBYTES=20(string);=0A+=20=20while=20(s=20<=20end)=0A+=20=20=20=20= {=0A+=20=20=20=20=20=20int=20len;=0A+=20=20=20=20=20=20int=20c=20=3D=20= string_char_and_length=20(s,=20&len);=0A+=20=20=20=20=20=20if=20(c=20>=20= 0x10ffff=20||=20char_surrogate_p=20(c))=0A+=20=20=20=20=20=20=20=20{=0A+=20= =20=20=20=20=20=20=20=20=20/*=20Not=20valid=20for=20UTF-8.=20=20*/=0A+=20= =20=20=20=20=20=20=20=20=20if=20(!d)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20{=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20buf=20=3D=20xmalloc=20= (4=20*=20SCHARS=20(string));=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= ptrdiff_t=20n=20=3D=20s=20-=20SDATA=20(string);=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20memcpy=20(buf,=20SDATA=20(string),=20n);=0A+=20=20=20=20= =20=20=20=20=20=20=20=20=20=20d=20=3D=20buf=20+=20n;=0A+=20=20=20=20=20=20= =20=20=20=20=20=20}=0A+=20=20=20=20=20=20=20=20=20=20*d++=20=3D=200357;=20= =20=20=20=20=20=20=20=20=20/*=20Use=20U+FFFD.=20=20*/=0A+=20=20=20=20=20=20= =20=20=20=20*d++=20=3D=200277;=0A+=20=20=20=20=20=20=20=20=20=20*d++=20=3D= =200275;=0A+=20=20=20=20=20=20=20=20=20=20s=20+=3D=20len;=0A+=20=20=20=20= =20=20=20=20}=0A+=20=20=20=20=20=20else=20if=20(d)=0A+=20=20=20=20=20=20=20= =20do=20*d++=20=3D=20*s++;=20while=20(--len);=0A+=20=20=20=20=20=20else=0A= +=20=20=20=20=20=20=20=20s=20+=3D=20len;=0A+=20=20=20=20}=0A+=20=20= Lisp_Object=20ret=20=3D=20buf=20?=20make_multibyte_string=20(buf,=20= SCHARS=20(string),=20d=20-=20buf)=0A+=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20:=20string;=0A+=20=20xfree=20(buf);=0A= +=20=20return=20ret;=0A+}=0A+=0A+DEFUN=20= ("internal-string-to-valid-utf-8",=20Finternal_string_to_valid_utf_8,=0A= +=20=20=20=20=20=20=20Sinternal_string_to_valid_utf_8,=201,=201,=200,=0A= +=20=20=20=20=20=20=20doc:=20=20/*=20Internal=20use=20only.=20=20*/)=0A+=20= =20=20=20=20(Lisp_Object=20string)=0A+{=0A+=20=20return=20= string_to_valid_utf_8=20(string);=0A+}=0A+=0A=20/*=20Return=20the=20gap=20= address=20of=20BUFFER.=20=20If=20the=20gap=20size=20is=20less=20than=0A=20= =20=20=20NBYTES,=20enlarge=20the=20gap=20in=20advance.=20=20*/=0A=20=0A= @@=20-11811,6=20+11866,7=20@@=20syms_of_coding=20(void)=0A=20=20=20= defsubr=20(&Scoding_system_aliases);=0A=20=20=20defsubr=20= (&Scoding_system_eol_type);=0A=20=20=20defsubr=20= (&Scoding_system_priority_list);=0A+=20=20defsubr=20= (&Sinternal_string_to_valid_utf_8);=0A=20=0A=20=20=20DEFVAR_LISP=20= ("coding-system-list",=20Vcoding_system_list,=0A=20=09=20=20=20=20=20=20=20= doc:=20/*=20List=20of=20coding=20systems.=0Adiff=20--git=20= a/src/coding.h=20b/src/coding.h=0Aindex=20c2a7b2a00f..98f00a1731=20= 100644=0A---=20a/src/coding.h=0A+++=20b/src/coding.h=0A@@=20-709,6=20= +709,8=20@@=20#define=20UTF_16_LOW_SURROGATE_P(val)=20\=0A=20extern=20= void=20encode_coding_object=20(struct=20coding_system=20*,=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20Lisp_Object,=20ptrdiff_t,=20ptrdiff_t,=0A=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20ptrdiff_t,=20ptrdiff_t,=20Lisp_Object);=0A+extern=20= Lisp_Object=20string_to_valid_utf_8=20(Lisp_Object);=0A+=0A=20/*=20= Defined=20in=20this=20file.=20=20*/=0A=20INLINE=20int=20= surrogates_to_codepoint=20(int,=20int);=0A=20=0Adiff=20--git=20= a/src/nsfns.m=20b/src/nsfns.m=0Aindex=20628233ea0d..3e84568991=20100644=0A= ---=20a/src/nsfns.m=0A+++=20b/src/nsfns.m=0A@@=20-405,9=20+405,7=20@@=20= Turn=20the=20input=20menu=20(an=20NSMenu)=20into=20a=20lisp=20list=20for=20= tracking=20on=20lisp=20side.=0A=20=20=20NSString=20*str;=0A=20=20=20= NSView=20*view=20=3D=20FRAME_NS_VIEW=20(f);=0A=20=0A-=0A-=20=20= encoded_name=20=3D=20ENCODE_UTF_8=20(name);=0A-=0A+=20=20encoded_name=20= =3D=20string_to_valid_utf_8=20(name);=0A=20=20=20str=20=3D=20[NSString=20= stringWithUTF8String:=20SSDATA=20(encoded_name)];=0A=20=0A=20=0A@@=20= -418,7=20+416,7=20@@=20Turn=20the=20input=20menu=20(an=20NSMenu)=20into=20= a=20lisp=20list=20for=20tracking=20on=20lisp=20side.=0A=20=20=20if=20= (!STRINGP=20(f->icon_name))=0A=20=20=20=20=20encoded_icon_name=20=3D=20= encoded_name;=0A=20=20=20else=0A-=20=20=20=20encoded_icon_name=20=3D=20= ENCODE_UTF_8=20(f->icon_name);=0A+=20=20=20=20encoded_icon_name=20=3D=20= string_to_valid_utf_8=20(f->icon_name);=0A=20=0A=20=20=20str=20=3D=20= [NSString=20stringWithUTF8String:=20SSDATA=20(encoded_icon_name)];=0A=20=0A= diff=20--git=20a/test/src/coding-tests.el=20b/test/src/coding-tests.el=0A= index=20c438ae22ce..f53f63eb48=20100644=0A---=20= a/test/src/coding-tests.el=0A+++=20b/test/src/coding-tests.el=0A@@=20= -429,6=20+429,20=20@@=20coding-check-coding-systems-region=0A=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20'((iso-latin-1=203)=20= (us-ascii=201=203))))=0A=20=20=20(should-error=20= (check-coding-systems-region=20"=C3=A5"=20nil=20'(bad-coding-system))))=0A= =20=0A+(ert-deftest=20coding-string-to-valid-utf-8=20()=0A+=20=20(let=20= ((empty=20"")=0A+=20=20=20=20=20=20=20=20(valid-uni=20"Alpha")=0A+=20=20=20= =20=20=20=20=20(valid-multi=20"m\001=C3=BC=E2=88=AB=F0=9D=94=BB"))=0A+=20= =20=20=20(should=20(eq=20(internal-string-to-valid-utf-8=20empty)=20= empty))=0A+=20=20=20=20(should=20(eq=20(internal-string-to-valid-utf-8=20= valid-uni)=20valid-uni))=0A+=20=20=20=20(should=20(eq=20= (internal-string-to-valid-utf-8=20valid-multi)=20valid-multi)))=0A+=20=20= (should=20(equal=20(internal-string-to-valid-utf-8=20= "unpaired\ud9a3surrogate")=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20"unpaired\ufffdsurrogate"))=0A+=20=20(should=20(equal=20= (internal-string-to-valid-utf-8=20"raw\200\377bytes")=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20"raw\ufffd\ufffdbytes"))=0A+=20=20= (should=20(equal=20(internal-string-to-valid-utf-8=20= "all=C2=A7\300at\udffeonce")=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20"all=C2=A7\ufffdat\ufffdonce")))=0A+=0A=20;;=20Local=20= Variables:=0A=20;;=20byte-compile-warnings:=20(not=20obsolete)=0A=20;;=20= End:=0A--=20=0A2.21.1=20(Apple=20Git-122.3)=0A=0A= --Apple-Mail=_7D2C7DE5-27F7-4A73-B54D-103F8253896E--