From de219101ed2d1eca188c37f9a06b9764c4ca528e Mon Sep 17 00:00:00 2001 From: Wayne Davison Date: Tue, 20 Sep 2011 13:02:12 -0700 Subject: Change stat order for better ELOOP determination. --- syscall.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/syscall.c b/syscall.c index e2b1394a..5a7c8e82 100644 --- a/syscall.c +++ b/syscall.c @@ -464,9 +464,14 @@ int do_open_nofollow(const char *pathname, int flags) #ifdef O_NOFOLLOW fd = open(pathname, flags|O_NOFOLLOW); #else + if (do_lstat(pathname, &l_st) < 0) + return -1; + if (S_ISLNK(l_st.st_mode)) { + errno = ELOOP; + return -1; + } if ((fd = open(pathname, flags)) < 0) return fd; - if (do_fstat(fd, &f_st) < 0) { close_and_return_error: { @@ -476,12 +481,6 @@ int do_open_nofollow(const char *pathname, int flags) } return -1; } - if (do_lstat(pathname, &l_st) < 0) - goto close_and_return_error; - if (S_ISLNK(l_st.st_mode)) { - errno = ELOOP; - goto close_and_return_error; - } if (l_st.st_dev != f_st.st_dev || l_st.st_ino != f_st.st_ino) { errno = EINVAL; goto close_and_return_error; -- cgit v1.2.1