diff --git a/laymanshex.go b/laymanshex.go index 3972878..a7f1a9b 100644 --- a/laymanshex.go +++ b/laymanshex.go @@ -175,6 +175,9 @@ func (part *filePart) setHandling() { writeTo := func(w io.Writer, bo binary.ByteOrder, s string) { buf, err := hex.DecodeString(s) optPanic("invalid string of hex values: "+s, err) + if int64(len(buf)) > bytes { + panic(fmt.Sprintf("string %s is too long for byte array %s : want %d bytes", s, part.name, bytes)) + } binaryWrite(w, bo, buf) } part.handling = handling{bytes, readFrom, writeTo} @@ -305,6 +308,18 @@ func backup(binpath string) { fmt.Println("Created backup " + backuppath + "\n") } +func seekErr(i int, name string, inner error) string { + if inner != nil { + namepart := "" + if name != "" { + namepart = " name: " + name + } + return fmt.Sprintf("could not advance in file (stuck at part %d%s)", i, namepart) + } else { + return "" + } +} + func setValues(descr fileDescription, binpath string, vals map[string]string) { backup(binpath) f, err := os.OpenFile(binpath, os.O_RDWR, 0666) @@ -320,7 +335,7 @@ func setValues(descr fileDescription, binpath string, vals map[string]string) { } if needSeek { _, err = f.Seek(part.handling.bytes, 1) - optPanic("set: could not advance in file (stuck at part "+strconv.Itoa(i)+"name: "+part.name+")", err) + optPanic(seekErr(i, part.name, err), err) } } } @@ -333,7 +348,7 @@ func getValues(descr fileDescription, binpath string) map[string]string { for i, part := range descr.parts { if part.name == "" { _, err = f.Seek(part.handling.bytes, 1) - optPanic("get: could not advance in file (stuck at part "+strconv.Itoa(i)+"name: "+part.name+")", err) + optPanic(seekErr(i, part.name, err), err) } else { vals[part.name] = part.handling.readFrom(f, descr.byteOrder) } @@ -341,7 +356,7 @@ func getValues(descr fileDescription, binpath string) map[string]string { return vals } -func padding(descr fileDescription) string { +func fmtPadding(descr fileDescription) string { pad := 0 for _, part := range descr.parts { if n := len(part.name); n > pad { @@ -354,7 +369,7 @@ func padding(descr fileDescription) string { func printValues(descr fileDescription, vals map[string]string) { for _, part := range descr.parts { if part.name != "" { - fmt.Printf("%"+padding(descr)+"s = %s\n", part.name, vals[part.name]) + fmt.Printf("%"+fmtPadding(descr)+"s = %s\n", part.name, vals[part.name]) } } }