diff --git a/kernel/sy_old/sy_generic.c b/kernel/sy_old/sy_generic.c index 413f7db0..4617ae22 100644 --- a/kernel/sy_old/sy_generic.c +++ b/kernel/sy_old/sy_generic.c @@ -739,11 +739,23 @@ char *mars_readlink(const char *newpath) #else inode = path.dentry->d_inode; #endif - if (unlikely(!inode || !S_ISLNK(inode->i_mode))) { + if (unlikely(!inode)) { MARS_ERR("link '%s' has invalid inode\n", newpath); status = -EINVAL; goto done_put; } + if (S_ISDIR(inode->i_mode)) { + /* fail silently: this can happen during + * deletions of directories + */ + status = -EINVAL; + goto done_put; + } + if (!S_ISLNK(inode->i_mode)) { + MARS_WRN("'%s' is no symlink\n", newpath); + status = -EINVAL; + goto done_put; + } len = i_size_read(inode); if (unlikely(len <= 0 || len > PAGE_SIZE)) {