diff options
author | Todd C. Miller <millert@cvs.openbsd.org> | 2020-07-20 18:57:20 +0000 |
---|---|---|
committer | Todd C. Miller <millert@cvs.openbsd.org> | 2020-07-20 18:57:20 +0000 |
commit | 9f82ebd77a4718260beec1aaa6b401125d492555 (patch) | |
tree | 67da7f29a88f4fbe83918bb82656a10252a504cf /usr.bin/awk/run.c | |
parent | 79d7c51d638887c3eb7157f2be65ebaab49fe34c (diff) |
If closefile() is called on std{in,out,err}, freopen() /dev/null instead.
Otherwise, awk will continue trying to perform I/O on a closed stdio stream.
This appears to be consistent with how gawk behaves. OK tim@
Diffstat (limited to 'usr.bin/awk/run.c')
-rw-r--r-- | usr.bin/awk/run.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/usr.bin/awk/run.c b/usr.bin/awk/run.c index a826182672e..357a79ccb71 100644 --- a/usr.bin/awk/run.c +++ b/usr.bin/awk/run.c @@ -1,4 +1,4 @@ -/* $OpenBSD: run.c,v 1.64 2020/07/20 18:55:15 millert Exp $ */ +/* $OpenBSD: run.c,v 1.65 2020/07/20 18:57:19 millert Exp $ */ /**************************************************************** Copyright (C) Lucent Technologies 1997 All Rights Reserved @@ -1950,7 +1950,10 @@ const char *filename(FILE *fp) continue; if (ferror(files[i].fp)) FATAL("i/o error occurred on %s", files[i].fname); - if (files[i].mode == '|' || files[i].mode == LE) + if (files[i].fp == stdin || files[i].fp == stdout || + files[i].fp == stderr) + stat = freopen("/dev/null", "r+", files[i].fp) == NULL; + else if (files[i].mode == '|' || files[i].mode == LE) stat = pclose(files[i].fp) == -1; else stat = fclose(files[i].fp) == EOF; @@ -1960,6 +1963,7 @@ const char *filename(FILE *fp) xfree(files[i].fname); files[i].fname = NULL; /* watch out for ref thru this */ files[i].fp = NULL; + break; } tempfree(x); x = gettemp(); |