From 086a61209bc0d4d46b0b73b635bfb9b018ce772d Mon Sep 17 00:00:00 2001 From: =?utf8?q?P=C3=A1draig=20Brady?= Date: Sat, 31 Dec 2011 11:03:58 +0000 Subject: [PATCH] canonicalize: only stat() when required * lib/canonicalize.c (canonicalize_filename_mode): Avoid calling l?stat() when both CAN_MISSING, and CAN_NOLINKS are set, as then we neither need to resolve symlinks or test component existence. --- ChangeLog | 8 ++++++++ lib/canonicalize.c | 9 ++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b380dfb38..3e45b0019 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2011-12-31 Pádraig Brady + + canonicalize: only stat() if required + * lib/canonicalize.c (canonicalize_filename_mode): + Avoid calling l?stat() when both CAN_MISSING, + and CAN_NOLINKS are set, as we neither need + to resolve symlinks or test component existence. + 2011-12-31 Paul Eggert doc: cover st_ino issues once; add OpenVMS etc. diff --git a/lib/canonicalize.c b/lib/canonicalize.c index e84c3392e..e5b69d9fd 100644 --- a/lib/canonicalize.c +++ b/lib/canonicalize.c @@ -198,7 +198,14 @@ canonicalize_filename_mode (const char *name, canonicalize_mode_t can_mode) dest += end - start; *dest = '\0'; - if ((logical ? stat (rname, &st) : lstat (rname, &st)) != 0) + if (logical && (can_mode == CAN_MISSING)) + { + /* Avoid the stat in this case as it's inconsequential. + i.e. we're neither resolving symlinks or testing + component existence. */ + st.st_mode = 0; + } + else if ((logical ? stat (rname, &st) : lstat (rname, &st)) != 0) { saved_errno = errno; if (can_mode == CAN_EXISTING) -- 2.11.0