diff mbox

Re: snapshot: fixed bdrv_get_full_backing_filename can not get correct full_backing_filename

Message ID 1397063031-22305-1-git-send-email-junmuzi@gmail.com
State New
Headers show

Commit Message

lijun April 9, 2014, 5:03 p.m. UTC
Thanks Eric's analysis and review firstly. As not so clear to the application context, so the first patch can not cover symlink scenarios.
In this patch, will check the backing_filename is a symlink or not firstly, then return the full(absolute) path via realpath.
If this patch has something not coverd, please give me more suggestions.
Thx.

Signed-off-by: Jun Li <junmuzi@gmail.com>
---
 block.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

Comments

Stefan Hajnoczi April 24, 2014, 12:08 p.m. UTC | #1
On Thu, Apr 10, 2014 at 01:03:51AM +0800, Jun Li wrote:
> Thanks Eric's analysis and review firstly. As not so clear to the application context, so the first patch can not cover symlink scenarios.
> In this patch, will check the backing_filename is a symlink or not firstly, then return the full(absolute) path via realpath.
> If this patch has something not coverd, please give me more suggestions.
> Thx.

I don't know what series this patch is part of.  I'm ignoring it, please
resend a proper series with revision numbers.

Also, the commit description should only contain information that will
become part of the git commit history.  Comments about code review or
asking for suggestions are not appropriate for the commit description
since they are irrelevant once the patch has been merged.  Please make
sure to put this stuff after the '---' line so git-am(1) will strip it
from the commit description.

Thanks,
Stefan
diff mbox

Patch

diff --git a/block.c b/block.c
index 990a754..8566b75 100644
--- a/block.c
+++ b/block.c
@@ -304,10 +304,26 @@  void path_combine(char *dest, int dest_size,
 
 void bdrv_get_full_backing_filename(BlockDriverState *bs, char *dest, size_t sz)
 {
+    struct stat sb;
+    char *linkname;
+
     if (bs->backing_file[0] == '\0' || path_has_protocol(bs->backing_file)) {
         pstrcpy(dest, sz, bs->backing_file);
     } else {
-        path_combine(dest, sz, bs->filename, bs->backing_file);
+        if (lstat(bs->backing_file, &sb) == -1) {
+            perror("lstat");
+            exit(EXIT_FAILURE);
+        }
+
+        /* Check linkname is a link or not */
+        if (S_ISLNK(sb.st_mode)) {
+            linkname = malloc(sb.st_size + 1);
+            readlink(bs->backing_file, linkname, sb.st_size + 1);
+            linkname[sb.st_size] = '\0';
+            realpath(linkname, dest);
+        } else {
+            realpath(bs->backing_file, dest);
+        }
     }
 }