authorgravatar for vincent@rischmann.frVincent Rischmann <vincent@rischmann.fr> 2020-12-28 17:53:52+01:00
committergravatar for vincent@rischmann.frVincent Rischmann <vincent@rischmann.fr> 2020-12-28 18:14:27+01:00
log9c53564af1e00486218a5d345744273ad242ea33
treeda14d1aad54e50d9b3661a1b282f6fd4d82dc847
parent399c428cb0dfa45fe840315a04526d3794622662

fs: fix segfault in Walker.next

`top` might point to invalid memory after a call to self.stack.append which causes a segfault. Prevent this by recomputing `top`. Fixes #7560

1 files changed, 2 insertions(+), 1 deletions(-)

lib/std/fs.zig+2-1
...@@ -2183,7 +2183,7 @@ pub const Walker = struct {...@@ -2183,7 +2183,7 @@ pub const Walker = struct {
2183 while (true) {2183 while (true) {
2184 if (self.stack.items.len == 0) return null;2184 if (self.stack.items.len == 0) return null;
2185 // `top` becomes invalid after appending to `self.stack`.2185 // `top` becomes invalid after appending to `self.stack`.
2186 const top = &self.stack.items[self.stack.items.len - 1];2186 var top = &self.stack.items[self.stack.items.len - 1];
2187 const dirname_len = top.dirname_len;2187 const dirname_len = top.dirname_len;
2188 if (try top.dir_it.next()) |base| {2188 if (try top.dir_it.next()) |base| {
2189 self.name_buffer.shrink(dirname_len);2189 self.name_buffer.shrink(dirname_len);
...@@ -2200,6 +2200,7 @@ pub const Walker = struct {...@@ -2200,6 +2200,7 @@ pub const Walker = struct {
2200 .dir_it = new_dir.iterate(),2200 .dir_it = new_dir.iterate(),
2201 .dirname_len = self.name_buffer.items.len,2201 .dirname_len = self.name_buffer.items.len,
2202 });2202 });
2203 top = &self.stack.items[self.stack.items.len - 1];
2203 }2204 }
2204 }2205 }
2205 return Entry{2206 return Entry{