diff options
Diffstat (limited to 'src/stat_cache.c')
| -rw-r--r-- | src/stat_cache.c | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/src/stat_cache.c b/src/stat_cache.c index fa94eed..2657143 100644 --- a/src/stat_cache.c +++ b/src/stat_cache.c @@ -489,6 +489,12 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ if (S_ISREG(st.st_mode)) { + /* fix broken stat/open for symlinks to reg files with appended slash on freebsd,osx */ + if (name->ptr[name->used-2] == '/') { + errno = ENOTDIR; + return HANDLER_ERROR; + } + /* try to open the file to check if we can read it */ if (-1 == (fd = open(name->ptr, O_RDONLY))) { return HANDLER_ERROR; @@ -595,29 +601,31 @@ handler_t stat_cache_get_entry(server *srv, connection *con, buffer *name, stat_ if (S_ISREG(st.st_mode)) { /* determine mimetype */ buffer_reset(sce->content_type); +#ifdef HAVE_XATTR + if (con->conf.use_xattr) { + stat_cache_attr_get(sce->content_type, name->ptr); + } +#endif + /* xattr did not set a content-type. ask the config */ + if (buffer_is_empty(sce->content_type)) { + for (k = 0; k < con->conf.mimetypes->used; k++) { + data_string *ds = (data_string *)con->conf.mimetypes->data[k]; + buffer *type = ds->key; - for (k = 0; k < con->conf.mimetypes->used; k++) { - data_string *ds = (data_string *)con->conf.mimetypes->data[k]; - buffer *type = ds->key; - - if (type->used == 0) continue; + if (type->used == 0) continue; - /* check if the right side is the same */ - if (type->used > name->used) continue; + /* check if the right side is the same */ + if (type->used > name->used) continue; - if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) { - buffer_copy_string_buffer(sce->content_type, ds->value); - break; + if (0 == strncasecmp(name->ptr + name->used - type->used, type->ptr, type->used - 1)) { + buffer_copy_string_buffer(sce->content_type, ds->value); + break; + } } } - etag_create(sce->etag, &(sce->st), con->etag_flags); -#ifdef HAVE_XATTR - if (con->conf.use_xattr && buffer_is_empty(sce->content_type)) { - stat_cache_attr_get(sce->content_type, name->ptr); - } -#endif + etag_create(sce->etag, &(sce->st), con->etag_flags); } else if (S_ISDIR(st.st_mode)) { - etag_create(sce->etag, &(sce->st), con->etag_flags); + etag_create(sce->etag, &(sce->st), con->etag_flags); } #ifdef HAVE_FAM_H |
