page: fix filedescriptor leakage
This commit is contained in:
parent
00f9b5d7f1
commit
79589ef3fb
1 changed files with 46 additions and 65 deletions
|
@ -163,6 +163,32 @@ catchnote(void *, char *msg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dupfds(int fd, ...)
|
||||||
|
{
|
||||||
|
int mfd, n, i;
|
||||||
|
va_list arg;
|
||||||
|
Dir *dir;
|
||||||
|
|
||||||
|
va_start(arg, fd);
|
||||||
|
for(mfd = 0; fd >= 0; fd = va_arg(arg, int), mfd++)
|
||||||
|
if(fd != mfd)
|
||||||
|
if(dup(fd, mfd) < 0)
|
||||||
|
sysfatal("dup: %r");
|
||||||
|
va_end(arg);
|
||||||
|
if((fd = open("/fd", OREAD)) < 0)
|
||||||
|
sysfatal("open: %r");
|
||||||
|
n = dirreadall(fd, &dir);
|
||||||
|
for(i=0; i<n; i++){
|
||||||
|
if(strstr(dir[i].name, "ctl"))
|
||||||
|
continue;
|
||||||
|
fd = atoi(dir[i].name);
|
||||||
|
if(fd >= mfd)
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
free(dir);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pipeline(int fd, char *fmt, ...)
|
pipeline(int fd, char *fmt, ...)
|
||||||
{
|
{
|
||||||
|
@ -181,17 +207,10 @@ pipeline(int fd, char *fmt, ...)
|
||||||
close(pfd[1]);
|
close(pfd[1]);
|
||||||
goto Err;
|
goto Err;
|
||||||
case 0:
|
case 0:
|
||||||
if(dup(fd, 0)<0)
|
dupfds(fd, pfd[1], 2, -1);
|
||||||
exits("dup");
|
|
||||||
if(dup(pfd[1], 1)<0)
|
|
||||||
exits("dup");
|
|
||||||
close(fd);
|
|
||||||
close(pfd[1]);
|
|
||||||
close(pfd[0]);
|
|
||||||
va_start(arg, fmt);
|
va_start(arg, fmt);
|
||||||
vsnprint(buf, sizeof buf, fmt, arg);
|
vsnprint(buf, sizeof buf, fmt, arg);
|
||||||
va_end(arg);
|
va_end(arg);
|
||||||
|
|
||||||
argv[0] = "rc";
|
argv[0] = "rc";
|
||||||
argv[1] = "-c";
|
argv[1] = "-c";
|
||||||
argv[2] = buf;
|
argv[2] = buf;
|
||||||
|
@ -267,14 +286,13 @@ popentape(Page *p)
|
||||||
|
|
||||||
seek(p->fd, 0, 0);
|
seek(p->fd, 0, 0);
|
||||||
snprint(mnt, sizeof(mnt), "/n/tapefs.%.12d%.8lux", getpid(), (ulong)p);
|
snprint(mnt, sizeof(mnt), "/n/tapefs.%.12d%.8lux", getpid(), (ulong)p);
|
||||||
switch(rfork(RFREND|RFPROC|RFFDG)){
|
switch(rfork(RFPROC|RFFDG|RFREND)){
|
||||||
case -1:
|
case -1:
|
||||||
close(p->fd);
|
close(p->fd);
|
||||||
p->fd = -1;
|
p->fd = -1;
|
||||||
return -1;
|
return -1;
|
||||||
case 0:
|
case 0:
|
||||||
dup(p->fd, 0);
|
dupfds(p->fd, 1, 2, -1);
|
||||||
close(p->fd);
|
|
||||||
argv[0] = "rc";
|
argv[0] = "rc";
|
||||||
argv[1] = "-c";
|
argv[1] = "-c";
|
||||||
snprint(cmd, sizeof(cmd), "%s -m %s /fd/0", p->data, mnt);
|
snprint(cmd, sizeof(cmd), "%s -m %s /fd/0", p->data, mnt);
|
||||||
|
@ -356,29 +374,24 @@ popenpdf(Page *p)
|
||||||
|
|
||||||
if(pipe(pfd) < 0)
|
if(pipe(pfd) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
switch(rfork(RFFDG|RFPROC|RFMEM|RFNOWAIT)){
|
switch(rfork(RFPROC|RFFDG|RFMEM|RFNOWAIT)){
|
||||||
case -1:
|
case -1:
|
||||||
close(pfd[0]);
|
close(pfd[0]);
|
||||||
close(pfd[1]);
|
close(pfd[1]);
|
||||||
return -1;
|
return -1;
|
||||||
case 0:
|
case 0:
|
||||||
close(pfd[0]);
|
|
||||||
gs = p->data;
|
gs = p->data;
|
||||||
qlock(gs);
|
qlock(gs);
|
||||||
fprint(gs->pin, "%s DoPDFPage\n"
|
dupfds(gs->pdat, gs->pin, pfd[1], -1);
|
||||||
|
fprint(1, "%s DoPDFPage\n"
|
||||||
"(/fd/3) (w) file "
|
"(/fd/3) (w) file "
|
||||||
"dup flushfile "
|
"dup flushfile "
|
||||||
"dup (THIS IS NOT AN INFERNO BITMAP\\n) writestring "
|
"dup (THIS IS NOT AN INFERNO BITMAP\\n) writestring "
|
||||||
"flushfile\n", p->label);
|
"flushfile\n", p->label);
|
||||||
while((n = read(gs->pdat, buf, sizeof buf)) > 0){
|
while((n = read(0, buf, sizeof buf)) > 0){
|
||||||
if(memcmp(buf, "THIS IS NOT AN INFERNO BITMAP\n", 30) == 0)
|
if(memcmp(buf, "THIS IS NOT AN INFERNO BITMAP\n", 30) == 0)
|
||||||
break;
|
break;
|
||||||
if(pfd[1] < 0)
|
write(2, buf, n);
|
||||||
continue;
|
|
||||||
if(write(pfd[1], buf, n) != n){
|
|
||||||
close(pfd[1]);
|
|
||||||
pfd[1]=-1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
qunlock(gs);
|
qunlock(gs);
|
||||||
exits(nil);
|
exits(nil);
|
||||||
|
@ -436,39 +449,16 @@ popengs(Page *p)
|
||||||
goto Err1;
|
goto Err1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(rfork(RFREND|RFPROC|RFFDG|RFNOWAIT)){
|
switch(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT)){
|
||||||
case -1:
|
case -1:
|
||||||
goto Err2;
|
goto Err2;
|
||||||
case 0:
|
case 0:
|
||||||
if(pdf){
|
if(pdf)
|
||||||
if(dup(pin[1], 0)<0)
|
dupfds(pin[1], pout[1], nullfd, pdat[1], ifd, -1);
|
||||||
exits("dup");
|
else
|
||||||
if(dup(pout[1], 1)<0)
|
dupfds(nullfd, nullfd, nullfd, pdat[1], ifd, -1);
|
||||||
exits("dup");
|
|
||||||
} else {
|
|
||||||
if(dup(nullfd, 0)<0)
|
|
||||||
exits("dup");
|
|
||||||
if(dup(nullfd, 1)<0)
|
|
||||||
exits("dup");
|
|
||||||
}
|
|
||||||
if(dup(nullfd, 2)<0)
|
|
||||||
exits("dup");
|
|
||||||
if(dup(pdat[1], 3)<0)
|
|
||||||
exits("dup");
|
|
||||||
if(dup(ifd, 4)<0)
|
|
||||||
exits("dup");
|
|
||||||
|
|
||||||
close(pin[0]);
|
|
||||||
close(pin[1]);
|
|
||||||
close(pout[0]);
|
|
||||||
close(pout[1]);
|
|
||||||
close(pdat[0]);
|
|
||||||
close(pdat[1]);
|
|
||||||
close(ifd);
|
|
||||||
|
|
||||||
if(p->data)
|
if(p->data)
|
||||||
pipeline(4, "%s", (char*)p->data);
|
pipeline(4, "%s", (char*)p->data);
|
||||||
|
|
||||||
argv[0] = "gs";
|
argv[0] = "gs";
|
||||||
argv[1] = "-q";
|
argv[1] = "-q";
|
||||||
argv[2] = "-sDEVICE=plan9";
|
argv[2] = "-sDEVICE=plan9";
|
||||||
|
@ -580,15 +570,8 @@ filetype(char *buf, int nbuf, char *typ, int ntyp)
|
||||||
close(ifd[1]);
|
close(ifd[1]);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(rfork(RFFDG|RFPROC|RFNOWAIT) == 0){
|
if(rfork(RFPROC|RFFDG|RFREND|RFNOWAIT) == 0){
|
||||||
dup(ifd[1], 0);
|
dupfds(ifd[1], ofd[1], 2, -1);
|
||||||
dup(ofd[1], 1);
|
|
||||||
|
|
||||||
close(ifd[1]);
|
|
||||||
close(ifd[0]);
|
|
||||||
close(ofd[1]);
|
|
||||||
close(ofd[0]);
|
|
||||||
|
|
||||||
argv[0] = "file";
|
argv[0] = "file";
|
||||||
argv[1] = "-m";
|
argv[1] = "-m";
|
||||||
argv[2] = 0;
|
argv[2] = 0;
|
||||||
|
@ -596,9 +579,9 @@ filetype(char *buf, int nbuf, char *typ, int ntyp)
|
||||||
}
|
}
|
||||||
close(ifd[1]);
|
close(ifd[1]);
|
||||||
close(ofd[1]);
|
close(ofd[1]);
|
||||||
if(rfork(RFFDG|RFPROC|RFNOWAIT) == 0){
|
if(rfork(RFPROC|RFFDG|RFNOWAIT) == 0){
|
||||||
close(ofd[0]);
|
dupfds(ifd[0], -1);
|
||||||
write(ifd[0], buf, nbuf);
|
write(0, buf, nbuf);
|
||||||
exits(nil);
|
exits(nil);
|
||||||
}
|
}
|
||||||
close(ifd[0]);
|
close(ifd[0]);
|
||||||
|
@ -1129,10 +1112,8 @@ zerox(Page *p)
|
||||||
qlock(p);
|
qlock(p);
|
||||||
if((fd = openpage(p)) < 0)
|
if((fd = openpage(p)) < 0)
|
||||||
goto Out;
|
goto Out;
|
||||||
if(rfork(RFREND|RFFDG|RFPROC|RFENVG|RFNOTEG|RFNOWAIT) == 0){
|
if(rfork(RFPROC|RFFDG|RFREND|RFENVG|RFNOTEG|RFNOWAIT) == 0){
|
||||||
dup(fd, 0);
|
dupfds(fd, 1, 2, -1);
|
||||||
close(fd);
|
|
||||||
|
|
||||||
snprint(nam, sizeof nam, "/bin/%s", argv0);
|
snprint(nam, sizeof nam, "/bin/%s", argv0);
|
||||||
argv[0] = argv0;
|
argv[0] = argv0;
|
||||||
argv[1] = "-w";
|
argv[1] = "-w";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue