From: Wayne Davison Date: Tue, 20 Sep 2011 20:02:12 +0000 (-0700) Subject: Change stat order for better ELOOP determination. X-Git-Tag: v3.1.0pre1~74 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=de219101ed2d1eca188c37f9a06b9764c4ca528e;p=thirdparty%2Frsync.git Change stat order for better ELOOP determination. --- 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;