From 05919041e1bd34f0862ca68026ecdd886955acfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20R=C3=BCckert?= Date: Sun, 10 Sep 2006 14:11:08 +0000 Subject: [PATCH] - only run symlink checks if we should not follow them. git-svn-id: svn://svn.lighttpd.net/lighttpd/branches/lighttpd-1.4.11-ssl-fixes@1290 152afb58-edef-0310-8abb-c4023f1b3aa9 --- src/stat_cache.c | 74 +++++++++++++++++++++++++----------------------- 1 file changed, 38 insertions(+), 36 deletions(-) diff --git a/src/stat_cache.c b/src/stat_cache.c index 1c7f4b5a..c6cb3d2e 100644 --- a/src/stat_cache.c +++ b/src/stat_cache.c @@ -527,47 +527,49 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ * */ #ifdef HAVE_LSTAT sce->is_symlink = 0; - if (stat_cache_lstat(srv, name, &lst) == 0) { -#ifdef DEBUG_STAT_CACHE - log_error_write(srv, __FILE__, __LINE__, "sb", - "found symlink", name); -#endif - sce->is_symlink = 1; - } - - /* - * we assume "/" can not be symlink, so - * skip the symlink stuff if our path is / - **/ - else if ((name->used > 2)) { - buffer *dname; - char *s_cur; - - dname = buffer_init(); - buffer_copy_string_buffer(dname, name); - - while ((s_cur = strrchr(dname->ptr,'/'))) { - *s_cur = '\0'; - if (dname->ptr == s_cur) { -#ifdef DEBUG_STAT_CACHE - log_error_write(srv, __FILE__, __LINE__, "s", "reached /"); -#endif - break; - } -#ifdef DEBUG_STAT_CACHE - log_error_write(srv, __FILE__, __LINE__, "sbs", - "checking if", dname, "is a symlink"); -#endif - if (stat_cache_lstat(srv, dname, &lst) == 0) { - sce->is_symlink = 1; + if (!con->conf.follow_symlink) { + if (stat_cache_lstat(srv, name, &lst) == 0) { #ifdef DEBUG_STAT_CACHE log_error_write(srv, __FILE__, __LINE__, "sb", - "found symlink", dname); + "found symlink", name); #endif - break; + sce->is_symlink = 1; + } + + /* + * we assume "/" can not be symlink, so + * skip the symlink stuff if our path is / + **/ + else if ((name->used > 2)) { + buffer *dname; + char *s_cur; + + dname = buffer_init(); + buffer_copy_string_buffer(dname, name); + + while ((s_cur = strrchr(dname->ptr,'/'))) { + *s_cur = '\0'; + if (dname->ptr == s_cur) { +#ifdef DEBUG_STAT_CACHE + log_error_write(srv, __FILE__, __LINE__, "s", "reached /"); +#endif + break; + } +#ifdef DEBUG_STAT_CACHE + log_error_write(srv, __FILE__, __LINE__, "sbs", + "checking if", dname, "is a symlink"); +#endif + if (stat_cache_lstat(srv, dname, &lst) == 0) { + sce->is_symlink = 1; +#ifdef DEBUG_STAT_CACHE + log_error_write(srv, __FILE__, __LINE__, "sb", + "found symlink", dname); +#endif + break; + }; }; + buffer_free(dname); }; - buffer_free(dname); }; #endif