From 16e3d4102eb119fc9816a0ad3f4c487c0d0823b6 Mon Sep 17 00:00:00 2001 From: Mohammed Rafi KC Date: Wed, 3 May 2017 17:19:57 +0530 Subject: gfapi: fix handling of dot and double dot in path This patch is to handle "." and ".." in file path. Which means this special dentry names will be resolved before sending fops on the path. Change-Id: I5e92f6d1ad1412bf432eb2488e53fb7731edb013 BUG: 1530341 Signed-off-by: Mohammed Rafi KC Reviewed-on: https://review.gluster.org/17177 Smoke: Gluster Build System Reviewed-by: Niels de Vos CentOS-regression: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Jeff Darcy (cherry picked from commit 269e2ccf45ddc662d8373eb887ae6cef96e2ef37) --- api/src/glfs-resolve.c | 41 +++++++++++++++++------------------------ 1 file changed, 17 insertions(+), 24 deletions(-) (limited to 'api/src') diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index d495cd21413..a2be87f1c1e 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -25,12 +25,10 @@ #include "syncop.h" #include "call-stub.h" #include "gfapi-messages.h" - +#include "inode.h" #include "glfs-internal.h" #define graphid_str(subvol) (uuid_utoa((unsigned char *)subvol->graph->graph_uuid)) - - int glfs_first_lookup_safe (xlator_t *subvol) { @@ -251,33 +249,26 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, loc.parent = inode_ref (parent); gf_uuid_copy (loc.pargfid, parent->gfid); - /* /.. and /. should point back to / - we lookup using inode and gfid of root - Fill loc.name so that we make use md-cache. - md-cache is not valid for nameless lookups. - */ + /* At this point we should never have '.' or ".." in path */ if (__is_root_gfid (parent->gfid) && - (strcmp (component, "..") == 0)) { - loc.inode = inode_ref (parent); - loc.name = "."; - } else { - if (strcmp (component, ".") == 0) - loc.inode = inode_ref (parent); - else if (strcmp (component, "..") == 0) - loc.inode = inode_parent (parent, 0, 0); - else - loc.inode = inode_grep (parent->table, parent, - component); + (strcmp (component, "/") == 0)) { + if (!force_lookup) { + inode = inode_ref (parent); + } else { + ret = glfs_resolve_base (fs, subvol, parent, &ciatt); + if (!ret) + inode = inode_ref (parent); + } + goto found; } - + loc.inode = inode_grep (parent->table, parent, component); if (loc.inode) { gf_uuid_copy (loc.gfid, loc.inode->gfid); reval = 1; if (!(force_lookup || inode_needs_lookup (loc.inode, THIS))) { inode = inode_ref (loc.inode); - ciatt.ia_type = inode->ia_type; goto found; } } else { @@ -357,8 +348,10 @@ glfs_resolve_component (struct glfs *fs, xlator_t *subvol, inode_t *parent, } else if (inode == loc.inode) inode_ctx_set (inode, THIS, &ctx_value); found: - if (inode) + if (inode) { + ciatt.ia_type = inode->ia_type; inode_lookup (inode); + } if (iatt) *iatt = ciatt; out: @@ -384,6 +377,7 @@ priv_glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, char *next_component = NULL; int ret = -1; struct iatt ciatt = {0, }; + char dentry_name[PATH_MAX] = {0, }; DECLARE_OLD_THIS; __GLFS_ENTRY_VALIDATE_FS(fs, invalid_fs); @@ -414,9 +408,8 @@ priv_glfs_resolve_at (struct glfs *fs, xlator_t *subvol, inode_t *at, if (parent) inode_unref (parent); - parent = inode; - + glusterfs_normalize_dentry (&parent, &component, dentry_name); inode = glfs_resolve_component (fs, subvol, parent, component, &ciatt, /* force hard lookup on the last -- cgit