From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14134 invoked by alias); 3 Mar 2017 07:48:22 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 40710 Received: (qmail 13589 invoked from network); 3 Mar 2017 07:48:21 -0000 X-Qmail-Scanner-Diagnostics: from new1-smtp.messagingengine.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(66.111.4.221):SA:0(-0.4/5.0):. Processed in 3.115181 secs); 03 Mar 2017 07:48:21 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-0.4 required=5.0 tests=FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS,T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: psprint3@fastmail.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at spf.messagingengine.com designates 66.111.4.221 as permitted sender) DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=fastmail.com; h= content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to:x-me-sender:x-me-sender:x-sasl-enc; s= mesmtp; bh=qlbjHzVWcNKkAcbTTfom1u1CEhg=; b=AR+xLy7EwvhqC/6VPZPJY qy+8qBabtxVtbOPtG6GiGPVO20kDkc6MgzOZ3TUlahh98tXdOiVSXsygmt1YYjm0 TVJT+YNnt22uH1NwN0c53ZRjpoPLJ8mO9IYBFhJnC4lETzRwEPn7KIHXkIVgQArq w4UkEZGIm8ONyaW1zccMdQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=content-transfer-encoding:content-type :date:from:message-id:mime-version:subject:to:x-me-sender :x-me-sender:x-sasl-enc; s=smtpout; bh=qlbjHzVWcNKkAcbTTfom1u1CE hg=; b=eK1TVZOL3ud3MPOhf5UH9coBcQIBIyu1XM/IouMvxEdjVtl5GSfqCZyWZ U/vXdqXZpnNdA4/II3ybtQvMjRBUOlYW//Tcx4r2E5fL9EdTHqY3dlX+8NleQ6wI KSv+TsXq8hYpELKC/9k1iwDPgAfvtcIE0Qnf3WpOyuMvMYb8VQ= X-ME-Sender: Message-Id: <1488527289.1339463.898969400.702FD48E@webmail.messagingengine.com> From: Sebastian Gniazdowski To: zsh-workers@zsh.org MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: multipart/mixed; boundary="_----------=_148852728913394630" X-Mailer: MessagingEngine.com Webmail Interface - ajax-715c2c0c Subject: [PATCH] errno management in curses.c Date: Thu, 02 Mar 2017 23:48:09 -0800 --_----------=_148852728913394630 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Hello, comment in curses.c says: * The observed behavior, however, is different: wgetch() consistently * returns ERR with EINTR when a signal is handled by the shell "trap" * command mechanism. Further, it consistently returns ERR twice, the * second time without even attempting to repeat the interrupted read, * which has the side-effect of NOT updating errno. A third call will * then begin reading again. * * Therefore, to properly implement signal trapping, we must (1) call * wgetch() in a loop as long as errno remains EINTR, and (2) clear * errno only before beginning the loop, not on every pass. Logic: 1. The comment assumes EINTR being not reset by curses implies the read will be "mock". It could assume that first read after EINTR will be mock based on evidence, but it quietly assumes this for all subsequent reads. - hidden assumption: errno is needed by curses to track its state after interrupt (!). 2. The comment fits getch-like-calls without timeout. The loop: while ((ret =3D wget_wch(w->win, &wi)) =3D=3D ERR) { if (errno !=3D EINTR || errflag || retflag || breaks || exit_pending) break; } will nicely detect EINTR after ERR return value, then go inside wget_ch() again indefinitely long, then receive ~ERR and jump over errno =3D=3D EINTR. It also will skip the "mock" read that author probably spotted. -> conclusion: author designed the loop only for no-timeout-reads 3. Timeouts: -> OS X, Linux man wget_wch: "In no-delay mode, if no input is waiting, the value ERR is returned.",=20 -> OS X, Linux man wtimeout: "The timeout and wtimeout routines set blocking or non-blocking read for a given window. (...) If delay is positive, then read blocks for delay milliseconds, and returns ERR if there is still no input." So, clash happens =E2=80=93=C2=A0errno is not reset (see below), ERR is ret= urned after timeout, and loop hangs. 4. Ncurses can reset or not errno. We should now note: it is the possibility-of-no-reset that matters. Not possible-reset. If there is any curses library that doesn't reset errno, then the loop is wrong. Proof for ncurses 5.4 (browse for "errno"): https://github.com/psprint/zsh-tools-private/blob/master/data/lib_getch.c 5. Library-not-resetting-errno is the standard: https://www.securecoding.cert.org/confluence/pages/viewpage.action?pageId= =3D6619179 The patch resets errno after ERR/EINTR. Removed also most of the long comment. It was hard to find solution because of that comment, it was making impression of some inherent drastic problems with diverse curses implementations, while there are none, the Linux, FreeBSD documentation just says about getch being either interrupted or not, THAT'S ALL. No internet page exists that mentions any problems here. --=20 Sebastian Gniazdowski psprint3@fastmail.com --_----------=_148852728913394630 Content-Disposition: attachment; filename="zcurses_errno.diff" Content-Id: <1488527213.1339416.56776d4ac6d3ec1442a5c575d9545141623b95d3.6E48AF9D@content.messagingengine.com> Content-Transfer-Encoding: base64 Content-Type: text/plain; name="zcurses_errno.diff" ZGlmZiAtLWdpdCBhL1NyYy9Nb2R1bGVzL2N1cnNlcy5jIGIvU3JjL01vZHVs ZXMvY3Vyc2VzLmMKaW5kZXggNjNjNjc0OC4uZDljMTliZCAxMDA2NDQKLS0t IGEvU3JjL01vZHVsZXMvY3Vyc2VzLmMKKysrIGIvU3JjL01vZHVsZXMvY3Vy c2VzLmMKQEAgLTEwODIsMTUgKzEwODIsNyBAQCB6Y2NtZF9pbnB1dChjb25z dCBjaGFyICpuYW0sIGNoYXIgKiphcmdzKQogI2VuZGlmCiAKICAgICAvKgot ICAgICAqIFNvbWUgZG9jdW1lbnRhdGlvbiBmb3Igd2dldGNoKCkgc2F5czoK LQotICAgICAgIFRoZSBiZWhhdmlvciBvZiBnZXRjaCBhbmQgZnJpZW5kcyBp biB0aGUgcHJlc2VuY2Ugb2YgIGhhbmRsZWQgIHNpZ25hbHMKLSAgICAgICBp cyAgdW5zcGVjaWZpZWQgIGluIHRoZSBTVnI0IGFuZCBYU0kgQ3Vyc2VzIGRv Y3VtZW50YXRpb24uICBVbmRlciBoaXMtCi0gICAgICAgdG9yaWNhbCBjdXJz ZXMgaW1wbGVtZW50YXRpb25zLCBpdCB2YXJpZWQgIGRlcGVuZGluZyAgb24g IHdoZXRoZXIgIHRoZQotICAgICAgIG9wZXJhdGluZyBzeXN0ZW0ncyBpbXBs ZW1lbnRhdGlvbiBvZiBoYW5kbGVkIHNpZ25hbCByZWNlaXB0IGludGVycnVw dHMKLSAgICAgICBhIHJlYWQoMikgY2FsbCBpbiBwcm9ncmVzcyBvciBub3Qs IGFuZCBhbHNvIChpbiBzb21lICBpbXBsZW1lbnRhdGlvbnMpCi0gICAgICAg ZGVwZW5kaW5nICBvbiAgd2hldGhlciAgYW4gaW5wdXQgdGltZW91dCBvciBu b24tYmxvY2tpbmcgbW9kZSBoYXMgYmVlbgotICAgICAgIHNldC4KKyAgICAg KiBMaW51eCwgT1MgWCwgRnJlZUJTRCBkb2N1bWVudGF0aW9uIGZvciB3Z2V0 Y2goKSBtZW50aW9uczoKIAogICAgICAgIFByb2dyYW1tZXJzIGNvbmNlcm5l ZCBhYm91dCBwb3J0YWJpbGl0eSBzaG91bGQgYmUgcHJlcGFyZWQgZm9yICBl aXRoZXIKICAgICAgICBvZiAgdHdvIGNhc2VzOiAoYSkgc2lnbmFsIHJlY2Vp cHQgZG9lcyBub3QgaW50ZXJydXB0IGdldGNoOyAoYikgc2lnbmFsCkBAIC0x MDk4LDIxICsxMDkwLDE2IEBAIHpjY21kX2lucHV0KGNvbnN0IGNoYXIgKm5h bSwgY2hhciAqKmFyZ3MpCiAgICAgICAgRUlOVFIuICBVbmRlciB0aGUgbmN1 cnNlcyBpbXBsZW1lbnRhdGlvbiwgaGFuZGxlZCBzaWduYWxzIG5ldmVyIGlu dGVyLQogICAgICAgIHJ1cHQgZ2V0Y2guCiAKLSAgICAgKiBUaGUgb2JzZXJ2 ZWQgYmVoYXZpb3IsIGhvd2V2ZXIsIGlzIGRpZmZlcmVudDogIHdnZXRjaCgp IGNvbnNpc3RlbnRseQotICAgICAqIHJldHVybnMgRVJSIHdpdGggRUlOVFIg d2hlbiBhIHNpZ25hbCBpcyBoYW5kbGVkIGJ5IHRoZSBzaGVsbCAidHJhcCIK LSAgICAgKiBjb21tYW5kIG1lY2hhbmlzbS4gIEZ1cnRoZXIsIGl0IGNvbnNp c3RlbnRseSByZXR1cm5zIEVSUiB0d2ljZSwgdGhlCi0gICAgICogc2Vjb25k IHRpbWUgd2l0aG91dCBldmVuIGF0dGVtcHRpbmcgdG8gcmVwZWF0IHRoZSBp bnRlcnJ1cHRlZCByZWFkLAotICAgICAqIHdoaWNoIGhhcyB0aGUgc2lkZS1l ZmZlY3Qgb2YgTk9UIHVwZGF0aW5nIGVycm5vLiAgQSB0aGlyZCBjYWxsIHdp bGwKLSAgICAgKiB0aGVuIGJlZ2luIHJlYWRpbmcgYWdhaW4uCi0gICAgICoK LSAgICAgKiBUaGVyZWZvcmUsIHRvIHByb3Blcmx5IGltcGxlbWVudCBzaWdu YWwgdHJhcHBpbmcsIHdlIG11c3QgKDEpIGNhbGwKLSAgICAgKiB3Z2V0Y2go KSBpbiBhIGxvb3AgYXMgbG9uZyBhcyBlcnJubyByZW1haW5zIEVJTlRSLCBh bmQgKDIpIGNsZWFyCi0gICAgICogZXJybm8gb25seSBiZWZvcmUgYmVnaW5u aW5nIHRoZSBsb29wLCBub3Qgb24gZXZlcnkgcGFzcy4KKyAgICAgKiBTb21l IG9ic2VydmVkIGJlaGF2aW9yOiB3Z2V0Y2goKSByZXR1cm5zIEVSUiB3aXRo IEVJTlRSIHdoZW4gYSBzaWduYWwgaXMKKyAgICAgKiBoYW5kbGVkIGJ5IHRo ZSBzaGVsbCAidHJhcCIgY29tbWFuZCBtZWNoYW5pc20uIE9ic2VydmVkIHRo YXQgaXQgcmV0dXJucworICAgICAqIEVSUiB0d2ljZSwgdGhlIHNlY29uZCB0 aW1lIHdpdGhvdXQgZXZlbiBhdHRlbXB0aW5nIHRvIHJlcGVhdCB0aGUKKyAg ICAgKiBpbnRlcnJ1cHRlZCByZWFkLiBUaGlyZCBjYWxsIHdpbGwgdGhlbiBi ZWdpbiByZWFkaW5nIGFnYWluLgogICAgICAqCi0gICAgICogVGhlcmUgcmVt YWlucyBhIHBvdGVudGlhbCBidWcgaGVyZSBpbiB0aGF0LCBpZiB0aGUgY2Fs bGVyIGhhcyBzZXQKLSAgICAgKiBhIHRpbWVvdXQgZm9yIHRoZSByZWFkIFtz ZWUgemNjbWRfdGltZW91dCgpXSB0aGUgY291bnRkb3duIGlzIHZlcnkKLSAg ICAgKiBsaWtlbHkgcmVzdGFydGVkIG9uIGV2ZXJ5IGNhbGwgdG8gd2dldGNo KCksIHNvIGFuIGludGVycnVwdGVkIGNhbGwKLSAgICAgKiBtaWdodCB3YWl0 IG11Y2ggbG9uZ2VyIHRoYW4gZGVzaXJlZC4KKyAgICAgKiBCZWNhdXNlIG9m IHdpZGVzcHJlYWQgb2YgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdGhhdCBj YWxsZWQgd2dldCpjaAorICAgICAqIHBvc3NpYmx5IGluZGVmaW5pdGVseSBt YW55IHRpbWVzIGFmdGVyIEVSUi9FSU5UUiwgYW5kIGJlY2F1c2Ugb2YgdGhl CisgICAgICogYWJvdmUgb2JzZXJ2YXRpb24sIHdnZXRfd2NoIGNhbGwgaXMg cmVwZWF0ZWQgYWZ0ZXIgZWFjaCBFUlIvRUlOVFIsIGJ1dAorICAgICAqIGVy cm5vIGlzIGJlaW5nIHJlc2V0IChpdCB3YXNuJ3QpIGFuZCB0aGUgbG9vcCB0 byBhbGwgbWVhbnMgc2hvdWxkIGJyZWFrLgorICAgICAqIFByb2JsZW06IHRo ZSB0aW1lb3V0IG1heSBiZSB3YWl0ZWQgdHdpY2UuCiAgICAgICovCiAgICAg ZXJybm8gPSAwOwogCkBAIC0xMTIwLDYgKzExMDcsNyBAQCB6Y2NtZF9pbnB1 dChjb25zdCBjaGFyICpuYW0sIGNoYXIgKiphcmdzKQogICAgIHdoaWxlICgo cmV0ID0gd2dldF93Y2gody0+d2luLCAmd2kpKSA9PSBFUlIpIHsKIAlpZiAo ZXJybm8gIT0gRUlOVFIgfHwgZXJyZmxhZyB8fCByZXRmbGFnIHx8IGJyZWFr cyB8fCBleGl0X3BlbmRpbmcpCiAJICAgIGJyZWFrOworICAgICAgICBlcnJu byA9IDA7CiAgICAgfQogICAgIHN3aXRjaCAocmV0KSB7CiAgICAgY2FzZSBP SzoKQEAgLTExNDYsNiArMTEzNCw3IEBAIHpjY21kX2lucHV0KGNvbnN0IGNo YXIgKm5hbSwgY2hhciAqKmFyZ3MpCiAgICAgd2hpbGUgKChjaSA9IHdnZXRj aCh3LT53aW4pKSA9PSBFUlIpIHsKIAlpZiAoZXJybm8gIT0gRUlOVFIgfHwg ZXJyZmxhZyB8fCByZXRmbGFnIHx8IGJyZWFrcyB8fCBleGl0X3BlbmRpbmcp CiAJICAgIHJldHVybiAxOworICAgICAgICBlcnJubyA9IDA7CiAgICAgfQog ICAgIGlmIChjaSA+PSAyNTYpIHsKIAlrZXlwYWRudW0gPSBjaTsK --_----------=_148852728913394630--