diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-04 17:48:56 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2022-12-04 17:48:56 +0000 |
commit | c3474e39d6613d5000dcd7bb08de81e96904db53 (patch) | |
tree | 7b5138acd1afbd3069140aa8f33fe61b2fd51e3a /sys/src | |
parent | 79e9c9534592bc4948f4a0299f413d7cfa45479c (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.c | 21 |
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); } } |