M carrera/main.c => carrera/main.c +1 -4
@@ 357,10 357,7 @@ userinit(void)
p->pgrp = newpgrp();
p->egrp = smalloc(sizeof(Egrp));
p->egrp->ref = 1;
- p->fgrp = smalloc(sizeof(Fgrp));
- p->fgrp->ref = 1;
- p->fgrp->fd = smalloc(DELTAFD*sizeof(Chan*));
- p->fgrp->nfd = DELTAFD;
+ p->fgrp = dupfgrp(nil);
p->rgrp = newrgrp();
p->procmode = 0640;
M pc/main.c => pc/main.c +1 -4
@@ 232,10 232,7 @@ userinit(void)
p->pgrp = newpgrp();
p->egrp = smalloc(sizeof(Egrp));
p->egrp->ref = 1;
- p->fgrp = smalloc(sizeof(Fgrp));
- p->fgrp->ref = 1;
- p->fgrp->fd = smalloc(DELTAFD*sizeof(Chan*));
- p->fgrp->nfd = DELTAFD;
+ p->fgrp = dupfgrp(nil);
p->rgrp = newrgrp();
p->procmode = 0640;
M port/devdup.c => port/devdup.c +1 -1
@@ 13,7 13,7 @@ dupgen(Chan *c, Dirtab*, int, int s, Dir *dp)
Chan *f;
static int perm[] = { 0400, 0200, 0600, 0 };
- if(s >= fgrp->maxfd)
+ if(s > fgrp->maxfd)
return -1;
if((f=fgrp->fd[s]) == 0)
return 0;
M port/pgrp.c => port/pgrp.c +13 -2
@@ 167,15 167,26 @@ dupfgrp(Fgrp *f)
int i;
new = smalloc(sizeof(Fgrp));
+ if(f == nil){
+ new->fd = smalloc(DELTAFD*sizeof(Chan*));
+ new->nfd = DELTAFD;
+ new->ref = 1;
+ return new;
+ }
+
+ lock(f);
/* Make new fd list shorter if possible, preserving quantization */
new->nfd = f->maxfd+1;
i = new->nfd%DELTAFD;
if(i != 0)
new->nfd += DELTAFD - i;
- new->fd = smalloc(new->nfd*sizeof(Chan*));
+ new->fd = malloc(new->nfd*sizeof(Chan*));
+ if(new->fd == 0){
+ unlock(f);
+ error("no memory for fgrp");
+ }
new->ref = 1;
- lock(f);
new->maxfd = f->maxfd;
for(i = 0; i <= f->maxfd; i++) {
if(c = f->fd[i]){
M port/sysfile.c => port/sysfile.c +4 -1
@@ 30,11 30,14 @@ newfd(Chan *c)
* of fid in 9P
*/
if(f->nfd >= 5000){
+ Exhausted:
unlock(f);
exhausted("file descriptors");
return -1;
}
- newfd = smalloc((f->nfd+DELTAFD)*sizeof(Chan*));
+ newfd = malloc((f->nfd+DELTAFD)*sizeof(Chan*));
+ if(newfd == 0)
+ goto Exhausted;
oldfd = f->fd;
memmove(newfd, oldfd, f->nfd*sizeof(Chan*));
f->fd = newfd;
M port/sysproc.c => port/sysproc.c +3 -6
@@ 55,8 55,7 @@ sysrfork(ulong *arg)
else
if(flag & RFCFDG) {
ofg = up->fgrp;
- up->fgrp = smalloc(sizeof(Fgrp));
- up->fgrp->ref = 1;
+ up->fgrp = dupfgrp(nil);
closefgrp(ofg);
}
if(flag & RFNOTEG)
@@ 105,10 104,8 @@ sysrfork(ulong *arg)
if(flag & (RFFDG|RFCFDG)) {
if(flag & RFFDG)
p->fgrp = dupfgrp(up->fgrp);
- else {
- p->fgrp = smalloc(sizeof(Fgrp));
- p->fgrp->ref = 1;
- }
+ else
+ p->fgrp = dupfgrp(nil);
}
else {
p->fgrp = up->fgrp;