Skip to content

Commit

Permalink
fix decode input checks
Browse files Browse the repository at this point in the history
  • Loading branch information
IncSW committed Aug 19, 2021
1 parent be4f1c4 commit 4d6ce34
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 46 deletions.
149 changes: 104 additions & 45 deletions decoder.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,128 +27,189 @@ func (e *Encoding) decode(dst []byte, src []byte) int {
_v := vx
vx = ctou32(ip + 8 + 0*8 + 4)
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+0*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 1*8)
stou32(op+1*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+1*6, _u)
_v := vx
vx = ctou32(ip + 8 + 1*8 + 4)
stou32(op+1*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+1*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 2*8)
stou32(op+2*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+2*6, _u)
_v := vx
vx = ctou32(ip + 8 + 2*8 + 4)
stou32(op+2*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+2*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 3*8)
stou32(op+3*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+3*6, _u)
_v := vx
vx = ctou32(ip + 8 + 3*8 + 4)
stou32(op+3*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+3*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 4*8)
stou32(op+4*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+4*6, _u)
_v := vx
vx = ctou32(ip + 8 + 4*8 + 4)
stou32(op+4*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+4*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 5*8)
stou32(op+5*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+5*6, _u)
_v := vx
vx = ctou32(ip + 8 + 5*8 + 4)
stou32(op+5*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+5*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 6*8)
stou32(op+6*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+6*6, _u)
_v := vx
vx = ctou32(ip + 8 + 6*8 + 4)
stou32(op+6*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+6*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 7*8)
stou32(op+7*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+7*6, _u)
_v := vx
vx = ctou32(ip + 8 + 7*8 + 4)
stou32(op+7*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+7*6+3, _v)
}

{
_u := ux
ux = ctou32(ip + 8 + 8*8)
stou32(op+8*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+8*6, _u)
_v := vx
vx = ctou32(ip + 8 + 8*8 + 4)
stou32(op+8*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+8*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 9*8)
stou32(op+9*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+9*6, _u)
_v := vx
vx = ctou32(ip + 8 + 9*8 + 4)
stou32(op+9*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+9*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 10*8)
stou32(op+10*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+10*6, _u)
_v := vx
vx = ctou32(ip + 8 + 10*8 + 4)
stou32(op+10*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+10*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 11*8)
stou32(op+11*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+11*6, _u)
_v := vx
vx = ctou32(ip + 8 + 11*8 + 4)
stou32(op+11*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+11*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 12*8)
stou32(op+12*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+12*6, _u)
_v := vx
vx = ctou32(ip + 8 + 12*8 + 4)
stou32(op+12*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+12*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 13*8)
stou32(op+13*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+13*6, _u)
_v := vx
vx = ctou32(ip + 8 + 13*8 + 4)
stou32(op+13*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+13*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 14*8)
stou32(op+14*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+14*6, _u)
_v := vx
vx = ctou32(ip + 8 + 14*8 + 4)
stou32(op+14*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+14*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 15*8)
stou32(op+15*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+15*6, _u)
_v := vx
vx = ctou32(ip + 8 + 15*8 + 4)
stou32(op+15*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+15*6+3, _v)
}
ip += 128
op += (128 / 4) * 3
Expand All @@ -162,15 +223,21 @@ func (e *Encoding) decode(dst []byte, src []byte) int {
stou32(op+0*6, _u)
_v := vx
vx = ctou32(ip + 8 + 0*8 + 4)
stou32(op+0*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+0*6+3, _v)
}
{
_u := ux
ux = ctou32(ip + 8 + 1*8)
stou32(op+1*6, (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24]))
_u = (e.lutXd0[byte(_u)] | e.lutXd1[byte(_u>>8)] | e.lutXd2[byte(_u>>16)] | e.lutXd3[_u>>24])
cu |= _u
stou32(op+1*6, _u)
_v := vx
vx = ctou32(ip + 8 + 1*8 + 4)
stou32(op+1*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+1*6+3, _v)
}
ip += 16
op += (16 / 4) * 3
Expand All @@ -181,7 +248,9 @@ func (e *Encoding) decode(dst []byte, src []byte) int {
cu |= _u
stou32(op+0*6, _u)
_v := vx
stou32(op+0*6+3, (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24]))
_v = (e.lutXd0[byte(_v)] | e.lutXd1[byte(_v>>8)] | e.lutXd2[byte(_v>>16)] | e.lutXd3[_v>>24])
cu |= _v
stou32(op+0*6+3, _v)
ip += 8
op += (8 / 4) * 3
}
Expand All @@ -201,9 +270,6 @@ func (e *Encoding) decode(dst []byte, src []byte) int {
l = 3
if *(*byte)(unsafe.Pointer(ip + 2)) == '=' {
l = 2
if *(*byte)(unsafe.Pointer(ip + 1)) == '=' {
l = 1
}
}
}
}
Expand Down Expand Up @@ -244,14 +310,7 @@ func (e *Encoding) decode(dst []byte, src []byte) int {
cu |= u
break
case 1:
if !e.pad && op-opstart >= dstlen {
return 0
}
u = e.lutXd0[*(*byte)(unsafe.Pointer(ip + 0))]
*(*byte)(unsafe.Pointer(op)) = up[0]
op++
cu |= u
break
return 0
}
if cu == 0xffffffff {
return 0
Expand Down
2 changes: 1 addition & 1 deletion decoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func TestDecoder(t *testing.T) {
ownResult, ownErr = RawStdEncoding.DecodeString(src)
if (stdErr != nil && ownErr == nil) || (stdErr == nil && ownErr != nil) {
t.Log("expected:", stdErr)
t.Log("actual: ", src)
t.Log("actual: ", ownErr)
t.Fatal()
} else if stdErr == nil && !bytes.Equal(stdResult, ownResult) {
t.Log("src: ", src)
Expand Down

0 comments on commit 4d6ce34

Please sign in to comment.