fs/zfs/zfs: Update dangling dn_new pointer in dnode_get_path()

The dnode_get_path() traverses dnode structures to locate the dnode leaf
of a given path. When the leaf is a symlink to another path, it restarts
the traversal either from root or from a different path. In such cases,
dn_new must be re-initialized

Passes "make check".

Fixes: CID 86750

Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Reviewed-by: Ross Philipson <ross.philipson@oracle.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Jagannathan Raman authored and Daniel Kiper committed 2022-10-27 16:50:06 +02:00
1 parent 59022ae263
commit 306be1f813
1 file changed
+6
+6
View File
@@ -2936,6 +2936,8 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
grub_strlen (oldpath) + 1); grub_strlen (oldpath) + 1);
grub_free (oldpathbuf); grub_free (oldpathbuf);
/* Restart dnode walk using path of symlink. */
if (path[0] != '/') if (path[0] != '/')
{ {
dn_new = dnode_path; dn_new = dnode_path;
@@ -2948,6 +2950,7 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
dnode_path = dn_new->next; dnode_path = dn_new->next;
grub_free (dn_new); grub_free (dn_new);
} }
dn_new = dnode_path;
} }
if (dnode_path->dn.dn.dn_bonustype == DMU_OT_SA) if (dnode_path->dn.dn.dn_bonustype == DMU_OT_SA)
{ {
@@ -2999,6 +3002,8 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
grub_strlen (oldpath) + 1); grub_strlen (oldpath) + 1);
grub_free (oldpathbuf); grub_free (oldpathbuf);
/* Restart dnode walk using path of symlink. */
if (path[0] != '/') if (path[0] != '/')
{ {
dn_new = dnode_path; dn_new = dnode_path;
@@ -3011,6 +3016,7 @@ dnode_get_path (struct subvolume *subvol, const char *path_in, dnode_end_t *dn,
dnode_path = dn_new->next; dnode_path = dn_new->next;
grub_free (dn_new); grub_free (dn_new);
} }
dn_new = dnode_path;
} }
} }
} }