Heredoc can block trying to write to pipe under Darwin/XNU

Ethan Pini <[email protected]> Sun, 28 Jun 2026 06:10:38 +0000
Newsgroups gmane.comp.shells.bash.bugs
Message-ID <sm8ZxfcmgU7_eiVLIsjNlax7oyAwwe1_uk2vaO0hp6nypbGnV7WStfE3rrHg_RV8BMSNRhhQmS2-7TpvzPxuK1NLLEWAyL9kbsZ2cA3nqIg=@pini.dev>
--b1=_Ul13REIx5cRR5KwzgrX4GsPcpTLzOO3yWanKmvzm7Q
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Configuration Information [Automatically generated, do not change]:
Machine: aarch64
OS: darwin24.2.0
Compiler: gcc
Compilation CFLAGS: -g -O2
uname output: Darwin MacBookPro.lan.internal 24.2.0 Darwin Kernel
              Version 24.2.0: Fri Dec  6 19:01:59 PST 2024;
              root:xnu-11215.61.5~2/RELEASE_ARM64_T6000 arm64
Machine Type: aarch64-apple-darwin24.2.0

Bash Version: 5.3
Patch Level: 15
Release Status: release

Description:
        In the XNU kernel versions 6153.11.26 and later on macOS,
        the size of pipe buffers are dynamic. Defined in the source
        code under bsd/kern/sys_pipe.c as the `pipesize_blocks`
        variable [1], there are 7 possible capacities:

            512, 1024, 2048, 4096, 8192, 16384, 65536

        Of these, only the 512-byte size appears to be guaranteed.
        The kernel can expand a pipe to one of the larger capacities,
        but it will only do so if the total capacity of all pipes on
        the system is less than [2] the 16 MiB `maxpipekva` high-water
        mark defined at build time [3].

        A brief look at the code responsible for pipe sizing ([2])
        suggests that it should be possible for a pipe's buffer to
        initially be allocated at one of the larger capacities, but
        this is only the case when writing into `pipefds[0]`. The
        buffer for the "normal" direction is immediately allocated
        when the pipe is created [4].

        The kernel's behavior of no longer expanding pipes when the
        high-water mark is reached causes bash to hang when writing
        medium-sized (512 B < size < 64 KiB) heredocs. This is due to
        an optimization in Bash 5.1+ where `here_document_to_fd` in
        redir.c will write the heredoc into a pipe if its smaller
        than the `HEREDOC_PIPESIZE` constant computed at build time.

        When bash is built on a macOS system where the high-water
        mark hasn't been reached, the max pipe size will be detected
        as 64 KiB. If the high-water mark is later reached and bash
        tries to write a medium-sized heredoc into a pipe, it will
        block due to the pipe only having a 512-byte capacity.

Repeat-By:
        1. Use a macOS system running XNU 6153 (macOS 10.15) or later.

        2. Create and hold 16 MiB worth of pipes. The most consistent
           way to do this is to create a small program that tries to
           open 256 pipes and write 64K of data into each of them.
           I included such a program in the 0002-*.patch attachment.

        3. In a separate terminal window, run bash and try to pipe a
           513-byte heredoc or herestring into `cat`. It should not
           end up printing anything and will instead just hang until
           interrupted with Ctrl+C.

               bash -c 'cat <<< "$(printf %0513d 0)"'

Fix:
        The simplest fix is to add `-DHEREDOC_PIPESIZE=3D512` to the
        compiler flags when building bash for Darwin. A more
        comprehensive fix would be to have `here_document_to_fd`
        set the pipe as O_NONBLOCK and fall back to using a tempfile
        if the write into the pipe was only partial.

        I implemented both of these along with a regression test and
        have attached them as patch files based on commit b4608166 from
        the git repo hosted at https://savannah.gnu.org/git/?group=3Dbash

        When creating the patches, I tried to follow any existing
        conventions that I noticed in the source code. This is the first
        time I have written a patch for bash, though, so please let me
        know if I missed anything.

Citations:
        [1]: https://github.com/apple-oss-distributions/xnu/blob/f6217f891a=
c0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/sys_pipe.c#L307
        [2]: https://github.com/apple-oss-distributions/xnu/blob/f6217f891a=
c0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/sys_pipe.c#L956-L960
        [3]: https://github.com/apple-oss-distributions/xnu/blob/f6217f891a=
c0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/sys_pipe.c#L241
        [4]: https://github.com/apple-oss-distributions/xnu/blob/f6217f891a=
c0bb64f3d375211650a4c1ff8ca1ea/bsd/kern/sys_pipe.c#L633-L638

P.S. If the attached patch files end up lost somewhere along the way, I als=
o
made a GitHub gist containing them: https://gist.github.com/eth-p/40d763ce3=
eb13293c2ba4a6848af06de
--b1=_Ul13REIx5cRR5KwzgrX4GsPcpTLzOO3yWanKmvzm7Q
Content-Type: application/octet-stream; name=0002-add-regression-test.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=0002-add-regression-test.patch

RnJvbSBlYmFkYTMxMWFhZjYzOTNiMDI3ZjliMTJhZTgzNTYyNmRlYTY3NjJjIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFdGhhbiBQaW5pIDxldGhhbkBwaW5pLmRldj4KRGF0ZTogU2F0
LCAyNyBKdW4gMjAyNiAyMDoxOToyMyAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggMi8zXSBhZGQgcmVn
cmVzc2lvbiB0ZXN0IGZvciBwaXBlIGNhcGFjaXR5IGJlaGF2aW9yIG9uIE1hYwoKLS0tCiBNYWtl
ZmlsZS5pbiAgICAgICAgICAgfCAgIDggKystCiBzdXBwb3J0L01ha2VmaWxlLmluICAgfCAgIDIg
Ky0KIHN1cHBvcnQvZmlsbHBpcGVrdmEuYyB8IDE0MCArKysrKysrKysrKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysKIHRlc3RzL2hlcmVkb2MucmlnaHQgICB8ICAxMCArKy0KIHRlc3Rz
L2hlcmVkb2MudGVzdHMgICB8ICAgMyArCiB0ZXN0cy9oZXJlZG9jMTEuc3ViICAgfCAgNDMgKysr
KysrKysrKysrKwogNiBmaWxlcyBjaGFuZ2VkLCAyMDIgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlv
bnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzdXBwb3J0L2ZpbGxwaXBla3ZhLmMKIGNyZWF0ZSBt
b2RlIDEwMDY0NCB0ZXN0cy9oZXJlZG9jMTEuc3ViCgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaW4g
Yi9NYWtlZmlsZS5pbgppbmRleCBjNGE4ODJmNy4uYTU1YTU0MGUgMTAwNjQ0Ci0tLSBhL01ha2Vm
aWxlLmluCisrKyBiL01ha2VmaWxlLmluCkBAIC01OTUsOSArNTk1LDEwIEBAIFBPX0RJUiA9ICQo
ZG90KS9wby8KIFNVUFBPUlRfU1JDID0gJChzcmNkaXIpL3N1cHBvcnQvCiBTVVBQT1JUX0RJUiA9
ICQoZG90KS9zdXBwb3J0CiAKLVRFU1RTX1NVUFBPUlQgPSByZWNobyQoRVhFRVhUKSB6ZWNobyQo
RVhFRVhUKSBwcmludGVudiQoRVhFRVhUKSB4Y2FzZSQoRVhFRVhUKQorVEVTVFNfU1VQUE9SVCA9
IHJlY2hvJChFWEVFWFQpIHplY2hvJChFWEVFWFQpIHByaW50ZW52JChFWEVFWFQpIHhjYXNlJChF
WEVFWFQpIFwKKwkJICBmaWxscGlwZWt2YSQoRVhFRVhUKQogQ1JFQVRFRF9TVVBQT1JUID0gc2ln
bmFtZXMuaCByZWNobyQoRVhFRVhUKSB6ZWNobyQoRVhFRVhUKSBwcmludGVudiQoRVhFRVhUKSBc
Ci0JCSAgdGVzdHMvcmVjaG8kKEVYRUVYVCkgdGVzdHMvemVjaG8kKEVYRUVYVCkgXAorCQkgIHRl
c3RzL3JlY2hvJChFWEVFWFQpIHRlc3RzL3plY2hvJChFWEVFWFQpIHRlc3RzL2ZpbGxwaXBla3Zh
JChFWEVFWFQpIFwKIAkJICB0ZXN0cy9wcmludGVudiQoRVhFRVhUKSB4Y2FzZSQoRVhFRVhUKSB0
ZXN0cy94Y2FzZSQoRVhFRVhUKSBcCiAJCSAgbWtzaWduYW1lcyQoRVhFRVhUKSBsc2lnbmFtZXMu
aCBcCiAJCSAgbWtzeW50YXgke0VYRUVYVH0gc3ludGF4LmMgJChWRVJTUFJPRykgJChWRVJTT0JK
KSBcCkBAIC0xMDc2LDYgKzEwNzcsOSBAQCBwcmludGVudiQoRVhFRVhUKToJJChTVVBQT1JUX1NS
QylwcmludGVudi5jCiB4Y2FzZSQoRVhFRVhUKToJJChTVVBQT1JUX1NSQyl4Y2FzZS5jCiAJQCQo
Q0NfRk9SX0JVSUxEKSAkKENDRkxBR1NfRk9SX0JVSUxEKSAke0xERkxBR1NfRk9SX0JVSUxEfSAt
byAkQCAkKFNVUFBPUlRfU1JDKXhjYXNlLmMgJHtMSUJTX0ZPUl9CVUlMRH0KIAorZmlsbHBpcGVr
dmEkKEVYRUVYVCk6CSQoU1VQUE9SVF9TUkMpZmlsbHBpcGVrdmEuYworCUAkKENDX0ZPUl9CVUlM
RCkgJChDQ0ZMQUdTX0ZPUl9CVUlMRCkgJHtMREZMQUdTX0ZPUl9CVUlMRH0gLW8gJEAgJChTVVBQ
T1JUX1NSQylmaWxscGlwZWt2YS5jICR7TElCU19GT1JfQlVJTER9CisKIHRlc3QgdGVzdHMgY2hl
Y2s6CWZvcmNlICQoUHJvZ3JhbSkgJChURVNUU19TVVBQT1JUKQogCUAtdGVzdCAtZCB0ZXN0cyB8
fCBta2RpciB0ZXN0cwogCUBjcCAkKFRFU1RTX1NVUFBPUlQpIHRlc3RzCmRpZmYgLS1naXQgYS9z
dXBwb3J0L01ha2VmaWxlLmluIGIvc3VwcG9ydC9NYWtlZmlsZS5pbgppbmRleCAyOGZhNjEwZS4u
NGRjOWE1MDIgMTAwNjQ0Ci0tLSBhL3N1cHBvcnQvTWFrZWZpbGUuaW4KKysrIGIvc3VwcG9ydC9N
YWtlZmlsZS5pbgpAQCAtMiw3ICsyLDcgQEAKICMgU2ltcGxlIE1ha2VmaWxlIGZvciB0aGUgc3Vw
cG9ydCBwcm9ncmFtcy4KICMKICMgZG9jdW1lbnRhdGlvbiBzdXBwb3J0OiBtYW4yaHRtbAotIyB0
ZXN0aW5nIHN1cHBvcnQ6IHByaW50ZW52IHJlY2hvIHplY2hvIHhjYXNlCisjIHRlc3Rpbmcgc3Vw
cG9ydDogcHJpbnRlbnYgcmVjaG8gemVjaG8geGNhc2UgZmlsbHBpcGVrdmEKICMKICMgYmFzaGJ1
Zy5zaCBsaXZlcyBoZXJlIChjcmVhdGVkIGJ5IGNvbmZpZ3VyZSksIGJ1dCBiYXNoYnVnIGlzIGNy
ZWF0ZWQgYnkKICMgdGhlIHRvcC1sZXZlbCBtYWtlZmlsZQpkaWZmIC0tZ2l0IGEvc3VwcG9ydC9m
aWxscGlwZWt2YS5jIGIvc3VwcG9ydC9maWxscGlwZWt2YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwLi4zMjdlMWI3MQotLS0gL2Rldi9udWxsCisrKyBiL3N1cHBvcnQvZmls
bHBpcGVrdmEuYwpAQCAtMCwwICsxLDE0MCBAQAorLyogZmlsbHBpcGVrdmEuYyAtLSBwdXNoIGFt
b3VudHBpcGVrdmEgcGFzdCBtYXhwaXBla3ZhIG9uIG1hY09TLiAqLworCisvKiBDb3B5cmlnaHQg
KEMpIDIwMjYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorCisgICBCYXNoIGlz
IGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAg
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVy
c2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKworICAgQmFzaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIEJh
c2guICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisqLworCisj
aWZkZWYgTUFDT1NYCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNp
bmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5o
PgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qIERlZmluZWQgaW4gYXBwbGUtb3NzLWRpc3RyaWJ1
dGlvbnMveG51IEAgZmY4Y2ExZWEuCisgICBic2Qvc3lzL3BpcGUuaDo3NCAgICAgICAtLSBgI2Rl
ZmluZSBQSVBFX1NJWkUgMTYzODRgCisgICBic2Qva2Vybi9zeXNfcGlwZS5jOjMwNyAtLSBgUElQ
RV9TSVpFICogNGAKKyAgICovCisjZGVmaW5lIFhOVV9QSVBFU0laRV9CTE9DS1NfTUFYICgxMDI0
KjY0KQorCisvKiBEZWZpbmVkIGluIGFwcGxlLW9zcy1kaXN0cmlidXRpb25zL3hudSBAIGZmOGNh
MWVhLgorICAgYnNkL3N5cy9waXBlLmg6NzcgICAgICAgLS0gYCNkZWZpbmUgUElQRV9LVkFNQVgg
KDEwMjQgKiAxMDI0ICogMTYpYAorICAgKi8KKyNkZWZpbmUgWE5VX1BJUEVfS1ZBTUFYICAoMTAy
NCoxMDI0KjE2KQorCisjZGVmaW5lIFBJUEVTX05FRURFRCAgKChYTlVfUElQRV9LVkFNQVggLyBY
TlVfUElQRVNJWkVfQkxPQ0tTX01BWCkgKyAxKQorI2RlZmluZSBGRFNfTkVFREVEICAgIChQSVBF
U19ORUVERUQgKiAyKQorCitpbnQKK3NldF9ub25ibG9jayAoaW50IGZkKQoreworICBpbnQgZmw7
CisgIGZsID0gZmNudGwgKGZkLCBGX0dFVEZMLCAwKTsKKyAgaWYgKGZsIDwgMCkKKyAgeworICAg
IHJldHVybiBmbDsKKyAgfQorCisgIHJldHVybiBmY250bCAoZmQsIEZfU0VURkwsIGZsIHwgT19O
T05CTE9DSyk7Cit9CisKK2ludAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBj
aGFyKiBidWY7CisgIGludCogZmRzOworICBzaXplX3Qgbnc7CisgIHNpemVfdCBud190b3RhbDsK
KyAgc3NpemVfdCByZW1haW5zOworICBpbnQgbnBpcGVzLCBuZmRzOworICBpbnQgcGlwZWZkc1sy
XTsKKworICBidWYgPSBjYWxsb2MgKFhOVV9QSVBFU0laRV9CTE9DS1NfTUFYLCAxKTsKKyAgaWYg
KGJ1ZiA9PSBOVUxMKQorICB7CisgICAgcHJpbnRmICgiZXJyb3IgYWxsb2NhdGluZyBidWZmZXI6
ICVzXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKKyAgICBleGl0ICgxKTsKKyAgfQorCisgIGZkcyA9
IGNhbGxvYyAoRkRTX05FRURFRCwgc2l6ZW9mKGludCkpOworICBpZiAoZmRzID09IE5VTEwpCisg
IHsKKyAgICBwcmludGYgKCJlcnJvciBhbGxvY2F0aW5nIGJ1ZmZlcjogJXNcbiIsIHN0cmVycm9y
IChlcnJubykpOworICAgIGV4aXQgKDEpOworICB9CisKKyAgcHJpbnRmICgiY3JlYXRpbmcgJWQg
JWQtYnl0ZSBwaXBlcy4uLlxuIiwKKyAgICBQSVBFU19ORUVERUQsIFhOVV9QSVBFU0laRV9CTE9D
S1NfTUFYKTsKKworICBmb3IgKG5waXBlcyA9IDA7IG5waXBlcyA8IFBJUEVTX05FRURFRDsgbnBp
cGVzKyspCisgIHsKKyAgICBpZiAocGlwZSAocGlwZWZkcykgPCAwKQorICAgIHsKKyAgICAgIHBy
aW50ZiAoImNvdWxkIG5vdCBjcmVhdGUgbW9yZSBwaXBlczogJXNcbiIsIHN0cmVycm9yIChlcnJu
bykpOworICAgICAgcHJpbnRmICgidHJ5IGluY3JlYXNpbmcgZGVzY3JpcHRvciBsaW1pdCB2aWEg
dWxpbWl0XG4iKTsKKyAgICAgIGV4aXQgKDEpOworICAgIH0KKworICAgIGZkc1tuZmRzXSA9IHBp
cGVmZHNbMF07CisgICAgZmRzW25mZHMrMV0gPSBwaXBlZmRzWzFdOworICAgIG5mZHMgKz0gMjsK
KworICAgIGlmIChzZXRfbm9uYmxvY2socGlwZWZkc1sxXSkgPCAwKQorICAgIHsKKyAgICAgIHBy
aW50ZiAoImVycm9yIHNldHRpbmcgcGlwZSBhcyBub25ibG9ja2luZzogJXNcbiIsIHN0cmVycm9y
IChlcnJubykpOworICAgICAgZXhpdCAoMSk7CisgICAgfQorCisgICAgLyogSWYgYW1vdW50cGlw
ZWt2YSA8IG1heHBpcGVrdmEsIHRoZSBmdWxsIDY0SyB3aWxsIGJlIHdyaXR0ZW4uICovCisgICAg
bncgPSB3cml0ZSAocGlwZWZkc1sxXSwgYnVmLCBYTlVfUElQRVNJWkVfQkxPQ0tTX01BWCk7Cisg
ICAgaWYgKG53ID09IFhOVV9QSVBFU0laRV9CTE9DS1NfTUFYKQorICAgIHsKKyAgICAgIG53X3Rv
dGFsICs9IG53OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLyogSWYgbm90LCB3ZSBo
YXZlIHB1c2hlZCBhbW91bnRwaXBla3ZhIHBhc3QgbWF4cGlwZWt2YS4gKi8KKyAgICBwcmludGYg
KCJmaWxsZWQgd2l0aCAlbGQgYnl0ZXMgKCVkIHBpcGVzKVxuIiwgbndfdG90YWwsIG5waXBlcyk7
CisKKyAgICAvKiBPdGhlciBwcm9jZXNzZXMgY2xvc2luZyBwaXBlcyBjYW4gY2F1c2UgYW1vdW50
cGlwZWt2YSB0byBnbyBiYWNrCisgICAgICAgYmVsb3cgbWF4cGlwZWt2YS4gS2VlcCB0cnlpbmcg
dG8gZmlsbCBpdCB1bnRpbCB0aGlzIHByb2Nlc3MgaXMKKyAgICAgICBpbnRlbnRpb25hbGx5IGlu
dGVycnVwdGVkIGJ5IHRoZSB1c2VyLiAqLworICAgIHNzaXplX3QgcmVtYWlucyA9IFhOVV9QSVBF
U0laRV9CTE9DS1NfTUFYIC0gbnc7CisgICAgd2hpbGUgKHJlbWFpbnMgPiAwKQorICAgIHsKKyAg
ICAgIG53ID0gd3JpdGUgKHBpcGVmZHNbMV0sIGJ1ZiwgcmVtYWlucyk7CisgICAgICBpZiAobncg
Pj0gMCkKKyAgICAgIHsKKyAgICAgICAgcmVtYWlucyAtPSBudzsKKyAgICAgIH0KKyAgICB9Cisg
IH0KKworICBleGl0ICgwKTsKK30KKworCisjZWxzZSAvKiBpZmRlZiBNQUNPU1ggKi8KKworaW50
IG1haW4oKQoreworICAvKiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgdG8gdGhlIFhOVSBrZXJuZWwn
cyBiZWhhdmlvci4gKi8KKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBpZmRlZiBNQUNPU1gg
Ki8KZGlmZiAtLWdpdCBhL3Rlc3RzL2hlcmVkb2MucmlnaHQgYi90ZXN0cy9oZXJlZG9jLnJpZ2h0
CmluZGV4IDIxNGVmNTIwLi45OTM1MjY1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvaGVyZWRvYy5yaWdo
dAorKysgYi90ZXN0cy9oZXJlZG9jLnJpZ2h0CkBAIC0xNjEsOCArMTYxLDE2IEBAIGhlcmUtZG9j
IGxpbmUgMQogaGVyZS1kb2MgbGluZSAyCiBoZXJlLWRvY3VtZW50CiBoZXJlLWRvY3VtZW50Citj
aGVja2luZyA1MTItYnl0ZSBoZXJlZG9jIGZvciBoYW5nCitjaGVja2luZyAxMDI0LWJ5dGUgaGVy
ZWRvYyBmb3IgaGFuZworY2hlY2tpbmcgMjA0OC1ieXRlIGhlcmVkb2MgZm9yIGhhbmcKK2NoZWNr
aW5nIDQwOTYtYnl0ZSBoZXJlZG9jIGZvciBoYW5nCitjaGVja2luZyA4MTkyLWJ5dGUgaGVyZWRv
YyBmb3IgaGFuZworY2hlY2tpbmcgMTYzODQtYnl0ZSBoZXJlZG9jIGZvciBoYW5nCitjaGVja2lu
ZyA2NTUzNi1ieXRlIGhlcmVkb2MgZm9yIGhhbmcKK2NoZWNraW5nIDY1NTM3LWJ5dGUgaGVyZWRv
YyBmb3IgaGFuZwogY29tc3ViIGhlcmUtc3RyaW5nCi0uL2hlcmVkb2MudGVzdHM6IGxpbmUgMTg0
OiB3YXJuaW5nOiBoZXJlLWRvY3VtZW50IGF0IGxpbmUgMTgxIGRlbGltaXRlZCBieSBlbmQtb2Yt
ZmlsZSAod2FudGVkIGAnKQorLi9oZXJlZG9jLnRlc3RzOiBsaW5lIDE4Nzogd2FybmluZzogaGVy
ZS1kb2N1bWVudCBhdCBsaW5lIDE4NCBkZWxpbWl0ZWQgYnkgZW5kLW9mLWZpbGUgKHdhbnRlZCBg
JykKIGhpCiB0aGVyZQogJycKZGlmZiAtLWdpdCBhL3Rlc3RzL2hlcmVkb2MudGVzdHMgYi90ZXN0
cy9oZXJlZG9jLnRlc3RzCmluZGV4IGQ2NDMxYjhhLi5lZjBhN2EzMiAxMDA2NDQKLS0tIGEvdGVz
dHMvaGVyZWRvYy50ZXN0cworKysgYi90ZXN0cy9oZXJlZG9jLnRlc3RzCkBAIC0xNzEsNiArMTcx
LDkgQEAgJHtUSElTX1NIfSAuL2hlcmVkb2M5LnN1YgogIyB0ZXN0IHZhcmlvdXMgY29tYmluYXRp
b25zIG9mIGhlcmUtZG9jdW1lbnRzIGFuZCBhbGlhc2VzCiAke1RISVNfU0h9IC4vaGVyZWRvYzEw
LnN1YgogCisjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgYmFzaCdzIGludGVyYWN0aW9uIHdpdGggbWFj
T1MgZHluYW1pYyBwaXBlIGNhcGFjaXRpZXMKKyR7VEhJU19TSH0gLi9oZXJlZG9jMTEuc3ViCisK
IGVjaG8gJCgKIAljYXQgPDw8ICJjb21zdWIgaGVyZS1zdHJpbmciCiApCmRpZmYgLS1naXQgYS90
ZXN0cy9oZXJlZG9jMTEuc3ViIGIvdGVzdHMvaGVyZWRvYzExLnN1YgpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMC4uZmJhMWM3NzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9o
ZXJlZG9jMTEuc3ViCkBAIC0wLDAgKzEsNDMgQEAKKyMgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBz
b2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyAgIGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5CisjICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24g
MyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorIyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyAgIEdOVSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjICAgWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgICBh
bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcv
bGljZW5zZXMvPi4KKyMKKyMgVGVzdCBoZXJlIGRvY3VtZW50cyB0byBlbnN1cmUgdGhleSBkb24n
dCBoYW5nIGF0IHZhcmlvdXMgc2l6ZXMuCisjIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRlc3QgZm9y
IGhvdyBiYXNoIGludGVyYWN0cyB3aXRoIG1hY09TJ3MgZHluYW1pYworIyBwaXBlIGNhcGFjaXRp
ZXMuCisKKyMgc3RhcnQgYmFja2dyb3VuZCB0ZXN0IGhlbHBlciB0byBmaWxsIHBpcGVrdmEKKyhm
aWxscGlwZWt2YSA+L2Rldi9udWxsKSAmCitmaWxscGlwZWt2YV9waWQ9JCEKK3NsZWVwIDEKKwor
IyBzdGFydCBiYWNrZ3JvdW5kIHN1YnNoZWxsIHRvIGZhaWwgdGhlIHRlc3QgYWZ0ZXIgNSBzZWNv
bmRzCisoCisgICAgc2xlZXAgNQorICAgIGVjaG8gdGltZW91dAorICAgIGtpbGwgLVBJUEUgJCQg
Jj4vZGV2L251bGwKKyAgICBraWxsICRmaWxscGlwZWt2YV9waWQgJj4vZGV2L251bGwKKykgJgor
dGltZW91dF9waWQ9JCEKKworIyBUcnkgd3JpdGluZyBhdCBldmVyeSBwaXBlc2l6ZSBibG9jayAo
YW5kIHBhc3QgaXQpCisjIFNlZSBic2Qva2Vybi9zeXNfcGlwZS5jIGxpbmUgMzA3IGF0IGNvbW1p
dCBmZjhjYTFlYQorIyBvZiBhcHBsZS1vc3MtZGlzdHJpYnV0aW9ucy94bnUgZm9yIHRoZSBsaXN0
IG9mIHNpemVzLgorZm9yIHNpemUgaW4gNTEyIDEwMjQgMjA0OCA0MDk2IDgxOTIgMTYzODQgNjU1
MzYgNjU1MzcKK2RvCisgICAgZWNobyAiY2hlY2tpbmcgJHtzaXplfS1ieXRlIGhlcmVkb2MgZm9y
IGhhbmciCisgICAgY2F0ID4vZGV2L251bGwgPDw8JChwcmludGYgIiUwJCgoc2l6ZS0xKSlkIiAw
KQorZG9uZQorCisjIENsZWFudXAKK2tpbGwgJGZpbGxwaXBla3ZhX3BpZCAmPi9kZXYvbnVsbAor
a2lsbCAkdGltZW91dF9waWQgJj4vZGV2L251bGwKLS0gCjIuNDkuMAoK

--b1=_Ul13REIx5cRR5KwzgrX4GsPcpTLzOO3yWanKmvzm7Q
Content-Type: application/octet-stream; name=0003-nonblocking-write-fix.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=0003-nonblocking-write-fix.patch

RnJvbSBkODkwNTgzZWNjY2QxYTAzNWNkNjA5YTE5ZmY5MTBhZjhjNzk3YjdlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFdGhhbiBQaW5pIDxldGhhbkBwaW5pLmRldj4KRGF0ZTogU2F0
LCAyNyBKdW4gMjAyNiAyMDo0Njo0NiAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggMy8zXSBub24tYmxv
Y2tpbmcgd3JpdGUgaW5zdGVhZCBvZiBsaW1pdGluZyBIRVJFRE9DX1BJUEVTSVpFCiBvbiBNYWMK
Ci0tLQogY29uZmlndXJlICAgIHwgIDIgKy0KIGNvbmZpZ3VyZS5hYyB8ICAyICstCiBnZW5lcmFs
LmMgICAgfCAxNSArKysrKysrKysrKysrKysKIGdlbmVyYWwuaCAgICB8ICAxICsKIHJlZGlyLmMg
ICAgICB8IDIyICsrKysrKysrKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgNDAgaW5z
ZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25m
aWd1cmUKaW5kZXggZTFiMzU0N2QuLjAzN2VlZWQ0IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysr
IGIvY29uZmlndXJlCkBAIC0yMzEzMyw3ICsyMzEzMyw3IEBAIGhwdXgqKQkJTE9DQUxfQ0ZMQUdT
PSItREhQVVggLURUR0VURU5UX0JST0tFTiAtRFRHRVRGTEFHX0JST0tFTiIgOzsKIGRndXgqKQkJ
TE9DQUxfQ0ZMQUdTPS1EX0RHVVhfU09VUkNFOyBMT0NBTF9MSUJTPS1sZGdjIDs7CiBpc2MqKQkJ
TE9DQUxfQ0ZMQUdTPS1EaXNjMzg2IDs7CiByaGFwc29keSopCUxPQ0FMX0NGTEFHUz0tRFJIQVBT
T0RZIDs7Ci1kYXJ3aW4qKQlMT0NBTF9DRkxBR1M9Ii1ETUFDT1NYIC1ESEVSRURPQ19QSVBFU0la
RT01MTIiOzsKK2RhcndpbiopCUxPQ0FMX0NGTEFHUz0iLURNQUNPU1ggLURQSVBFU0laRV9EWU5B
TUlDIjs7CiBzY28zLjJ2NSopCUxPQ0FMX0NGTEFHUz0iLWIgZWxmIC1EV0FJVFBJRF9CUk9LRU4g
LURQQVRIX01BWD0xMDI0IiA7Owogc2NvMy4ydjQqKQlMT0NBTF9DRkxBR1M9Ii1ETVVTVF9VTkJM
T0NLX0NITEQgLURQQVRIX01BWD0xMDI0IiA7Owogc2NvMy4yKikJTE9DQUxfQ0ZMQUdTPS1ETVVT
VF9VTkJMT0NLX0NITEQgOzsKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5h
YwppbmRleCAwYjlhZGM4Zi4uYjUzYWExZDIgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysg
Yi9jb25maWd1cmUuYWMKQEAgLTEyMDksNyArMTIwOSw3IEBAIGhwdXgqKQkJTE9DQUxfQ0ZMQUdT
PSItREhQVVggLURUR0VURU5UX0JST0tFTiAtRFRHRVRGTEFHX0JST0tFTiIgOzsKIGRndXgqKQkJ
TE9DQUxfQ0ZMQUdTPS1EX0RHVVhfU09VUkNFOyBMT0NBTF9MSUJTPS1sZGdjIDs7CiBpc2MqKQkJ
TE9DQUxfQ0ZMQUdTPS1EaXNjMzg2IDs7CiByaGFwc29keSopCUxPQ0FMX0NGTEFHUz0tRFJIQVBT
T0RZIDs7Ci1kYXJ3aW4qKQlMT0NBTF9DRkxBR1M9Ii1ETUFDT1NYIC1ESEVSRURPQ19QSVBFU0la
RT01MTIiOzsKK2RhcndpbiopCUxPQ0FMX0NGTEFHUz0iLURNQUNPU1ggLURQSVBFU0laRV9EWU5B
TUlDIjs7CiBzY28zLjJ2NSopCUxPQ0FMX0NGTEFHUz0iLWIgZWxmIC1EV0FJVFBJRF9CUk9LRU4g
LURQQVRIX01BWD0xMDI0IiA7Owogc2NvMy4ydjQqKQlMT0NBTF9DRkxBR1M9Ii1ETVVTVF9VTkJM
T0NLX0NITEQgLURQQVRIX01BWD0xMDI0IiA7Owogc2NvMy4yKikJTE9DQUxfQ0ZMQUdTPS1ETVVT
VF9VTkJMT0NLX0NITEQgOzsKZGlmZiAtLWdpdCBhL2dlbmVyYWwuYyBiL2dlbmVyYWwuYwppbmRl
eCBhZWZmZGE1Yy4uYWJkMzJhYjEgMTAwNjQ0Ci0tLSBhL2dlbmVyYWwuYworKysgYi9nZW5lcmFs
LmMKQEAgLTYwOSw2ICs2MDksMjEgQEAgc2hfdmFsaWRmZCAoaW50IGZkKQogICByZXR1cm4gKGZj
bnRsIChmZCwgRl9HRVRGRCwgMCkgPj0gMCk7CiB9CiAKKy8qIFNldCBPX05PTkJMT0NLIG9uIGZp
bGUgZGVzY3JpcHRvciBGRC4gKi8KK2ludAorc2hfc2V0bm9uYmxvY2sgKGludCBmZCkKK3sKKyAg
aW50IGZsOworCisgIGZsID0gZmNudGwgKGZkLCBGX0dFVEZMLCAwKTsKKyAgaWYgKGZsIDwgMCkK
KyAgeworICAgIHJldHVybiBmbDsKKyAgfQorCisgIHJldHVybiBmY250bCAoZmQsIEZfU0VURkws
IGZsIHwgT19OT05CTE9DSyk7Cit9CisKIGludAogZmRfaXNwaXBlIChpbnQgZmQpCiB7CmRpZmYg
LS1naXQgYS9nZW5lcmFsLmggYi9nZW5lcmFsLmgKaW5kZXggNWIxZWFjMDguLjJjOTM2YTNiIDEw
MDY0NAotLS0gYS9nZW5lcmFsLmgKKysrIGIvZ2VuZXJhbC5oCkBAIC0zMTgsNiArMzE4LDcgQEAg
ZXh0ZXJuIGludCBhc3NpZ25tZW50IChjb25zdCBjaGFyICosIGludCk7CiAKIGV4dGVybiBpbnQg
c2hfdW5zZXRfbm9kZWxheV9tb2RlIChpbnQpOwogZXh0ZXJuIGludCBzaF9zZXRjbGV4ZWMgKGlu
dCk7CitleHRlcm4gaW50IHNoX3NldG5vbmJsb2NrIChpbnQpOwogZXh0ZXJuIGludCBzaF92YWxp
ZGZkIChpbnQpOwogZXh0ZXJuIGludCBmZF9pc3BpcGUgKGludCk7CiBleHRlcm4gdm9pZCBjaGVj
a19kZXZfdHR5ICh2b2lkKTsKZGlmZiAtLWdpdCBhL3JlZGlyLmMgYi9yZWRpci5jCmluZGV4IDM0
MzUzNmI3Li5kYTExYmJhOSAxMDA2NDQKLS0tIGEvcmVkaXIuYworKysgYi9yZWRpci5jCkBAIC00
NzIsNyArNDcyLDI5IEBAIGhlcmVfZG9jdW1lbnRfdG9fZmQgKFdPUkRfREVTQyAqcmVkaXJlY3Rl
ZSwgZW51bSByX2luc3RydWN0aW9uIHJpKQogCX0KICNlbmRpZgogCisjaWYgZGVmaW5lZCAoUElQ
RVNJWkVfRFlOQU1JQykKKyAgICAgIC8qIFBpcGUgY2FwYWNpdHkgbWF5IGJlIHNtYWxsZXIgdGhh
biBkZXRlY3RlZCBhdCBidWlsZCB0aW1lLiBTZXQKKyAgICAgICAgIE9fTk9OQkxPQ0sgb24gdGhl
IHdyaXRlIGVuZCBhbmQgbWFrZSBhIGJlc3QtZWZmb3J0IGF0dGVtcHQsCisgICAgICAgICBmYWxs
aW5nIGJhY2sgdG8gYSB0ZW1wZmlsZSBpZiBpdCB3b3VsZCBvdGhlcndpc2UgYmxvY2suICovCisg
ICAgICBpZiAoc2hfc2V0bm9uYmxvY2sgKGhlcmVwaXBlWzFdKSA8IDApCisgICAgICB7CisgICAg
ICAgIGNsb3NlIChoZXJlcGlwZVswXSk7CisgICAgICAgIGNsb3NlIChoZXJlcGlwZVsxXSk7Cisg
ICAgICAgIGdvdG8gdXNlX3RlbXBmaWxlOworICAgICAgfQorI2VuZGlmCisKICAgICAgIHIgPSBo
ZXJlZG9jX3dyaXRlIChoZXJlcGlwZVsxXSwgZG9jdW1lbnQsIGRvY3VtZW50X2xlbik7CisKKyNp
ZiBkZWZpbmVkIChQSVBFU0laRV9EWU5BTUlDKQorICAgICAgaWYgKHIgPT0gRU5PU1BDIC8qIHNl
dCBieSBoZXJlZG9jX3dyaXRlIGlmIHdyaXR0ZW4gIT0gaGVyZWxlbiAqLykKKyAgICAgIHsKKyAg
ICAgICAgY2xvc2UgKGhlcmVwaXBlWzBdKTsKKyAgICAgICAgY2xvc2UgKGhlcmVwaXBlWzFdKTsK
KyAgICAgICAgZ290byB1c2VfdGVtcGZpbGU7CisgICAgICB9CisjZW5kaWYKKwogICAgICAgaWYg
KGRvY3VtZW50ICE9IHJlZGlyZWN0ZWUtPndvcmQpCiAJZnJlZSAoZG9jdW1lbnQpOwogICAgICAg
Y2xvc2UgKGhlcmVwaXBlWzFdKTsKLS0gCjIuNDkuMAoK

--b1=_Ul13REIx5cRR5KwzgrX4GsPcpTLzOO3yWanKmvzm7Q
Content-Type: application/octet-stream; name=0001-simple-fix.patch
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=0001-simple-fix.patch

RnJvbSBmZjQwMDlhMWNmOWEyMjdlNWMwYzVmZjRmNTE2OGI2NWRhMmIyNTdkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBFdGhhbiBQaW5pIDxldGhhbkBwaW5pLmRldj4KRGF0ZTogU2F0
LCAyNyBKdW4gMjAyNiAxMzo0Mzo1MSAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggMS8zXSBmaXggYnVn
IHdoZXJlIGhlcmVkb2MgY2FuIGhhbmcgb24gTWFjCgotLS0KIGNvbmZpZ3VyZSAgICB8IDIgKy0K
IGNvbmZpZ3VyZS5hYyB8IDIgKy0KIDIgZmlsZXMgY2hhbmdlZCwgMiBpbnNlcnRpb25zKCspLCAy
IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCBh
MjhhM2ZjZi4uZTFiMzU0N2QgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUK
QEAgLTIzMTMzLDcgKzIzMTMzLDcgQEAgaHB1eCopCQlMT0NBTF9DRkxBR1M9Ii1ESFBVWCAtRFRH
RVRFTlRfQlJPS0VOIC1EVEdFVEZMQUdfQlJPS0VOIiA7OwogZGd1eCopCQlMT0NBTF9DRkxBR1M9
LURfREdVWF9TT1VSQ0U7IExPQ0FMX0xJQlM9LWxkZ2MgOzsKIGlzYyopCQlMT0NBTF9DRkxBR1M9
LURpc2MzODYgOzsKIHJoYXBzb2R5KikJTE9DQUxfQ0ZMQUdTPS1EUkhBUFNPRFkgOzsKLWRhcndp
biopCUxPQ0FMX0NGTEFHUz0tRE1BQ09TWCA7OworZGFyd2luKikJTE9DQUxfQ0ZMQUdTPSItRE1B
Q09TWCAtREhFUkVET0NfUElQRVNJWkU9NTEyIjs7CiBzY28zLjJ2NSopCUxPQ0FMX0NGTEFHUz0i
LWIgZWxmIC1EV0FJVFBJRF9CUk9LRU4gLURQQVRIX01BWD0xMDI0IiA7Owogc2NvMy4ydjQqKQlM
T0NBTF9DRkxBR1M9Ii1ETVVTVF9VTkJMT0NLX0NITEQgLURQQVRIX01BWD0xMDI0IiA7Owogc2Nv
My4yKikJTE9DQUxfQ0ZMQUdTPS1ETVVTVF9VTkJMT0NLX0NITEQgOzsKZGlmZiAtLWdpdCBhL2Nv
bmZpZ3VyZS5hYyBiL2NvbmZpZ3VyZS5hYwppbmRleCA1YTc2MjY3ZS4uMGI5YWRjOGYgMTAwNjQ0
Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUuYWMKQEAgLTEyMDksNyArMTIwOSw3
IEBAIGhwdXgqKQkJTE9DQUxfQ0ZMQUdTPSItREhQVVggLURUR0VURU5UX0JST0tFTiAtRFRHRVRG
TEFHX0JST0tFTiIgOzsKIGRndXgqKQkJTE9DQUxfQ0ZMQUdTPS1EX0RHVVhfU09VUkNFOyBMT0NB
TF9MSUJTPS1sZGdjIDs7CiBpc2MqKQkJTE9DQUxfQ0ZMQUdTPS1EaXNjMzg2IDs7CiByaGFwc29k
eSopCUxPQ0FMX0NGTEFHUz0tRFJIQVBTT0RZIDs7Ci1kYXJ3aW4qKQlMT0NBTF9DRkxBR1M9LURN
QUNPU1ggOzsKK2RhcndpbiopCUxPQ0FMX0NGTEFHUz0iLURNQUNPU1ggLURIRVJFRE9DX1BJUEVT
SVpFPTUxMiI7Owogc2NvMy4ydjUqKQlMT0NBTF9DRkxBR1M9Ii1iIGVsZiAtRFdBSVRQSURfQlJP
S0VOIC1EUEFUSF9NQVg9MTAyNCIgOzsKIHNjbzMuMnY0KikJTE9DQUxfQ0ZMQUdTPSItRE1VU1Rf
VU5CTE9DS19DSExEIC1EUEFUSF9NQVg9MTAyNCIgOzsKIHNjbzMuMiopCUxPQ0FMX0NGTEFHUz0t
RE1VU1RfVU5CTE9DS19DSExEIDs7Ci0tIAoyLjQ5LjAKCg==

--b1=_Ul13REIx5cRR5KwzgrX4GsPcpTLzOO3yWanKmvzm7Q--