[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#37095: [PATCH] Save match data in ucs-normalize-region

From: Akinori MUSHA
Subject: bug#37095: [PATCH] Save match data in ucs-normalize-region
Date: Tue, 20 Aug 2019 16:18:06 +0900
User-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Thunderbird/60.8.0

A patch generated by git format-patch is attached below, which simply
wraps `ucs-normalize-region` with `save-match-data`.

I'm a user of the Emacs Mac port by mituharu was investigating a bug
where dired fails to open a certain local directory on macOS.  The
error was raised at `replace-match` in the `insert-directory`

                (when (re-search-forward "^ *\\(total\\)" nil t)
                  (let ((available (get-free-disk-space ".")))
                    (when available
                      ;; Replace "total" with "used", to avoid confusion.
                      (replace-match "total used in directory" nil nil nil 1)

And it turned out the match data changed after returning from
`get-free-disk-space` and that was why `replace-match` failed.

Inside of `get-free-disk-space` most platforms uses a generic method
to get the free space, and that part is fine because it is surrounded
by `save-match-data`.  However, the Mac port is one of the few
platforms that implements a native 'file-system-info` function, which
is called if it exists.  Then, the `file-system-info` in `src/mac.c`
calls ENCODE_FILE() on a given directory name, which in the end calls
`ucs-normalize-region` to normalize the filename, where the match data
is clobbered.


ENCODE_FILE() is transparently called by many C functions, which means
`ucs-normalize-region` can be called at unpredictable timings, so I
think it should keep match data unchanged.

Akinori MUSHA / https://akinori.org/

Attachment: 0001-Save-match-data-in-ucs-normalize-region.patch
Description: Text document

Attachment: signature.asc
Description: OpenPGP digital signature

reply via email to

[Prev in Thread] Current Thread [Next in Thread]