Now just for the memory leaks
This commit is contained in:
+9
-3
@@ -48,13 +48,19 @@ pub fn readDirectory(alloc: std.mem.Allocator, rdr: io.AnyReader, size: u64) !st
|
|||||||
var out: std.StringHashMap(DirEntry) = .init(alloc);
|
var out: std.StringHashMap(DirEntry) = .init(alloc);
|
||||||
errdefer out.deinit();
|
errdefer out.deinit();
|
||||||
var red_size: u64 = 3;
|
var red_size: u64 = 3;
|
||||||
var hdr: DirHeader = try rdr.readStruct(DirHeader);
|
var hdr: DirHeader align(4) = undefined;
|
||||||
while (red_size < size) : (hdr = try rdr.readStruct(DirHeader)) {
|
// rdr.readStruct reads 16 bytes, due to alignment. get around this by manually reading the memory and decoding
|
||||||
|
var hdr_tmp: [12]u8 = [_]u8{0} ** 12;
|
||||||
|
while (red_size < size) {
|
||||||
|
_ = try rdr.readAll(&hdr_tmp);
|
||||||
|
hdr = std.mem.bytesToValue(DirHeader, &hdr_tmp);
|
||||||
|
red_size += 12;
|
||||||
var i: u32 = 0;
|
var i: u32 = 0;
|
||||||
|
try out.ensureUnusedCapacity(hdr.count + 1);
|
||||||
while (i <= hdr.count) : (i += 1) {
|
while (i <= hdr.count) : (i += 1) {
|
||||||
var tmp: DirEntry = try .init(alloc, hdr, rdr);
|
var tmp: DirEntry = try .init(alloc, hdr, rdr);
|
||||||
errdefer tmp.deinit(alloc);
|
errdefer tmp.deinit(alloc);
|
||||||
try out.put(tmp.name, tmp);
|
out.putAssumeCapacity(tmp.name, tmp);
|
||||||
red_size += 8 + tmp.name.len;
|
red_size += 8 + tmp.name.len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -38,12 +38,11 @@ pub const File = struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn realOpen(self: *File, reader: *Reader, path: []const u8, first: bool) !File {
|
fn realOpen(self: *File, reader: *Reader, path: []const u8, first: bool) !File {
|
||||||
const clean_path: []const u8 = std.mem.trimLeft(u8, path, "/");
|
const clean_path: []const u8 = std.mem.trim(u8, path, "/");
|
||||||
if (clean_path.len == 0) {
|
if (clean_path.len == 0) {
|
||||||
return self.*;
|
return self.*;
|
||||||
}
|
}
|
||||||
if (!first) {
|
if (!first) {
|
||||||
defer reader.alloc.free(path);
|
|
||||||
defer self.deinit(reader.alloc);
|
defer self.deinit(reader.alloc);
|
||||||
}
|
}
|
||||||
switch (self.inode.header.inode_type) {
|
switch (self.inode.header.inode_type) {
|
||||||
@@ -95,6 +94,7 @@ pub const File = struct {
|
|||||||
reader.super.decomp,
|
reader.super.decomp,
|
||||||
);
|
);
|
||||||
defer meta_rdr.deinit();
|
defer meta_rdr.deinit();
|
||||||
|
try meta_rdr.skip(offset);
|
||||||
self.dirEntries = try directory.readDirectory(reader.alloc, meta_rdr.any(), size);
|
self.dirEntries = try directory.readDirectory(reader.alloc, meta_rdr.any(), size);
|
||||||
self.hasEntries = true;
|
self.hasEntries = true;
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -61,5 +61,5 @@ test "reader" {
|
|||||||
var fil = try rdr.root.open(&rdr, test_file_path);
|
var fil = try rdr.root.open(&rdr, test_file_path);
|
||||||
defer fil.deinit(rdr.alloc);
|
defer fil.deinit(rdr.alloc);
|
||||||
|
|
||||||
std.debug.print("{}\n", .{fil});
|
std.debug.print("{s}\n", .{fil.name});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user