Fix single byte overflow case for sized render
This commit is contained in:
@@ -251,16 +251,15 @@ func(pg *Page) prepare(sym string, values map[string]string, idx uint16) (map[st
|
||||
tb := strings.Builder{}
|
||||
rb := strings.Builder{}
|
||||
|
||||
netRemaining := remaining
|
||||
netRemaining := remaining - 1
|
||||
if len(sinkValues) > 1 {
|
||||
log.Printf("menusizes %v", menuSizes)
|
||||
netRemaining -= menuSizes[1] - 1
|
||||
}
|
||||
|
||||
for i, v := range sinkValues {
|
||||
log.Printf("processing sinkvalue %v: %s", i, v)
|
||||
l += len(v)
|
||||
if uint32(l) > netRemaining {
|
||||
log.Printf("processing sinkvalue %v: %s", i, v)
|
||||
if uint32(l) > netRemaining - 1 {
|
||||
if tb.Len() == 0 {
|
||||
return nil, fmt.Errorf("capacity insufficient for sink field %v", i)
|
||||
}
|
||||
|
||||
@@ -47,6 +47,7 @@ func(szr *Sizer) Check(s string) (uint32, bool) {
|
||||
if szr.outputSize > 0 {
|
||||
if l > szr.outputSize {
|
||||
log.Printf("sizer check fails with length %v: %s", l, szr)
|
||||
log.Printf("sizer contents:\n%s", s)
|
||||
return 0, false
|
||||
}
|
||||
l = szr.outputSize - l
|
||||
|
||||
@@ -192,3 +192,31 @@ eleven twelve
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func TestManySizes(t *testing.T) {
|
||||
for i := 50; i < 128; i++ {
|
||||
st := state.NewState(0)
|
||||
ca := cache.NewCache()
|
||||
mn := NewMenu().WithOutputSize(32)
|
||||
mrs := resource.NewMenuResource().WithEntryFuncGetter(funcFor).WithTemplateGetter(getTemplate)
|
||||
rs := TestSizeResource{
|
||||
mrs,
|
||||
}
|
||||
szr := NewSizer(uint32(i))
|
||||
pg := NewPage(ca, rs).WithSizer(szr).WithMenu(mn)
|
||||
ca.Push()
|
||||
st.Down("pages")
|
||||
ca.Add("foo", "inky", 10)
|
||||
ca.Add("bar", "pinky", 10)
|
||||
ca.Add("baz", "blinky", 10)
|
||||
ca.Add("xyzzy", "inky pinky\nblinky clyde sue\ntinkywinky dipsy\nlala poo\none two three four five six seven\neight nine ten\neleven twelve", 0)
|
||||
pg.Map("foo")
|
||||
pg.Map("bar")
|
||||
pg.Map("baz")
|
||||
pg.Map("xyzzy")
|
||||
_, err := pg.Render("pages", 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user