Commit 1a0d1b71f for imagemagick.org
commit 1a0d1b71f7b7f1c1900e23ea246ab9dc9d78a184
Author: Cristy <urban-warrior@imagemagick.org>
Date: Sat Sep 5 14:38:12 2026 -0400
https://github.com/ImageMagick/ImageMagick/issues/8939
diff --git a/MagickCore/utility-private.h b/MagickCore/utility-private.h
index 74e867353..288fcc761 100644
--- a/MagickCore/utility-private.h
+++ b/MagickCore/utility-private.h
@@ -93,6 +93,36 @@ static inline MagickBooleanType is_symlink_utf8(const char *path)
#endif
}
+static inline int link_utf8(const char *source,const char *destination)
+{
+ int
+ status;
+
+#if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__CYGWIN__)
+ wchar_t
+ *wide_source,
+ *wide_dest;
+
+ wide_source=ConvertUTF8ToUTF16(source);
+ wide_dest=ConvertUTF8ToUTF16(destination);
+ if ((wide_source == (wchar_t *) NULL) || (wide_dest == (wchar_t *) NULL))
+ {
+ if (wide_source != (wchar_t *) NULL)
+ free(wide_source);
+ if (wide_dest != (wchar_t *) NULL)
+ free(wide_dest);
+ errno=EINVAL;
+ return(-1);
+ }
+ status=_wlink(wide_source,wide_dest);
+ free(wide_source);
+ free(wide_dest);
+#else
+ status=link(source,destination);
+#endif
+ return(status);
+}
+
static inline ssize_t MagickRead(int fd,void *buffer,size_t extent)
{
unsigned char *p = (unsigned char *) buffer;
@@ -141,7 +171,6 @@ static inline ssize_t MagickWrite(int fd,const void *buffer,size_t extent)
return((ssize_t) offset);
}
-
static inline int open_utf8(const char *path,int flags,mode_t mode)
{
#if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index f62076f12..20bbc5370 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -3916,9 +3916,11 @@ WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
if (IsPathAccessible(backup_filename) == MagickFalse)
break;
}
- if ((IsPathAccessible(backup_filename) != MagickFalse) ||
- (rename_utf8(image->filename,backup_filename) != 0))
- *backup_filename='\0';
+ if ((IsPathAccessible(backup_filename) != MagickFalse) ||
+ (rename_utf8(image->filename,backup_filename) != 0))
+ *backup_filename='\0';
+ else
+ (void) link_utf8(backup_filename,image->filename);
}
/*
Write transmogrified image to disk.
@@ -3938,7 +3940,10 @@ WandExport MagickBooleanType MogrifyImageCommand(ImageInfo *image_info,
(void) set_file_timestamp(image->filename,&properties);
}
if (*backup_filename != '\0')
- (void) remove_utf8(backup_filename);
+ {
+ (void) remove_utf8(image->filename);
+ (void) remove_utf8(backup_filename);
+ }
}
else
if (*backup_filename != '\0')