Introduction
Introduction Statistics Contact Development Disclaimer Help
ed: Open output file for writing - sbase - suckless unix tools
git clone git://git.suckless.org/sbase
Log
Files
Refs
README
LICENSE
---
commit 67a00c86f97f672c9fbceba9ad7ac1f747cca10b
parent feeb6e32792b1e4611a9a57476417fcf6b49e6c8
Author: Roberto E. Vargas Caballero <[email protected]>
Date: Fri, 22 Sep 2023 19:44:54 +0200
ed: Open output file for writing
Fopen() and Popen() were open as read streams, but we were writing
in both cases. In the same way, the FILE pointer returned by popen()
was close with fclose() that can lead to file descriptor leaks and
zombie processes.
Diffstat:
M ed.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
---
diff --git a/ed.c b/ed.c
@@ -623,14 +623,16 @@ dowrite(const char *fname, int trunc)
{
FILE *fp;
size_t bytecount = 0;
- int i, line;
+ int i, r, line, sh;
if(fname[0] == '!') {
+ sh = 1;
fname++;
- if((fp = popen(fname, "r")) == NULL)
- error("Bad Exec");
+ if((fp = popen(fname, "w")) == NULL)
+ error("bad exec");
} else {
- if ((fp = fopen(fname, "r")) == NULL)
+ sh = 0;
+ if ((fp = fopen(fname, "w")) == NULL)
error("cannot open input file");
}
@@ -642,7 +644,9 @@ dowrite(const char *fname, int trunc)
}
curln = line2;
- if (fclose(fp))
+
+ r = sh ? pclose(fp) : fclose(fp);
+ if (r)
error("input/output error");
strcpy(savfname, fname);
modflag = 0;
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.