Skip to content

Commit 1b64bc4

Browse files
committed
handle fwrite() errors more gracefully
1 parent 2b42f97 commit 1b64bc4

File tree

3 files changed

+12
-5
lines changed

3 files changed

+12
-5
lines changed

src/duc/cmd-cgi.c

+5-3
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,11 @@ static void include_file(const char *fname)
257257
printf("<!-- start include -->\n");
258258
for(;;) {
259259
char buf[4096];
260-
size_t n = fread(buf, 1, sizeof(buf), f);
261-
if(n == 0) break;
262-
fwrite(buf, 1, n, stdout);
260+
size_t in = fread(buf, 1, sizeof(buf), f);
261+
if(in == 0) break;
262+
size_t out = fwrite(buf, 1, in, stdout);
263+
if(out == 0) break;
264+
if(out < in) break;
263265
}
264266
printf("<!-- end include -->\n");
265267
fclose(f);

src/duc/main.c

+3-1
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ static void printi(const char *s, int pos, int indent, int max)
211211
const char *p1 = s;
212212
const char *p2 = s;
213213
int i;
214+
int out;
214215

215216
while(*p1) {
216217
while(*p2 && !isspace(*p2)) p2++;
@@ -222,7 +223,8 @@ static void printi(const char *s, int pos, int indent, int max)
222223
pos = indent;
223224
}
224225

225-
fwrite(p1, l, 1, stdout);
226+
out = fwrite(p1, l, 1, stdout);
227+
if (out == 0) break;
226228
while(*p2 && isspace(*p2)) p2++;
227229
pos += l;
228230
if(pos < max) {

src/libduc-graph/graph-cairo.c

+4-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,10 @@ struct cairo_backend_data {
4141
static cairo_status_t cairo_writer(void *closure, const unsigned char *data, unsigned int length)
4242
{
4343
FILE *f = closure;
44-
fwrite(data, length, 1, f);
44+
size_t out = fwrite(data, length, 1, f);
45+
if (out == 0 || out < length) {
46+
return CAIRO_STATUS_WRITE_ERROR;
47+
}
4548
return CAIRO_STATUS_SUCCESS;
4649
}
4750

0 commit comments

Comments
 (0)