summaryrefslogtreecommitdiff
path: root/core/bash/bash53-016
blob: 6aff3244c3743fb4ac2eec2dea898d27dc5931c4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
			     BASH PATCH REPORT
			     =================

Bash-Release:	5.3
Patch-ID:	bash53-016

Bug-Reported-by:	Ethan Pini <ethan@pini.dev>
Bug-Reference-ID:	<sm8ZxfcmgU7_eiVLIsjNlax7oyAwwe1_uk2vaO0hp6nypbGnV7WStfE3rrHg_RV8BMSNRhhQmS2-7TpvzPxuK1NLLEWAyL9kbsZ2cA3nqIg=@pini.dev>
Bug-Reference-URL:	https://lists.gnu.org/archive/html/bug-bash/2026-06/msg00126.html

Bug-Description:

On recent versions of macOS, the pipe size is dynamic and changes due to
system-wide total pipe usage, so we have to check whether or not bash can
use the size determined at compile time.

Patch (apply with `patch -p0'):

*** ../bash-5.3-patched/redir.c	Fri Mar  7 18:49:37 2025
--- redir.c	Tue Jul  7 11:21:09 2026
***************
*** 473,477 ****
--- 473,500 ----
  #endif
  
+ #if defined (PIPESIZE_DYNAMIC)
+       /* If we can't count on the pipe size determined at compile time to be
+ 	 constant across systems, define PIPESIZE_DYNAMIC in configure.ac.
+ 	 We set the pipe's write end to be non-blocking, try to write, and
+ 	 fall back to a temp file on error. */
+       if (sh_setnodelay (herepipe[1]) < 0)
+ 	{
+ 	  close (herepipe[0]);
+ 	  close (herepipe[1]);
+ 	  goto use_tempfile;
+ 	}
+ #endif
+       
        r = heredoc_write (herepipe[1], document, document_len);
+ 
+ #if defined (PIPESIZE_DYNAMIC)
+       if (r == ENOSPC || r == EAGAIN)
+ 	{
+ 	  close (herepipe[0]);
+ 	  close (herepipe[1]);
+ 	  goto use_tempfile;
+ 	}
+ #endif
+ 	  
        if (document != redirectee->word)
  	free (document);
*** ../bash-5.3-patched/general.c	Wed Jun 25 15:54:35 2025
--- general.c	Tue Jul  7 11:12:10 2026
***************
*** 596,599 ****
--- 596,620 ----
  }
  
+ int
+ sh_setnodelay (int fd)
+ {
+   int flags;
+ 
+   if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
+     return -1;
+ 
+   /* This is defined to O_NDELAY in filecntl.h if O_NONBLOCK is not present
+      and O_NDELAY is defined. */
+ #ifdef O_NONBLOCK
+   flags |= O_NONBLOCK;
+ #endif
+ 
+ #ifdef O_NDELAY
+   flags |= O_NDELAY;
+ #endif
+ 
+   return (fcntl (fd, F_SETFL, flags));
+ }
+ 
  /* Just a wrapper for the define in include/filecntl.h */
  int
*** ../bash-5.3-patched/general.h	Wed Jun 25 15:52:47 2025
--- general.h	Tue Jul  7 11:13:48 2026
***************
*** 318,321 ****
--- 318,322 ----
  
  extern int sh_unset_nodelay_mode (int);
+ extern int sh_setnodelay (int);
  extern int sh_setclexec (int);
  extern int sh_validfd (int);
*** ../bash-5.3-patched/configure.ac	Mon Jun 30 10:05:24 2025
--- configure.ac	Tue Jul  7 11:25:32 2026
***************
*** 1210,1214 ****
  isc*)		LOCAL_CFLAGS=-Disc386 ;;
  rhapsody*)	LOCAL_CFLAGS=-DRHAPSODY ;;
! darwin*)	LOCAL_CFLAGS=-DMACOSX ;;
  sco3.2v5*)	LOCAL_CFLAGS="-b elf -DWAITPID_BROKEN -DPATH_MAX=1024" ;;
  sco3.2v4*)	LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
--- 1210,1214 ----
  isc*)		LOCAL_CFLAGS=-Disc386 ;;
  rhapsody*)	LOCAL_CFLAGS=-DRHAPSODY ;;
! darwin*)	LOCAL_CFLAGS="-DMACOSX -DPIPESIZE_DYNAMIC" ;;
  sco3.2v5*)	LOCAL_CFLAGS="-b elf -DWAITPID_BROKEN -DPATH_MAX=1024" ;;
  sco3.2v4*)	LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
*** ../bash-5.3-patched/configure	Mon Jun 30 10:05:30 2025
--- configure	Tue Jul  7 11:25:36 2026
***************
*** 23134,23138 ****
  isc*)		LOCAL_CFLAGS=-Disc386 ;;
  rhapsody*)	LOCAL_CFLAGS=-DRHAPSODY ;;
! darwin*)	LOCAL_CFLAGS=-DMACOSX ;;
  sco3.2v5*)	LOCAL_CFLAGS="-b elf -DWAITPID_BROKEN -DPATH_MAX=1024" ;;
  sco3.2v4*)	LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
--- 23134,23138 ----
  isc*)		LOCAL_CFLAGS=-Disc386 ;;
  rhapsody*)	LOCAL_CFLAGS=-DRHAPSODY ;;
! darwin*)	LOCAL_CFLAGS="-DMACOSX -DPIPESIZE_DYNAMIC" ;;
  sco3.2v5*)	LOCAL_CFLAGS="-b elf -DWAITPID_BROKEN -DPATH_MAX=1024" ;;
  sco3.2v4*)	LOCAL_CFLAGS="-DMUST_UNBLOCK_CHLD -DPATH_MAX=1024" ;;
*** ../bash-5.3/patchlevel.h	2020-06-22 14:51:03.000000000 -0400
--- patchlevel.h	2020-10-01 11:01:28.000000000 -0400
***************
*** 26,30 ****
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 15
  
  #endif /* _PATCHLEVEL_H_ */
--- 26,30 ----
     looks for to find the patch level (for the sccs version string). */
  
! #define PATCHLEVEL 16
  
  #endif /* _PATCHLEVEL_H_ */