[Libguestfs] [PATCH] fuse: resolve absolute links to relative ones
Richard W.M. Jones
rjones at redhat.com
Mon Mar 23 13:39:51 UTC 2015
On Wed, Mar 18, 2015 at 02:21:31PM +0100, Maros Zatko wrote:
> First it strips /sysroot and then finds common prefix aligned
> on slashes. Next it produces ../ for each slash found in common
> prefix and concatenates them with the rest of resolved link.
>
> Fixes RHBZ#604041
> ---
> src/fuse.c | 33 ++++++++++++++++++++++++++++++++-
> 1 file changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/src/fuse.c b/src/fuse.c
> index 3fdb1d4..6c7eee1 100644
> --- a/src/fuse.c
> +++ b/src/fuse.c
> @@ -386,7 +386,38 @@ mount_local_readlink (const char *path, char *buf, size_t size)
> if (len > size - 1)
> len = size - 1;
>
> - memcpy (buf, r, len);
> + buf[0] = '\0';
> + size_t offset = 0;
> + if (STRPREFIX (r, "/sysroot")) {
> + offset = strlen ("/sysroot") + 1;
> + size_t i;
> + for (i = 0; (i < strlen (r+offset)) && (path[i] == r[i+offset-1]); i++);
> + /* Now i contains index where paths starts to differ
> + * (n.b. needs to be aligned on last slash). */
> +
> + for (; path[i] != '/'; --i);
> + /* i is now aligned */
> +
> + /* Count slashes in original path, so we can generate
> + * right amount of ../ */
> + size_t j; int cnt = 0;
> + for (j = i+1; j < strlen (r+offset); j++) {
> + if (path[j] == '/') cnt++;
> + }
> +
> + /* For each slash create ../ in path */
> + for (int z = 0; z < cnt; z++) {
> + strcat (buf, "../");
> + }
> +
> + /* In addition to /sysroot ne need to remove common path
> + * aligned on slashes */
> + offset += i;
> + }
> +
> + /* There might already be something in buf (such as ../)
> + * so let's concatenate the rest of path */
> + strncat (buf, r + offset, len - offset + 1);
> buf[len] = '\0';
This makes my head hurt. Perhaps some diagrams or examples
of how this is supposed to work?
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine. Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/
More information about the Libguestfs
mailing list