From 89c6d290799428717256d663d9e5fc25eb192a9e Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Mon, 5 Nov 2018 10:38:15 +0000 Subject: [PATCH] add comments re. temp file open bug --- libvips/iofuncs/image.c | 8 ++++---- libvips/iofuncs/vips.c | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/libvips/iofuncs/image.c b/libvips/iofuncs/image.c index e4489778..99893a11 100644 --- a/libvips/iofuncs/image.c +++ b/libvips/iofuncs/image.c @@ -3077,13 +3077,13 @@ vips_image_rewind_output( VipsImage *image ) /* Now we've finished writing and reopened as read, we can * delete-on-close. * - * On *nix-like systems, this will unlink the file - * from the filesystem and when we exit, for whatever reason, the file + * On *nix-like systems, this will unlink the file from the + * filesystem and when we exit, for whatever reason, the file * we be reclaimed. * * On Windows this will fail because the file is open and you can't - * delete open files. However, on Windows we set O_TEMP, so the file - * will be deleted when the fd is finally closed. + * delete open files. However, on Windows we set _O_TEMPORARY, so the + * file will be deleted when the fd is finally closed. */ vips_image_delete( image ); diff --git a/libvips/iofuncs/vips.c b/libvips/iofuncs/vips.c index 2c59f807..e7d71378 100644 --- a/libvips/iofuncs/vips.c +++ b/libvips/iofuncs/vips.c @@ -137,7 +137,6 @@ * * We use O_RDWR not O_WRONLY since after writing we may want to rewind the * image and read from it. - * */ #define MODE_WRITE BINARYIZE (O_RDWR | O_CREAT | O_TRUNC) @@ -187,12 +186,15 @@ vips__open_image_write( const char *filename, gboolean temp ) int flags; int fd; - flags = MODE_WRITE; fd = -1; #ifdef O_TMPFILE /* Linux-only extension creates an unlinked file. CREAT and TRUNC must * be clear. The filename arg to open() must name a directory. + * + * This can fail since not all filesystems support it. In this case, + * we open as a regular file and rely on the delete-on-close + * mechanism, see vips_image_delete(). */ if( temp ) { char *dirname; @@ -203,10 +205,11 @@ vips__open_image_write( const char *filename, gboolean temp ) } #endif /*O_TMPFILE*/ + flags = MODE_WRITE; + #ifdef _O_TEMPORARY - /* On Windows, setting _O_TEMPORARY gets the file automatically - * deleted on process exit, even if the processes crashes. See - * vips_image_rewind() for what we do to help on *nix. + /* On Windows, setting _O_TEMPORARY will delete the file automatically + * on process exit, even if the processes crashes. */ if( temp ) flags |= _O_TEMPORARY;