summaryrefslogtreecommitdiff
path: root/sys/src
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2022-12-04 17:48:56 +0000
committercinap_lenrek <cinap_lenrek@felloff.net>2022-12-04 17:48:56 +0000
commitc3474e39d6613d5000dcd7bb08de81e96904db53 (patch)
tree7b5138acd1afbd3069140aa8f33fe61b2fd51e3a /sys/src
parent79e9c9534592bc4948f4a0299f413d7cfa45479c (diff)
kernel: free exec temporary stack segment under seglock
On error, we must free the temporary stack segment while holding up->seglock.
Diffstat (limited to 'sys/src')
-rw-r--r--sys/src/9/port/sysproc.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c
index c948cfcba..52c1acf6f 100644
--- a/sys/src/9/port/sysproc.c
+++ b/sys/src/9/port/sysproc.c
@@ -321,11 +321,6 @@ sysexec(va_list list)
/* Disaster after commit */
if(up->seg[SSEG] == nil)
pexit(up->errstr, 1);
- s = up->seg[ESEG];
- if(s != nil){
- putseg(s);
- up->seg[ESEG] = nil;
- }
nexterror();
}
align = BY2PG-1;
@@ -451,6 +446,11 @@ sysexec(va_list list)
*/
qlock(&up->seglock);
if(waserror()){
+ s = up->seg[ESEG];
+ if(s != nil){
+ up->seg[ESEG] = nil;
+ putseg(s);
+ }
qunlock(&up->seglock);
nexterror();
}
@@ -524,15 +524,18 @@ sysexec(va_list list)
* Special segments are maintained across exec
*/
for(i = SSEG; i <= BSEG; i++) {
- putseg(up->seg[i]);
- /* prevent a second free if we have an error */
- up->seg[i] = nil;
+ s = up->seg[i];
+ if(s != nil) {
+ /* prevent a second free if we have an error */
+ up->seg[i] = nil;
+ putseg(s);
+ }
}
for(i = ESEG+1; i < NSEG; i++) {
s = up->seg[i];
if(s != nil && (s->type&SG_CEXEC) != 0) {
- putseg(s);
up->seg[i] = nil;
+ putseg(s);
}
}