diff options
| author | Raghavendra G <raghavendra@gluster.com> | 2009-09-01 00:00:44 +0000 | 
|---|---|---|
| committer | Anand V. Avati <avati@dev.gluster.com> | 2009-09-08 03:22:42 -0700 | 
| commit | 342100dac9d0e01039b8cd8a0da4426b70d27060 (patch) | |
| tree | 717926a1e378ee7b33e6d62066a436b5192c9ab7 /libglusterfsclient/src | |
| parent | 6cd8070af4c83cca9f3f7685a2a04bcb95059dd1 (diff) | |
libglusterfsclient: fix to the way symbolic links are handled in glusterfs_glh_realpath.
- don't assume the content returned by readlink while constructing realpath
    of a symbolic link to contain vmp as part of the path. This is necessary in
    case of symbolic links which contain relative paths as targets.
Signed-off-by: Anand V. Avati <avati@dev.gluster.com>
BUG: 233 (Crash in Apache running on booster when a client tries to access a symbolic link)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=233
Diffstat (limited to 'libglusterfsclient/src')
| -rwxr-xr-x | libglusterfsclient/src/libglusterfsclient.c | 23 | 
1 files changed, 17 insertions, 6 deletions
diff --git a/libglusterfsclient/src/libglusterfsclient.c b/libglusterfsclient/src/libglusterfsclient.c index 69be41516b4..50ca6a5a796 100755 --- a/libglusterfsclient/src/libglusterfsclient.c +++ b/libglusterfsclient/src/libglusterfsclient.c @@ -6728,8 +6728,8 @@ glusterfs_glh_realpath (glusterfs_handle_t handle, const char *path,          int                             dest_offset = 0;          char                            *rpath_limit = 0;          int                             ret = 0, num_links = 0; -        struct vmp_entry                *entry = NULL; -        char                            *vpath = NULL; +        char                            *vpath = NULL, *tmppath = NULL; +        char                             absolute_path[PATH_MAX];          GF_VALIDATE_OR_GOTO (LIBGF_XL_NAME, ctx, out);          GF_VALIDATE_ABSOLUTE_PATH_OR_GOTO (LIBGF_XL_NAME, path, out); @@ -6836,11 +6836,12 @@ glusterfs_glh_realpath (glusterfs_handle_t handle, const char *path,                          }                          if (S_ISLNK (stbuf.st_mode)) { -                                buf = alloca (path_max); +                                buf = calloc (1, path_max);                                  if (++num_links > MAXSYMLINKS)                                  {                                          errno = ELOOP; +                                        FREE (buf);                                          goto err;                                  } @@ -6853,13 +6854,23 @@ glusterfs_glh_realpath (glusterfs_handle_t handle, const char *path,                                                  "glusterfs_readlink returned %d"                                                  " for path (%s):(%s)",                                                  ret, rpath, strerror (errno)); +                                        FREE (buf);                                          goto err;                                  }                                  buf[ret] = '\0'; -                                entry = libgf_vmp_search_entry (buf); -                                vpath = libgf_vmp_virtual_path (entry, buf); -                                glusterfs_glh_realpath (handle, vpath, rpath); +                                if (buf[0] != '/') { +                                        tmppath = strdup (path); +                                        tmppath = dirname (tmppath); +                                        sprintf (absolute_path, "%s/%s", +                                                 tmppath, buf); +                                        FREE (buf); +                                        buf = libgf_resolve_path_light ((char *)absolute_path); +                                        FREE (tmppath); +                                } + +                                glusterfs_glh_realpath (handle, buf, rpath); +                                FREE (buf);                                  goto out;                          } else if (!S_ISDIR (stbuf.st_mode) && *end != '\0') {                                  errno = ENOTDIR;  | 
