unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#29231: 26.0.90; invald file name for symbolic files
@ 2017-11-09 17:41 Vincent Zhang
  2017-11-09 20:17 ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Vincent Zhang @ 2017-11-09 17:41 UTC (permalink / raw)
  To: 29231

[-- Attachment #1: Type: text/plain, Size: 8631 bytes --]


In Emacs 24 an 25, the symbolic file names are same as other files (e.g.
'~/xxx), but in Emacs 26, the file name is '~/xxx/', thus 'ido' or 'ivy'
handles files incorrectly. In fact, it will recognize it as a folder and
create a new file.


In GNU Emacs 26.0.90 (build 1, x86_64-apple-darwin13.4.0, NS appkit-1265.21 Version 10.9.5 (Build 13F1911))
of 2017-10-12 built on builder10-9.local
Windowing system distributor 'Apple', version 10.3.1561
Recent messages:
Auto-saving...done
Mark set
Send this bug report to the Emacs maintainers? (y or n) y
Sending...
Mark set [2 times]
Sending via mail...
Quit
mwheel-scroll: Beginning of buffer [3 times]
C-c RET C-g is undefined
Buffer *unsent mail to bug-gnu-emacs* modified; kill anyway? (y or n) y

Configured using:
'configure --with-ns '--enable-locallisppath=/Library/Application
Support/Emacs/${version}/site-lisp:/Library/Application
Support/Emacs/site-lisp' --with-modules'

Configured features:
NOTIFY ACL GNUTLS LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS MODULES

Important settings:
  value of $LANG: en_CN.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Lisp Interaction

Minor modes in effect:
  counsel-mode: t
  ivy-mode: t
  server-mode: t
  save-place-mode: t
  spaceline-info-mode: t
  smooth-scrolling-mode: t
  delete-selection-mode: t
  global-hl-line-mode: t
  show-paren-mode: t
  winner-mode: t
  window-numbering-mode: t
  popwin-mode: t
  eyebrowse-mode: t
  browse-url-dwim-mode: t
  global-emojify-mode: t
  emojify-mode: t
  dumb-jump-mode: t
  savehist-mode: t
  shell-dirtrack-mode: t
  global-aggressive-indent-mode: t
  aggressive-indent-mode: t
  drag-stuff-global-mode: t
  drag-stuff-mode: t
  global-hungry-delete-mode: t
  hungry-delete-mode: t
  ace-pinyin-global-mode: t
  ace-pinyin-mode: t
  global-anzu-mode: t
  anzu-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  company-quickhelp-mode: t
  company-quickhelp-local-mode: t
  global-company-mode: t
  company-mode: t
  yas-global-mode: t
  yas-minor-mode: t
  indent-guide-global-mode: t
  indent-guide-mode: t
  volatile-highlights-mode: t
  global-auto-revert-mode: t
  diff-hl-flydiff-mode: t
  global-diff-hl-mode: t
  which-key-mode: t
  projectile-rails-global-mode: t
  projectile-mode: t
  flycheck-pos-tip-mode: t
  global-flycheck-mode: t
  flycheck-mode: t
  diff-auto-refine-mode: t
  recentf-mode: t
  rainbow-mode: t
  elisp-slime-nav-mode: t
  display-line-numbers-mode: t
  goto-address-prog-mode: t
  subword-mode: t
  symbol-overlay-mode: t
  highlight-parentheses-mode: t
  rainbow-delimiters-mode: t
  fic-mode: t
  whitespace-mode: t
  editorconfig-mode: t
  electric-pair-mode: t
  persistent-scratch-autosave-mode: t
  desktop-save-mode: t
  override-global-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  global-prettify-symbols-mode: t
  prettify-symbols-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  size-indication-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(network-stream starttls mailalias smtpmail shadow sort mail-extr
emacsbug message rfc822 mml mml-sec epa epg mm-decode mm-bodies
mm-encode mailabbrev gmm-utils mailheader sendmail smex ivy-hydra
bookmark pp company-c-headers counsel-projectile counsel esh-util swiper
colir ivy flx ivy-overlay tide tide-lv typescript-mode ido cc-mode
cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine cc-vars
cc-defs mwim time server saveplace spaceline-config spaceline-segments
spaceline powerline powerline-separators powerline-themes cnfonts
cnfonts-ui cus-edit cus-start cus-load smooth-scrolling delsel ace-link
company-emoji company-emoji-list hl-line paren browse-kill-ring derived
windmove winner window-numbering popwin eyebrowse browse-url-dwim
string-utils list-utils rg emojify apropos tar-mode ht dumb-jump popup
dockerfile-mode org-indent org-bullets org-rmail org-mhe org-irc
org-info org-gnus gnus-util rmail rmail-loaddefs mail-utils org-docview
doc-view jka-compr image-mode org-bibtex bibtex org-bbdb org-w3m
org-element avl-tree generator ob-ruby ob-python org org-macro
org-footnote org-pcomplete org-list org-faces org-entities org-version
ob-emacs-lisp ob ob-tangle org-src ob-ref ob-lob ob-table ob-keys ob-exp
ob-comint ob-core ob-eval org-compat org-macs org-loaddefs cal-china-x
cal-china lunar solar cal-dst holidays hol-loaddefs cal-menu calendar
cal-loaddefs view noutline outline conf-mode vc-mtn vc-hg vc-bzr vc-src
vc-sccs vc-svn vc-cvs vc-rcs diff-hl-dired dired-rainbow
dired-hacks-utils dired-quick-sort savehist ls-lisp dired-x dired
dired-loaddefs rspec-mode robe url-http tls gnutls url-auth mail-parse
rfc2231 rfc2047 rfc2045 mm-util ietf-drums mail-prsvr url-gw nsm rmc
puny ruby-refactor rubocop tramp tramp-compat tramp-loaddefs trampver
shell pcomplete parse-time format-spec yard-mode company-go
go-projectile go-rename go-guru go-eldoc imenu go-mode url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util mailcap find-file ffap sh-script executable aggressive-indent
drag-stuff hungry-delete ace-pinyin pinyinlib anzu undo-tree
company-oddmuse company-keywords company-etags company-gtags
company-dabbrev-code company-dabbrev company-files company-capf
company-cmake company-xcode company-clang company-semantic company-eclim
company-template company-css company-nxml company-bbdb company-shell
company-yasnippet company-robe company-quickhelp company pcase yasnippet
indent-guide volatile-highlights autorevert filenotify diff-hl-flydiff
diff diff-hl vc-dir ewoc vc vc-dispatcher which-key projectile-rails
rake f s inflections inf-ruby ruby-mode smie projectile grep compile
comint ibuf-ext ibuffer ibuffer-loaddefs avy-flycheck avy
flycheck-pos-tip pos-tip flycheck json map find-func subr-x dash vc-git
diff-mode open-junk-file recentf tree-widget wid-edit editorconfig-core
editorconfig-core-handle editorconfig-fnmatch rainbow-mode ansi-color
color elisp-slime-nav etags xref project display-line-numbers goto-addr
cap-words superword subword symbol-overlay thingatpt
highlight-parentheses rainbow-delimiters fic-mode whitespace
editorconfig elec-pair persistent-scratch init-restore desktop frameset
init-prog init-web init-ruby init-python init-go init-c init-emacs-lisp
init-projectile init-flycheck init-vcs init-utils init-funcs init-org
hydra ring lv init-eshell init-shell init-window init-kill-ring
init-ibuffer init-highlight init-dired init-calendar init-yasnippet
init-company init-ivy init-edit init-ui cl-extra help-mode
spacemacs-dark-theme spacemacs-common init-basic exec-path-from-shell
init-package use-package diminish bind-key easy-mmode finder-inf edmacro
kmacro rx cl info advice package easymenu epg-config url-handlers
url-parse auth-source cl-seq eieio eieio-core cl-macs eieio-loaddefs
password-cache url-vars seq byte-opt gv bytecomp byte-compile cconv
cl-loaddefs cl-lib init-custom init-const time-date tooltip eldoc
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/ns-win
ns-win ucs-normalize mule-util term/common-win tool-bar dnd fontset
image regexp-opt fringe tabulated-list replace newcomment text-mode
elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow
isearch timer select scroll-bar mouse jit-lock font-lock syntax facemenu
font-core term/tty-colors frame cl-generic cham georgian utf-8-lang
misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms
cp51932 hebrew greek romanian slovak czech european ethiopic indian
cyrillic chinese composite charscript charprop case-table epa-hook
jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 758796 113848)
(symbols 48 55898 7)
(miscs 40 1913 3182)
(strings 32 221355 16229)
(string-bytes 1 5553603)
(vectors 16 111170)
(vector-slots 8 3520629 41305)
(floats 8 1112 793)
(intervals 56 18719 421)
(buffers 992 72))

--
Best Regards,
Vincent Zhang


Best Regards,
Vincent Zhang





[-- Attachment #2: Type: text/html, Size: 17431 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-09 17:41 bug#29231: 26.0.90; invald file name for symbolic files Vincent Zhang
@ 2017-11-09 20:17 ` Eli Zaretskii
  2017-11-10  2:49   ` Vincent Zhang
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2017-11-09 20:17 UTC (permalink / raw)
  To: Vincent Zhang; +Cc: 29231

> From: Vincent Zhang <vincent_chueng@hotmail.com>
> Date: Thu, 9 Nov 2017 17:41:42 +0000
> 
> In Emacs 24 an 25, the symbolic file names are same as other files (e.g.
> '~/xxx), but in Emacs 26, the file name is '~/xxx/', thus 'ido' or 'ivy'
> handles files incorrectly. In fact, it will recognize it as a folder and
> create a new file.

Thanks, but please provide a minimal recipe to reproduce this,
starting from "emacs -Q".  This will allow us to investigate the
issue.





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-09 20:17 ` Eli Zaretskii
@ 2017-11-10  2:49   ` Vincent Zhang
  2017-11-10  8:13     ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Vincent Zhang @ 2017-11-10  2:49 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 29231@debbugs.gnu.org

[-- Attachment #1: Type: text/plain, Size: 791 bytes --]

I reproduced with "emacs -Q" with emacs 26.0.90 on macOS10.13.1. No issue on emacs 25.3.1. Thanks!

Best Regards,
Vincent Zhang

-------- 原始邮件 --------
主题:Re: bug#29231: 26.0.90; invald file name for symbolic files
发件人:Eli Zaretskii
收件人:Vincent Zhang
抄送:29231@debbugs.gnu.org

> From: Vincent Zhang <vincent_chueng@hotmail.com>
> Date: Thu, 9 Nov 2017 17:41:42 +0000
>
> In Emacs 24 an 25, the symbolic file names are same as other files (e.g.
> '~/xxx), but in Emacs 26, the file name is '~/xxx/', thus 'ido' or 'ivy'
> handles files incorrectly. In fact, it will recognize it as a folder and
> create a new file.

Thanks, but please provide a minimal recipe to reproduce this,
starting from "emacs -Q".  This will allow us to investigate the
issue.

[-- Attachment #2: Type: text/html, Size: 1365 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-10  2:49   ` Vincent Zhang
@ 2017-11-10  8:13     ` Eli Zaretskii
  2017-11-10 10:10       ` Vincent Zhang
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2017-11-10  8:13 UTC (permalink / raw)
  To: Vincent Zhang; +Cc: 29231

> From: Vincent Zhang <vincent_chueng@hotmail.com>
> CC: "29231@debbugs.gnu.org" <29231@debbugs.gnu.org>
> Date: Fri, 10 Nov 2017 02:49:34 +0000
> 
> I reproduced with "emacs -Q" with emacs 26.0.90 on macOS10.13.1. No issue on emacs 25.3.1. Thanks!

Great, so please tell how you reproduced this.  That is, please
describe step by step what you did, both inside Emacs and outside it,
to reproduce the problem.

Thanks.





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-10  8:13     ` Eli Zaretskii
@ 2017-11-10 10:10       ` Vincent Zhang
  2017-11-11  8:54         ` Eli Zaretskii
  0 siblings, 1 reply; 12+ messages in thread
From: Vincent Zhang @ 2017-11-10 10:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 29231@debbugs.gnu.org

[-- Attachment #1: Type: text/plain, Size: 1155 bytes --]

Steps:
1. Start GNU Emacs 26.0.90 GUI via `Emacs -Q' on macOS 10.13.1.
2. Create some symbolic files (e.g. ~/.zshrc -> ~/.dotfiles/.zshrc) in the home folders.
3. Enable `ido-mode`, and `find-file` to open the symbolic files (~/.zshrc).

Results:
`~/.zshrc/` is showed in minibuffer after pressing `TAB`, and Emacs treats it as a folder and create a new one.
In Emacs 25, only `~/.zshrc` is showed, and Emacs gives a prompt of opening a symbolic file.

Am I missing anything?

Thanks!
________________________________
From: Eli Zaretskii <eliz@gnu.org>
Sent: Friday, November 10, 2017 8:13 AM
To: Vincent Zhang
Cc: 29231@debbugs.gnu.org
Subject: Re: bug#29231: 26.0.90; invald file name for symbolic files

> From: Vincent Zhang <vincent_chueng@hotmail.com>
> CC: "29231@debbugs.gnu.org" <29231@debbugs.gnu.org>
> Date: Fri, 10 Nov 2017 02:49:34 +0000
>
> I reproduced with "emacs -Q" with emacs 26.0.90 on macOS10.13.1. No issue on emacs 25.3.1. Thanks!

Great, so please tell how you reproduced this.  That is, please
describe step by step what you did, both inside Emacs and outside it,
to reproduce the problem.

Thanks.

[-- Attachment #2: Type: text/html, Size: 4918 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-10 10:10       ` Vincent Zhang
@ 2017-11-11  8:54         ` Eli Zaretskii
  2017-11-11 18:25           ` Alan Third
  0 siblings, 1 reply; 12+ messages in thread
From: Eli Zaretskii @ 2017-11-11  8:54 UTC (permalink / raw)
  To: Vincent Zhang, Alan Third; +Cc: 29231

> From: Vincent Zhang <vincent_chueng@hotmail.com>
> CC: "29231@debbugs.gnu.org" <29231@debbugs.gnu.org>
> Date: Fri, 10 Nov 2017 10:10:38 +0000
> 
> Steps:
> 1. Start GNU Emacs 26.0.90 GUI via `Emacs -Q' on macOS 10.13.1.
> 2. Create some symbolic files (e.g. ~/.zshrc -> ~/.dotfiles/.zshrc) in the home folders.
> 3. Enable `ido-mode`, and `find-file` to open the symbolic files (~/.zshrc). 
> 
> Results:
> `~/.zshrc/` is showed in minibuffer after pressing `TAB`, and Emacs treats it as a folder and create a new
> one.
> In Emacs 25, only `~/.zshrc` is showed, and Emacs gives a prompt of opening a symbolic file.
> 
> Am I missing anything?

It's a macOS specific bug.

Alan, I think the problem might be in the macOS implementation of
faccessat, called here:

  /* Return true if in the directory FD the directory entry DP, whose
     string length is LEN, is that of a subdirectory that can be searched.  */
  static bool
  file_name_completion_dirp (int fd, struct dirent *dp, ptrdiff_t len)
  {
    USE_SAFE_ALLOCA;
    char *subdir_name = SAFE_ALLOCA (len + 2);
    memcpy (subdir_name, dp->d_name, len);
    strcpy (subdir_name + len, "/");
    bool dirp = faccessat (fd, subdir_name, F_OK, AT_EACCESS) == 0;
    SAFE_FREE ();
    return dirp;
  }

This assumes that calling faccessat with an argument "foo/" will
return zero (i.e. succeed) only if "foo" is a directory, but will fail
(return non-zero) if it's a file.  I'm guessing that on macOS, this
call succeeds even for files, or maybe just for symlinks to files.
Could you (or someone else) please look into that?  I don't have
access to a macOS system.

Btw, does macOS have faccessat, or does it use the Gnulib replacement?





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-11  8:54         ` Eli Zaretskii
@ 2017-11-11 18:25           ` Alan Third
  2017-11-11 19:00             ` Eli Zaretskii
  2017-11-11 23:21             ` Paul Eggert
  0 siblings, 2 replies; 12+ messages in thread
From: Alan Third @ 2017-11-11 18:25 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: Vincent Zhang, Paul Eggert, 29231

On Sat, Nov 11, 2017 at 10:54:57AM +0200, Eli Zaretskii wrote:
> This assumes that calling faccessat with an argument "foo/" will
> return zero (i.e. succeed) only if "foo" is a directory, but will fail
> (return non-zero) if it's a file.  I'm guessing that on macOS, this
> call succeeds even for files, or maybe just for symlinks to files.

Only with symlinks faccessat returns success if it’s pointing to a
file and you put ‘/’ on the end. It looks like perhaps adding / to the
end ‘resolves’ symlinks:

    breton:/Users/alan>ls -l cows
    -rw-r--r--  1 alan  staff  0 11 Nov 17:33 cows
    breton:/Users/alan>ls cows/
    ls: cows/: Not a directory
    breton:/Users/alan>ln -s cows moo
    breton:/Users/alan>ls -l moo
    lrwxr-xr-x  1 alan  staff  4 11 Nov 18:14 moo -> cows
    breton:/Users/alan>ls -l moo/
    -rw-r--r--  1 alan  staff  0 11 Nov 17:33 moo/

> Btw, does macOS have faccessat, or does it use the Gnulib replacement?

macOS does have faccessat.

I’m not sure what the fix should be here. The commit introducing this
bug is:

commit 3a8d0cc825635e07da2a90c4ac987b476fc9b05d (HEAD -> emacs-26)
Author: Paul Eggert <eggert@cs.ucla.edu>
Date:   Mon Jul 31 12:31:02 2017 -0700

    Avoid most stat calls when completing file names

    * admin/merge-gnulib (GNULIB_MODULES): Add d-type.
    * lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
    * m4/d-type.m4: New file, copied from gnulib.
    * src/dired.c (DT_UNKNOWN, DT_DIR, DT_LINK)
    [!HAVE_STRUCT_DIRENT_D_TYPE]: New constants.
    (dirent_type): New function.
    (file_name_completion): Use it, to avoid unnecessary calls to
    stat-like functions on GNU/Linux and other platforms with d_type.
    (file_name_completion_stat): Just follow the link; there is no
    need to try first with AT_SYMLINK_NOFOLLOW since the directory
    entry was already checked to exist.

Perhaps revert to the old behaviour for Darwin OS?
-- 
Alan Third





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-11 18:25           ` Alan Third
@ 2017-11-11 19:00             ` Eli Zaretskii
  2017-11-11 23:21             ` Paul Eggert
  1 sibling, 0 replies; 12+ messages in thread
From: Eli Zaretskii @ 2017-11-11 19:00 UTC (permalink / raw)
  To: Alan Third; +Cc: vincent_chueng, eggert, 29231

> Date: Sat, 11 Nov 2017 18:25:20 +0000
> From: Alan Third <alan@idiocy.org>
> Cc: Vincent Zhang <vincent_chueng@hotmail.com>, 29231@debbugs.gnu.org,
> 	Paul Eggert <eggert@cs.ucla.edu>
> 
> Only with symlinks faccessat returns success if it’s pointing to a
> file and you put ‘/’ on the end. It looks like perhaps adding / to the
> end ‘resolves’ symlinks:
> [...]
> Perhaps revert to the old behaviour for Darwin OS?

Yes, if no better ideas come up, we should revert to calling 'stat' on
Darwin, IMO.





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-11 18:25           ` Alan Third
  2017-11-11 19:00             ` Eli Zaretskii
@ 2017-11-11 23:21             ` Paul Eggert
  2017-11-12  7:19               ` Paul Eggert
  1 sibling, 1 reply; 12+ messages in thread
From: Paul Eggert @ 2017-11-11 23:21 UTC (permalink / raw)
  To: Alan Third, Eli Zaretskii; +Cc: Vincent Zhang, 29231

Alan Third wrote:
> Only with symlinks faccessat returns success if it’s pointing to a
> file and you put ‘/’ on the end.

This is a well-known problem on macOS, and Emacs is supposed to compile a 
replacement fstatat function by building lib/fstatat.o and linking to that, and 
this replacement is supposed to implement the POSIX-required behavior where a 
trailing / works only on directories (or symlinks to directories, if following 
symlinks).

Evidently this replacement procedure is not working somehow. Please tell us 
whether the executable contains an fstatat workaround. You can do that via 
something like this:

$ gdb src/temacs
(gdb) disas rpl_fstatat

and I'd like to see the output of the 'disas' command.

Also, what are the values of the following macros in src/config.h? (The values 
on GNU/Linux are as shown.)

#define LSTAT_FOLLOWS_SLASHED_SYMLINK 1
#define HAVE_FSTATAT 1
/* #undef HAVE_WORKING_FSTATAT_ZERO_FLAG */





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-11 23:21             ` Paul Eggert
@ 2017-11-12  7:19               ` Paul Eggert
  2017-11-12 12:09                 ` Alan Third
  0 siblings, 1 reply; 12+ messages in thread
From: Paul Eggert @ 2017-11-12  7:19 UTC (permalink / raw)
  To: Alan Third, Eli Zaretskii; +Cc: Vincent Zhang, 29231

[-- Attachment #1: Type: text/plain, Size: 670 bytes --]

Paul Eggert wrote:
> Alan Third wrote:
>> Only with symlinks faccessat returns success if it’s pointing to a
>> file and you put ‘/’ on the end.
> 
> This is a well-known problem on macOS, and Emacs is supposed to compile a 
> replacement fstatat function

Whoops, you were writing about faccessat whereas I was thinking about fstatat. 
Please ignore my previous email, and sorry about the confusion.

Apparently macOS faccessat has a problem similar to fstatat. Gnulib did not work 
around the faccessat problem, so I wrote and installed a fix for this into 
Gnulib and installed the attached patch into the emacs-26 branch. Please give it 
a try.

[-- Attachment #2: 0001-Merge-from-Gnulib.txt --]
[-- Type: text/plain, Size: 11625 bytes --]

From 7775c4729814431608c943643a490ad5f1f68a99 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sat, 11 Nov 2017 23:11:03 -0800
Subject: [PATCH] Merge from Gnulib

This incorporates:
2017-11-11 faccessat: port to macOS (Bug#29231)
2017-11-05 fstatat: pacify GCC on unusual platform
* build-aux/config.guess, build-aux/config.sub:
* doc/misc/texinfo.tex, lib/faccessat.c, lib/fstatat.c:
* lib/unistd.in.h, m4/faccessat.m4, m4/unistd_h.m4:
Copy from Gnulib.
* lib/gnulib.mk.in, m4/gnulib-comp.m4: Regenerate.
---
 build-aux/config.guess |  9 +++++---
 build-aux/config.sub   |  5 ++---
 doc/misc/texinfo.tex   |  4 +++-
 lib/faccessat.c        | 60 ++++++++++++++++++++++++++++++++++++++++++++------
 lib/fstatat.c          |  2 +-
 lib/gnulib.mk.in       |  2 ++
 lib/unistd.in.h        | 16 ++++++++++++--
 m4/faccessat.m4        |  6 +++--
 m4/gnulib-comp.m4      | 10 ++++-----
 m4/unistd_h.m4         |  3 ++-
 10 files changed, 92 insertions(+), 25 deletions(-)

diff --git a/build-aux/config.guess b/build-aux/config.guess
index 2773ac4..31e01ef 100755
--- a/build-aux/config.guess
+++ b/build-aux/config.guess
@@ -2,7 +2,7 @@
 # Attempt to guess a canonical system name.
 #   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2017-11-01'
+timestamp='2017-11-07'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -39,7 +39,7 @@ usage=
 
 Output the configuration name of the system \`$me' is run on.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -244,6 +244,9 @@ UNAME_VERSION=
 	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
 	echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE}
 	exit ;;
+    *:MidnightBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-midnightbsd${UNAME_RELEASE}
+	exit ;;
     *:ekkoBSD:*:*)
 	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
 	exit ;;
@@ -479,7 +482,7 @@ UNAME_VERSION=
 #endif
 	#if defined (host_mips) && defined (MIPSEB)
 	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-risco0s%ssysv\\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
 	#endif
 	#if defined (SYSTYPE_SVR4)
 	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
diff --git a/build-aux/config.sub b/build-aux/config.sub
index bbad4c4..fb57947 100755
--- a/build-aux/config.sub
+++ b/build-aux/config.sub
@@ -2,7 +2,7 @@
 # Configuration validation subroutine script.
 #   Copyright 1992-2017 Free Software Foundation, Inc.
 
-timestamp='2017-11-01'
+timestamp='2017-11-04'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -57,7 +57,7 @@ usage=
 
 Canonicalize a configuration name.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -313,7 +313,6 @@ maybe_os=
 	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
 	| visium \
 	| wasm32 \
-	| we32k \
 	| x86 | xc16x | xstormy16 | xtensa \
 	| z8k | z80)
 		basic_machine=$basic_machine-unknown
diff --git a/doc/misc/texinfo.tex b/doc/misc/texinfo.tex
index 9bd75b9..022c3f5 100644
--- a/doc/misc/texinfo.tex
+++ b/doc/misc/texinfo.tex
@@ -3,7 +3,7 @@
 % Load plain if necessary, i.e., if running under initex.
 \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi
 %
-\def\texinfoversion{2017-09-16.10}
+\def\texinfoversion{2017-09-11.18}
 %
 % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995,
 % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
@@ -11425,9 +11425,11 @@
   %
   \dimen0 = #1\relax
   \advance\dimen0 by \voffset
+  \advance\dimen0 by 1in % reference point for DVI is 1 inch from top of page
   %
   \dimen2 = \hsize
   \advance\dimen2 by \normaloffset
+  \advance\dimen2 by 1in % reference point is 1 inch from left edge of page
   %
   \internalpagesizes{#1}{\hsize}%
                     {\voffset}{\normaloffset}%
diff --git a/lib/faccessat.c b/lib/faccessat.c
index 6cf9c99..fa92358 100644
--- a/lib/faccessat.c
+++ b/lib/faccessat.c
@@ -16,10 +16,31 @@
 
 /* written by Eric Blake */
 
+/* If the user's config.h happens to include <unistd.h>, let it include only
+   the system's <unistd.h> here, so that orig_faccessat doesn't recurse to
+   rpl_faccessat.  */
+#define _GL_INCLUDING_UNISTD_H
 #include <config.h>
 
 #include <unistd.h>
+#include <errno.h>
 #include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#undef _GL_INCLUDING_UNISTD_H
+
+#if HAVE_FACCESSAT
+static int
+orig_faccessat (int fd, char const *name, int mode, int flag)
+{
+  return faccessat (fd, name, mode, flag);
+}
+#endif
+
+/* Write "unistd.h" here, not <unistd.h>, otherwise OSF/1 5.1 DTK cc
+   eliminates this include because of the preliminary #include <unistd.h>
+   above.  */
+#include "unistd.h"
 
 #ifndef HAVE_ACCESS
 /* Mingw lacks access, but it also lacks real vs. effective ids, so
@@ -28,6 +49,29 @@
 # define access euidaccess
 #endif
 
+#if HAVE_FACCESSAT
+
+int
+rpl_faccessat (int fd, char const *file, int mode, int flag)
+{
+  int result = orig_faccessat (fd, file, mode, flag);
+
+  if (result == 0 && file[strlen (file) - 1] == '/')
+    {
+      struct stat st;
+      result = fstatat (fd, file, &st, 0);
+      if (result == 0 && !S_ISDIR (st.st_mode))
+        {
+          errno = ENOTDIR;
+          return -1;
+        }
+    }
+
+  return result;
+}
+
+#else /* !HAVE_FACCESSAT */
+
 /* Invoke access or euidaccess on file, FILE, using mode MODE, in the directory
    open on descriptor FD.  If possible, do it without changing the
    working directory.  Otherwise, resort to using save_cwd/fchdir, then
@@ -36,10 +80,12 @@
    Note that this implementation only supports AT_EACCESS, although some
    native versions also support AT_SYMLINK_NOFOLLOW.  */
 
-#define AT_FUNC_NAME faccessat
-#define AT_FUNC_F1 euidaccess
-#define AT_FUNC_F2 access
-#define AT_FUNC_USE_F1_COND AT_EACCESS
-#define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
-#define AT_FUNC_POST_FILE_ARGS        , mode
-#include "at-func.c"
+# define AT_FUNC_NAME faccessat
+# define AT_FUNC_F1 euidaccess
+# define AT_FUNC_F2 access
+# define AT_FUNC_USE_F1_COND AT_EACCESS
+# define AT_FUNC_POST_FILE_PARAM_DECLS , int mode, int flag
+# define AT_FUNC_POST_FILE_ARGS        , mode
+# include "at-func.c"
+
+#endif
diff --git a/lib/fstatat.c b/lib/fstatat.c
index 67e48d9..294861f 100644
--- a/lib/fstatat.c
+++ b/lib/fstatat.c
@@ -28,7 +28,7 @@
 #include <sys/stat.h>
 #undef __need_system_sys_stat_h
 
-#if HAVE_FSTATAT
+#if HAVE_FSTATAT && HAVE_WORKING_FSTATAT_ZERO_FLAG
 static int
 orig_fstatat (int fd, char const *filename, struct stat *buf, int flags)
 {
diff --git a/lib/gnulib.mk.in b/lib/gnulib.mk.in
index 0f795b3..c510a0e 100644
--- a/lib/gnulib.mk.in
+++ b/lib/gnulib.mk.in
@@ -689,6 +689,7 @@ REPLACE_DIRFD = @REPLACE_DIRFD@
 REPLACE_DPRINTF = @REPLACE_DPRINTF@
 REPLACE_DUP = @REPLACE_DUP@
 REPLACE_DUP2 = @REPLACE_DUP2@
+REPLACE_FACCESSAT = @REPLACE_FACCESSAT@
 REPLACE_FCHOWNAT = @REPLACE_FCHOWNAT@
 REPLACE_FCLOSE = @REPLACE_FCLOSE@
 REPLACE_FCNTL = @REPLACE_FCNTL@
@@ -2986,6 +2987,7 @@ unistd.h: unistd.in.h $(top_builddir)/config.status $(CXXDEFS_H) $(ARG_NONNULL_H
 	      -e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
 	      -e 's|@''REPLACE_DUP''@|$(REPLACE_DUP)|g' \
 	      -e 's|@''REPLACE_DUP2''@|$(REPLACE_DUP2)|g' \
+	      -e 's|@''REPLACE_FACCESSAT''@|$(REPLACE_FACCESSAT)|g' \
 	      -e 's|@''REPLACE_FCHOWNAT''@|$(REPLACE_FCHOWNAT)|g' \
 	      -e 's|@''REPLACE_FTRUNCATE''@|$(REPLACE_FTRUNCATE)|g' \
 	      -e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
diff --git a/lib/unistd.in.h b/lib/unistd.in.h
index ca8090a..9144783 100644
--- a/lib/unistd.in.h
+++ b/lib/unistd.in.h
@@ -461,13 +461,25 @@ _GL_WARN_ON_USE (euidaccess, "euidaccess is unportable - "
 
 
 #if @GNULIB_FACCESSAT@
-# if !@HAVE_FACCESSAT@
+# if @REPLACE_FACCESSAT@
+#  if !(defined __cplusplus && defined GNULIB_NAMESPACE)
+#   undef faccessat
+#   define faccessat rpl_faccessat
+#  endif
+_GL_FUNCDECL_RPL (faccessat, int,
+                  (int fd, char const *name, int mode, int flag)
+                  _GL_ARG_NONNULL ((2)));
+_GL_CXXALIAS_RPL (faccessat, int,
+                  (int fd, char const *name, int mode, int flag));
+# else
+#  if !@HAVE_FACCESSAT@
 _GL_FUNCDECL_SYS (faccessat, int,
                   (int fd, char const *file, int mode, int flag)
                   _GL_ARG_NONNULL ((2)));
-# endif
+#  endif
 _GL_CXXALIAS_SYS (faccessat, int,
                   (int fd, char const *file, int mode, int flag));
+# endif
 _GL_CXXALIASWARN (faccessat);
 #elif defined GNULIB_POSIXCHECK
 # undef faccessat
diff --git a/m4/faccessat.m4 b/m4/faccessat.m4
index 837ae54..f4cb49d 100644
--- a/m4/faccessat.m4
+++ b/m4/faccessat.m4
@@ -1,4 +1,4 @@
-# serial 6
+# serial 7
 # See if we need to provide faccessat replacement.
 
 dnl Copyright (C) 2009-2017 Free Software Foundation, Inc.
@@ -18,10 +18,12 @@ AC_DEFUN
   AC_CHECK_FUNCS_ONCE([faccessat])
   if test $ac_cv_func_faccessat = no; then
     HAVE_FACCESSAT=0
+  elif test "$gl_cv_func_lstat_dereferences_slashed_symlink" != yes; then
+    REPLACE_FACCESSAT=1
   fi
 ])
 
-# Prerequisites of lib/faccessat.m4.
+# Prerequisites of lib/faccessat.c.
 AC_DEFUN([gl_PREREQ_FACCESSAT],
 [
   AC_CHECK_FUNCS([access])
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index c551752..13459f9 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -222,7 +222,7 @@ AC_DEFUN
   gl_STRING_MODULE_INDICATOR([explicit_bzero])
   AC_REQUIRE([gl_EXTERN_INLINE])
   gl_FUNC_FACCESSAT
-  if test $HAVE_FACCESSAT = 0; then
+  if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
     AC_LIBOBJ([faccessat])
     gl_PREREQ_FACCESSAT
   fi
@@ -593,16 +593,16 @@ AC_DEFUN
       gl_gnulib_enabled_682e609604ccaac6be382e4ee3a4eaec=true
     fi
   }
-  if test $HAVE_FACCESSAT = 0; then
+  if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
     func_gl_gnulib_m4code_260941c0e5dc67ec9e87d1fb321c300b
   fi
-  if test $HAVE_FACCESSAT = 0; then
+  if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
     func_gl_gnulib_m4code_dosname
   fi
-  if test $HAVE_FACCESSAT = 0; then
+  if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
     func_gl_gnulib_m4code_euidaccess
   fi
-  if test $HAVE_FACCESSAT = 0; then
+  if test $HAVE_FACCESSAT = 0 || test $REPLACE_FACCESSAT = 1; then
     func_gl_gnulib_m4code_03e0aaad4cb89ca757653bd367a6ccb7
   fi
   if test $HAVE_FCNTL = 0 || test $REPLACE_FCNTL = 1; then
diff --git a/m4/unistd_h.m4 b/m4/unistd_h.m4
index cc44677..60e7ea4 100644
--- a/m4/unistd_h.m4
+++ b/m4/unistd_h.m4
@@ -1,4 +1,4 @@
-# unistd_h.m4 serial 70
+# unistd_h.m4 serial 71
 dnl Copyright (C) 2006-2017 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
@@ -159,6 +159,7 @@ AC_DEFUN
   REPLACE_CLOSE=0;        AC_SUBST([REPLACE_CLOSE])
   REPLACE_DUP=0;          AC_SUBST([REPLACE_DUP])
   REPLACE_DUP2=0;         AC_SUBST([REPLACE_DUP2])
+  REPLACE_FACCESSAT=0;    AC_SUBST([REPLACE_FACCESSAT])
   REPLACE_FCHOWNAT=0;     AC_SUBST([REPLACE_FCHOWNAT])
   REPLACE_FTRUNCATE=0;    AC_SUBST([REPLACE_FTRUNCATE])
   REPLACE_GETCWD=0;       AC_SUBST([REPLACE_GETCWD])
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-12  7:19               ` Paul Eggert
@ 2017-11-12 12:09                 ` Alan Third
  2017-11-13  2:53                   ` Vincent Zhang
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Third @ 2017-11-12 12:09 UTC (permalink / raw)
  To: Paul Eggert; +Cc: Vincent Zhang, 29231-done

On Sat, Nov 11, 2017 at 11:19:05PM -0800, Paul Eggert wrote:
> Apparently macOS faccessat has a problem similar to fstatat. Gnulib did not
> work around the faccessat problem, so I wrote and installed a fix for this
> into Gnulib and installed the attached patch into the emacs-26 branch.
> Please give it a try.

This fixes the problem for me.

Thanks, Paul!
-- 
Alan Third





^ permalink raw reply	[flat|nested] 12+ messages in thread

* bug#29231: 26.0.90; invald file name for symbolic files
  2017-11-12 12:09                 ` Alan Third
@ 2017-11-13  2:53                   ` Vincent Zhang
  0 siblings, 0 replies; 12+ messages in thread
From: Vincent Zhang @ 2017-11-13  2:53 UTC (permalink / raw)
  To: Alan Third, Paul Eggert; +Cc: 29231-done@debbugs.gnu.org

[-- Attachment #1: Type: text/plain, Size: 725 bytes --]

Thanks for fixing it, guys!
________________________________
From: Alan Third <athird@googlemail.com> on behalf of Alan Third <alan@idiocy.org>
Sent: Sunday, November 12, 2017 12:09 PM
To: Paul Eggert
Cc: Eli Zaretskii; Vincent Zhang; 29231-done@debbugs.gnu.org
Subject: Re: bug#29231: 26.0.90; invald file name for symbolic files

On Sat, Nov 11, 2017 at 11:19:05PM -0800, Paul Eggert wrote:
> Apparently macOS faccessat has a problem similar to fstatat. Gnulib did not
> work around the faccessat problem, so I wrote and installed a fix for this
> into Gnulib and installed the attached patch into the emacs-26 branch.
> Please give it a try.

This fixes the problem for me.

Thanks, Paul!
--
Alan Third

[-- Attachment #2: Type: text/html, Size: 1461 bytes --]

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-11-13  2:53 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-11-09 17:41 bug#29231: 26.0.90; invald file name for symbolic files Vincent Zhang
2017-11-09 20:17 ` Eli Zaretskii
2017-11-10  2:49   ` Vincent Zhang
2017-11-10  8:13     ` Eli Zaretskii
2017-11-10 10:10       ` Vincent Zhang
2017-11-11  8:54         ` Eli Zaretskii
2017-11-11 18:25           ` Alan Third
2017-11-11 19:00             ` Eli Zaretskii
2017-11-11 23:21             ` Paul Eggert
2017-11-12  7:19               ` Paul Eggert
2017-11-12 12:09                 ` Alan Third
2017-11-13  2:53                   ` Vincent Zhang

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).