devproc: fix close and closefiles procctl

for the CMclose procctl, the fd number was not
bounds checked before indexing in the Fgrp.fd
array.

for the CMclosefiles, we looped fd from 0..maxfd-1,
but need to loop from 0..maxfd as maxfd is inclusive.
This commit is contained in:
cinap_lenrek 2014-05-26 22:43:21 +02:00
parent c5214cd6d9
commit 89acedb9b8

View file

@ -1270,14 +1270,23 @@ procstopwait(Proc *p, int ctl)
error(Eprocdied); error(Eprocdied);
} }
static void void
procctlcloseone(Proc *p, Fgrp *f, int fd) procctlclosefiles(Proc *p, int all, int fd)
{ {
Fgrp *f;
Chan *c; Chan *c;
if(fd < 0)
error(Ebadfd);
f = p->fgrp;
if(f == nil)
error(Eprocdied);
lock(f);
f->ref++;
while(fd <= f->maxfd){
c = f->fd[fd]; c = f->fd[fd];
if(c == nil) if(c != nil){
return;
f->fd[fd] = nil; f->fd[fd] = nil;
unlock(f); unlock(f);
qunlock(&p->debug); qunlock(&p->debug);
@ -1285,24 +1294,10 @@ procctlcloseone(Proc *p, Fgrp *f, int fd)
qlock(&p->debug); qlock(&p->debug);
lock(f); lock(f);
} }
if(!all)
void break;
procctlclosefiles(Proc *p, int all, int fd) fd++;
{ }
int i;
Fgrp *f;
f = p->fgrp;
if(f == nil)
error(Eprocdied);
lock(f);
f->ref++;
if(all)
for(i = 0; i < f->maxfd; i++)
procctlcloseone(p, f, i);
else
procctlcloseone(p, f, fd);
unlock(f); unlock(f);
closefgrp(f); closefgrp(f);
} }