From 774366004c4834aa5e1345f37f8c2ecfd64009ca Mon Sep 17 00:00:00 2001 From: Caleb Gardner Date: Mon, 16 Nov 2020 16:08:23 -0600 Subject: [PATCH] Some work on reading the root inode's dir table --- README.md | 2 +- blockreader.go | 28 +++++++++++++--------------- internal/directory/directory.go | 9 ++++++++- squashfsreader.go | 1 + 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 8219ac7..f39b8dd 100644 --- a/README.md +++ b/README.md @@ -24,4 +24,4 @@ I am focusing purely on unsquashing before squashing. # Where I'm at -* Re-redid a bunch to try to make sure I wasn't durping. After that didn't work, I tried to figure out why things wheren't working, then realized HOW I was durping. \ No newline at end of file +* Something is wrong with my directory table reading. Need to figure that out. \ No newline at end of file diff --git a/blockreader.go b/blockreader.go index 048b322..89a957e 100644 --- a/blockreader.go +++ b/blockreader.go @@ -23,7 +23,6 @@ type BlockReader struct { } func (s *Reader) NewBlockReader(offset int64) (*BlockReader, error) { - fmt.Println("Offset", offset) var br BlockReader br.s = s br.offset = offset @@ -39,7 +38,6 @@ func (s *Reader) NewBlockReader(offset int64) (*BlockReader, error) { } func (br *BlockReader) parseMetadata() error { - fmt.Println("meta offset", br.offset) var raw uint16 err := binary.Read(io.NewSectionReader(br.s.r, br.offset, 2), binary.LittleEndian, &raw) if err != nil { @@ -53,7 +51,6 @@ func (br *BlockReader) parseMetadata() error { size: size, compressed: compressed, }) - fmt.Println("compression", compressed) return nil } @@ -80,28 +77,30 @@ func (br *BlockReader) readNextDataBlock() error { } func (br *BlockReader) Read(p []byte) (int, error) { + fmt.Println("reading", len(p)) if br.readOffset+len(p) < len(br.data) { for i := 0; i < len(p); i++ { p[i] = br.data[br.readOffset+i] } br.readOffset += len(p) + fmt.Println("enough data available") return len(p), nil } read := 0 for read < len(p) { - if read+br.readOffset == len(br.data) { - err := br.parseMetadata() - if err != nil { - br.readOffset += read - return read, err - } - err = br.readNextDataBlock() - if err != nil { - br.readOffset += read - return read, err - } + fmt.Println("Reading new block") + err := br.parseMetadata() + if err != nil { + br.readOffset += read + return read, err + } + err = br.readNextDataBlock() + if err != nil { + br.readOffset += read + return read, err } for ; read < len(p); read++ { + // fmt.Println("Reading...") if br.readOffset+read < len(br.data) { p[read] = br.data[br.readOffset+read] } else { @@ -113,7 +112,6 @@ func (br *BlockReader) Read(p []byte) (int, error) { if read != len(p) { return read, errors.New("Didn't read enough data") } - fmt.Println("Read", p) return read, nil } diff --git a/internal/directory/directory.go b/internal/directory/directory.go index 5146721..ac7ff00 100644 --- a/internal/directory/directory.go +++ b/internal/directory/directory.go @@ -31,11 +31,15 @@ type Entry struct { func NewEntry(rdr io.Reader) (Entry, error) { var entry Entry err := binary.Read(rdr, binary.LittleEndian, &entry.Init) + fmt.Println("entry", entry.Init) if err != nil { - return entry, err + return Entry{}, err } entry.Name = make([]byte, entry.Init.NameSize+1, entry.Init.NameSize+1) err = binary.Read(rdr, binary.LittleEndian, &entry.Name) + if err != nil { + return Entry{}, err + } return entry, err } @@ -55,6 +59,7 @@ func NewDirectory(rdr io.Reader) (*Directory, error) { return nil, err } hdr.Count++ + fmt.Println("entries coutn", hdr.Count) headers := hdr.Count / 256 if hdr.Count%256 > 0 { headers++ @@ -63,7 +68,9 @@ func NewDirectory(rdr io.Reader) (*Directory, error) { dir.Headers = make([]Header, headers) dir.Headers[0] = hdr for i := uint32(0); i < hdr.Count; i++ { + fmt.Println("reading entry", i) if i != 0 && i%256 == 0 { + fmt.Println("reading new header...") var newHdr Header err = binary.Read(rdr, binary.LittleEndian, &newHdr) if err != nil { diff --git a/squashfsreader.go b/squashfsreader.go index 1e82b10..619324f 100644 --- a/squashfsreader.go +++ b/squashfsreader.go @@ -60,6 +60,7 @@ func (r *Reader) readRootDirTable() error { if err != nil { return err } + fmt.Println("Done reading inode...") dirRdr, err := r.NewBlockReader(int64(r.super.DirTableStart + uint64(i.Info.(inode.BasicDirectory).DirectoryIndex))) if err != nil { return err