postgres.git / summary / log / commit / refs
commit e03c6d93bfabc6606a8778b253ae31f2c3ee849d
Author: Noah Misch <noah@leadboat.com>
Date: Sun Mar 12 23:35:31 2017 +0000
Fix pg_file_write() error handling.
Detect fclose() failures; given "ln -s /dev/full $PGDATA/devfull",
"pg_file_write('devfull', 'x', true)" now fails as it should. Don't
leak a stream when fwrite() fails. Remove a born-ineffective test that
aimed to skip zero-length writes. Back-patch to 9.2 (all supported
versions).
contrib/adminpack/adminpack.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
diff --git a/contrib/adminpack/adminpack.c b/contrib/adminpack/adminpack.c
index ded89c60590..23751f380f4 100644
--- a/contrib/adminpack/adminpack.c
+++ b/contrib/adminpack/adminpack.c
@@ -141,10 +141,10 @@ pg_file_write(PG_FUNCTION_ARGS)
(ERRCODE_DUPLICATE_FILE,
errmsg("file \"%s\" exists", filename)));
- f = fopen(filename, "wb");
+ f = AllocateFile(filename, "wb");
}
else
- f = fopen(filename, "ab");
+ f = AllocateFile(filename, "ab");
if (!f)
ereport(ERROR,
@@ -152,16 +152,11 @@ pg_file_write(PG_FUNCTION_ARGS)
errmsg("could not open file \"%s\" for writing: %m",
filename)));
- if (VARSIZE(data) != 0)
- {
- count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f);
-
- if (count != VARSIZE(data) - VARHDRSZ)
- ereport(ERROR,
- (errcode_for_file_access(),
- errmsg("could not write file \"%s\": %m", filename)));
- }
- fclose(f);
+ count = fwrite(VARDATA(data), 1, VARSIZE(data) - VARHDRSZ, f);
+ if (count != VARSIZE(data) - VARHDRSZ || FreeFile(f))
+ ereport(ERROR,
+ (errcode_for_file_access(),
+ errmsg("could not write file \"%s\": %m", filename)));
PG_RETURN_INT64(count);
}
[parent: f6cfc14e5ad3]