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 {
21832183 while (true) {
21842184 if (self.stack.items.len == 0) return null;
21852185 // `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];
21872187 const dirname_len = top.dirname_len;
21882188 if (try top.dir_it.next()) |base| {
21892189 self.name_buffer.shrink(dirname_len);
......@@ -2200,6 +2200,7 @@ pub const Walker = struct {
22002200 .dir_it = new_dir.iterate(),
22012201 .dirname_len = self.name_buffer.items.len,
22022202 });
2203 top = &self.stack.items[self.stack.items.len - 1];
22032204 }
22042205 }
22052206 return Entry{