1# 2# CDDL HEADER START 3# 4# The contents of this file are subject to the terms of the 5# Common Development and Distribution License (the "License"). 6# You may not use this file except in compliance with the License. 7# 8# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9# or http://www.opensolaris.org/os/licensing. 10# See the License for the specific language governing permissions 11# and limitations under the License. 12# 13# When distributing Covered Code, include this CDDL HEADER in each 14# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15# If applicable, add the following below this CDDL HEADER, with the 16# fields enclosed by brackets "[]" replaced with your own identifying 17# information: Portions Copyright [yyyy] [name of copyright owner] 18# 19# CDDL HEADER END 20# 21 22# 23# Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24# Use is subject to license terms. 25# 26 27# 28# ERRATA.txt 29# 30# Errata/problems/notes about problems in the current sources 31# 32 33######## Errata #001: ######## 34The usage of |posix_spawn()| has been manually disabled because there seems to be a 35race condition which cases sporadic failures like this: 36-- snip --. 37$ builtin | fgrep sum | fgrep sum 38/usr/ast/bin/sum 39/usr/bin/sum 40$ builtin | fgrep sum | fgrep sum 41fgrep: fgrep: cannot execute [Exec format error] 42-- snip --. 43The following files have been changed: 44-- snip -- 45Index: src/lib/libast/sparcv9/include/ast/ast_lib.h 46=================================================================== 47--- src/lib/libast/sparcv9/include/ast/ast_lib.h (revision 888) 48+++ src/lib/libast/sparcv9/include/ast/ast_lib.h (working copy) 49@@ -160,7 +160,7 @@ 50 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 51 #define _lib_vfork 1 /* vfork exists and it works */ 52 #define _real_vfork 1 /* vfork child shares data with parent */ 53-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 54+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 55 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 56 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 57 #define _hdr_string 1 /* #include <string.h> ok */ 58Index: src/lib/libast/sparcv9/src/lib/libast/ast_lib.h 59=================================================================== 60--- src/lib/libast/sparcv9/src/lib/libast/ast_lib.h (revision 888) 61+++ src/lib/libast/sparcv9/src/lib/libast/ast_lib.h (working copy) 62@@ -139,7 +139,7 @@ 63 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 64 #define _lib_vfork 1 /* vfork exists and it works */ 65 #define _real_vfork 1 /* vfork child shares data with parent */ 66-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 67+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 68 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 69 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 70 #define _hdr_string 1 /* #include <string.h> ok */ 71Index: src/lib/libast/sparcv9/src/lib/libast/FEATURE/lib 72=================================================================== 73--- src/lib/libast/sparcv9/src/lib/libast/FEATURE/lib (revision 888) 74+++ src/lib/libast/sparcv9/src/lib/libast/FEATURE/lib (working copy) 75@@ -139,7 +139,7 @@ 76 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 77 #define _lib_vfork 1 /* vfork exists and it works */ 78 #define _real_vfork 1 /* vfork child shares data with parent */ 79-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 80+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 81 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 82 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 83 #define _hdr_string 1 /* #include <string.h> ok */ 84Index: src/lib/libast/sparc/include/ast/ast_lib.h 85=================================================================== 86--- src/lib/libast/sparc/include/ast/ast_lib.h (revision 888) 87+++ src/lib/libast/sparc/include/ast/ast_lib.h (working copy) 88@@ -171,7 +171,7 @@ 89 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 90 #define _lib_vfork 1 /* vfork exists and it works */ 91 #define _real_vfork 1 /* vfork child shares data with parent */ 92-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 93+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 94 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 95 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 96 #define _hdr_string 1 /* #include <string.h> ok */ 97Index: src/lib/libast/sparc/src/lib/libast/ast_lib.h 98=================================================================== 99--- src/lib/libast/sparc/src/lib/libast/ast_lib.h (revision 888) 100+++ src/lib/libast/sparc/src/lib/libast/ast_lib.h (working copy) 101@@ -150,7 +150,7 @@ 102 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 103 #define _lib_vfork 1 /* vfork exists and it works */ 104 #define _real_vfork 1 /* vfork child shares data with parent */ 105-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 106+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 107 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 108 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 109 #define _hdr_string 1 /* #include <string.h> ok */ 110Index: src/lib/libast/sparc/src/lib/libast/FEATURE/lib 111=================================================================== 112--- src/lib/libast/sparc/src/lib/libast/FEATURE/lib (revision 888) 113+++ src/lib/libast/sparc/src/lib/libast/FEATURE/lib (working copy) 114@@ -150,7 +150,7 @@ 115 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 116 #define _lib_vfork 1 /* vfork exists and it works */ 117 #define _real_vfork 1 /* vfork child shares data with parent */ 118-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 119+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 120 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 121 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 122 #define _hdr_string 1 /* #include <string.h> ok */ 123Index: src/lib/libast/i386/include/ast/ast_lib.h 124=================================================================== 125--- src/lib/libast/i386/include/ast/ast_lib.h (revision 888) 126+++ src/lib/libast/i386/include/ast/ast_lib.h (working copy) 127@@ -171,7 +171,7 @@ 128 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 129 #define _lib_vfork 1 /* vfork exists and it works */ 130 #define _real_vfork 1 /* vfork child shares data with parent */ 131-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 132+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 133 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 134 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 135 #define _hdr_string 1 /* #include <string.h> ok */ 136Index: src/lib/libast/i386/src/lib/libast/ast_lib.h 137=================================================================== 138--- src/lib/libast/i386/src/lib/libast/ast_lib.h (revision 888) 139+++ src/lib/libast/i386/src/lib/libast/ast_lib.h (working copy) 140@@ -150,7 +150,7 @@ 141 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 142 #define _lib_vfork 1 /* vfork exists and it works */ 143 #define _real_vfork 1 /* vfork child shares data with parent */ 144-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 145+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 146 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 147 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 148 #define _hdr_string 1 /* #include <string.h> ok */ 149Index: src/lib/libast/i386/src/lib/libast/FEATURE/lib 150=================================================================== 151--- src/lib/libast/i386/src/lib/libast/FEATURE/lib (revision 888) 152+++ src/lib/libast/i386/src/lib/libast/FEATURE/lib (working copy) 153@@ -150,7 +150,7 @@ 154 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 155 #define _lib_vfork 1 /* vfork exists and it works */ 156 #define _real_vfork 1 /* vfork child shares data with parent */ 157-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 158+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 159 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 160 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 161 #define _hdr_string 1 /* #include <string.h> ok */ 162Index: src/lib/libast/amd64/include/ast/ast_lib.h 163=================================================================== 164--- src/lib/libast/amd64/include/ast/ast_lib.h (revision 888) 165+++ src/lib/libast/amd64/include/ast/ast_lib.h (working copy) 166@@ -160,7 +160,7 @@ 167 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 168 #define _lib_vfork 1 /* vfork exists and it works */ 169 #define _real_vfork 1 /* vfork child shares data with parent */ 170-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 171+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 172 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 173 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 174 #define _hdr_string 1 /* #include <string.h> ok */ 175Index: src/lib/libast/amd64/src/lib/libast/ast_lib.h 176=================================================================== 177--- src/lib/libast/amd64/src/lib/libast/ast_lib.h (revision 888) 178+++ src/lib/libast/amd64/src/lib/libast/ast_lib.h (working copy) 179@@ -139,7 +139,7 @@ 180 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 181 #define _lib_vfork 1 /* vfork exists and it works */ 182 #define _real_vfork 1 /* vfork child shares data with parent */ 183-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 184+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 185 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 186 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 187 #define _hdr_string 1 /* #include <string.h> ok */ 188Index: src/lib/libast/amd64/src/lib/libast/FEATURE/lib 189=================================================================== 190--- src/lib/libast/amd64/src/lib/libast/FEATURE/lib (revision 888) 191+++ src/lib/libast/amd64/src/lib/libast/FEATURE/lib (working copy) 192@@ -139,7 +139,7 @@ 193 #define _hdr_unistd 1 /* #include <unistd.h> ok */ 194 #define _lib_vfork 1 /* vfork exists and it works */ 195 #define _real_vfork 1 /* vfork child shares data with parent */ 196-#define _lib_posix_spawn 2 /* posix_spawn exists and it works and its worth using */ 197+#define _lib_posix_spawn 1 /* posix_spawn exists and it works and its worth using */ 198 #define _stream_peek 1 /* ioctl(I_PEEK) works */ 199 #define _socket_peek 1 /* recv(MSG_PEEK) works */ 200 #define _hdr_string 1 /* #include <string.h> ok */ 201-- snip -- 202 203 204######## Errata #002: ######## 205A workaround was added for a problem with the "multiline" editor mode which 206occurs when the edit line becomes longer than the terminal's width and the 207terminal cursor is not at position 0 when PS1 is send to the terminal. 208 209For example: The user executes a $ printf "foo"<enter> # the prompt will start 210at position 3 instead of 0. If the user enters a command which is longer than 211the terminal width and then removes enougth characters that the edit line fits 212again into one line the "foo" at the beginning will be overwritten with the 213prompt. 214 215The workaround is to add $(printf "%*s\r%s" COLUMNS "") at the beginning of 216PS1 set by /etc/ksh.kshrc, this causes the shell to move to the beginning 217of the next line if the terminal cursor is not at position 0. 218 219 220######## Errata #003: ######## 221A fix was backported to cure sporadic VSC test suite failures. The failures are 222generated when command substitutions+functions are executed in a nested manner 223- sometimes the return code is non-zero even if the called function explicitly 224contains a "return 0"-statement. 225The following files have been changed: 226-- snip -- 227Index: src/lib/libshell/common/sh/jobs.c 228=================================================================== 229--- src/lib/libshell/common/sh/jobs.c (revision 1284) 230+++ src/lib/libshell/common/sh/jobs.c (working copy) 231@@ -1224,6 +1224,8 @@ 232 job_lock(); 233 if(pid > 1) 234 { 235+ if(pid==sh.spid) 236+ sh.spid = 0; 237 if(!(pw=job_bypid(pid))) 238 { 239 /* check to see whether job status has been saved */ 240-- snip -- 241 242 243######## Errata #004: ######## 244A fix was backported to cure a hang in a command substitution when the 245amount of data exceeds a certain amount of data (this was causing 246the hang in CR #6800929 ("snv_106 ksh93 update breaks Install(1M)")). 247The following files have been changed: 248-- snip -- 249Index: src/lib/libshell/common/include/defs.h 250=================================================================== 251--- src/lib/libshell/common/include/defs.h (revision 1391) 252+++ src/lib/libshell/common/include/defs.h (working copy) 253@@ -166,6 +166,7 @@ 254 char winch; \ 255 char indebug; /* set when in debug trap */ \ 256 unsigned char lastsig; /* last signal received */ \ 257+ char subshare; /* set when in ${..} comsub */ \ 258 char *readscript; /* set before reading a script */ \ 259 int *inpipe; /* input pipe pointer */ \ 260 int *outpipe; /* output pipe pointer */ \ 261Index: src/lib/libshell/common/sh/subshell.c 262=================================================================== 263--- src/lib/libshell/common/sh/subshell.c (revision 1391) 264+++ src/lib/libshell/common/sh/subshell.c (working copy) 265@@ -89,6 +89,7 @@ 266 int coutpipe; 267 int cpipe; 268 int nofork; 269+ char subshare; 270 } *subshell_data; 271 272 static int subenv; 273@@ -477,7 +478,9 @@ 274 sp->bckpid = shp->bckpid; 275 if(comsub) 276 sh_stats(STAT_COMSUB); 277- if(!comsub || (comsub==1 && !sh_isoption(SH_SUBSHARE))) 278+ sp->subshare = shp->subshare; 279+ shp->subshare = comsub==2 || (comsub==1 && sh_isoption(SH_SUBSHARE)); 280+ if(!comsub || !shp->subshare) 281 { 282 sp->shpwd = shp->pwd; 283 sp->pwd = (shp->pwd?strdup(shp->pwd):0); 284@@ -677,6 +680,7 @@ 285 shp->cpipe[1] = sp->cpipe; 286 shp->coutpipe = sp->coutpipe; 287 } 288+ shp->subshare = sp->subshare; 289 if(shp->subshell) 290 SH_SUBSHELLNOD->nvalue.s = --shp->subshell; 291 if(sp->sig) 292Index: src/lib/libshell/common/sh/xec.c 293=================================================================== 294--- src/lib/libshell/common/sh/xec.c (revision 1391) 295+++ src/lib/libshell/common/sh/xec.c (working copy) 296@@ -1406,7 +1406,12 @@ 297 pid_t savepgid = job.curpgid; 298 job.curpgid = 0; 299 if(shp->subshell) 300- sh_subtmpfile(1); 301+ { 302+ if(shp->subshare) 303+ sh_subtmpfile(0); 304+ else 305+ sh_subfork(); 306+ } 307 shp->inpipe = pvo; 308 shp->outpipe = pvn; 309 pvo[1] = -1; 310-- snip -- 311#EOF. 312