]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix image filename encoding issues (bug#48902)
authorAlan Third <alan@idiocy.org>
Tue, 8 Jun 2021 19:08:34 +0000 (20:08 +0100)
committerAlan Third <alan@idiocy.org>
Wed, 9 Jun 2021 11:54:58 +0000 (12:54 +0100)
* src/image.c (image_find_image_fd): Don't return an encoded filename
string.
* src/nsfns.m: ([NSString stringWithLispString:]): Clarify usage
comment.
* src/nsimage.m ([EmacsImage allocInitFromFile:]): No need to encode
the filename when converting to NSString.

src/image.c
src/nsfns.m
src/nsimage.m

index b34dc3e9161cd2ec19b804b29edca18f387d1e67..07de4d31aa89d1d5efb6c059610e27078a5a35d6 100644 (file)
@@ -3153,19 +3153,16 @@ image_find_image_fd (Lisp_Object file, int *pfd)
   /* Try to find FILE in data-directory/images, then x-bitmap-file-path.  */
   fd = openp (search_path, file, Qnil, &file_found,
              pfd ? Qt : make_fixnum (R_OK), false, false);
-  if (fd >= 0 || fd == -2)
+  if (fd == -2)
     {
-      file_found = ENCODE_FILE (file_found);
-      if (fd == -2)
-       {
-         /* The file exists locally, but has a file name handler.
-            (This happens, e.g., under Auto Image File Mode.)
-            'openp' didn't open the file, so we should, because the
-            caller expects that.  */
-         fd = emacs_open (SSDATA (file_found), O_RDONLY, 0);
-       }
+      /* The file exists locally, but has a file name handler.
+        (This happens, e.g., under Auto Image File Mode.)
+        'openp' didn't open the file, so we should, because the
+        caller expects that.  */
+      Lisp_Object encoded_name = ENCODE_FILE (file_found);
+      fd = emacs_open (SSDATA (encoded_name), O_RDONLY, 0);
     }
-  else /* fd < 0, but not -2 */
+  else if (fd < 0)
     return Qnil;
   if (pfd)
     *pfd = fd;
@@ -3173,8 +3170,8 @@ image_find_image_fd (Lisp_Object file, int *pfd)
 }
 
 /* Find image file FILE.  Look in data-directory/images, then
-   x-bitmap-file-path.  Value is the encoded full name of the file
-   found, or nil if not found.  */
+   x-bitmap-file-path.  Value is the full name of the file found, or
+   nil if not found.  */
 
 Lisp_Object
 image_find_image_file (Lisp_Object file)
index d14f7b51eaff3ae22133b8511f4fee93a7569380..98801d8526f5fde53187d75f855cda9b9559ba14 100644 (file)
@@ -3024,7 +3024,8 @@ all_nonzero_ascii (unsigned char *str, ptrdiff_t n)
 }
 
 @implementation NSString (EmacsString)
-/* Make an NSString from a Lisp string.  */
+/* Make an NSString from a Lisp string.  STRING must not be in an
+   encoded form (e.g. UTF-8).  */
 + (NSString *)stringWithLispString:(Lisp_Object)string
 {
   /* Shortcut for the common case.  */
index fa81a41a519da7afd4f93d94d214669a6d34daf4..3c16cd371e652b8770c4a167dd50c41449073285 100644 (file)
@@ -254,15 +254,15 @@ ns_image_size_in_bytes (void *img)
   NSImageRep *imgRep;
   Lisp_Object found;
   EmacsImage *image;
+  NSString *filename;
 
   /* Search bitmap-file-path for the file, if appropriate.  */
   found = image_find_image_file (file);
   if (!STRINGP (found))
     return nil;
-  found = ENCODE_FILE (found);
+  filename = [NSString stringWithLispString:found];
 
-  image = [[EmacsImage alloc] initByReferencingFile:
-                     [NSString stringWithLispString: found]];
+  image = [[EmacsImage alloc] initByReferencingFile:filename];
 
   image->bmRep = nil;
 #ifdef NS_IMPL_COCOA
@@ -277,8 +277,7 @@ ns_image_size_in_bytes (void *img)
     }
 
   [image setSize: NSMakeSize([imgRep pixelsWide], [imgRep pixelsHigh])];
-
-  [image setName: [NSString stringWithLispString: file]];
+  [image setName:filename];
 
   return image;
 }