mirror of
https://github.com/securego/gosec.git
synced 2024-11-05 11:35:51 +00:00
Fix conversion overflow false positive when using ParseUint
This commit is contained in:
parent
c52dc0ea4e
commit
4ae73c8ba3
2 changed files with 37 additions and 2 deletions
|
@ -134,9 +134,10 @@ func isStringToIntConversion(instr *ssa.Convert, dstType string) bool {
|
||||||
for {
|
for {
|
||||||
switch v := original.(type) {
|
switch v := original.(type) {
|
||||||
case *ssa.Call:
|
case *ssa.Call:
|
||||||
if v.Call.StaticCallee() != nil && v.Call.StaticCallee().Name() == "ParseInt" {
|
if v.Call.StaticCallee() != nil && (v.Call.StaticCallee().Name() == "ParseInt" || v.Call.StaticCallee().Name() == "ParseUint") {
|
||||||
if len(v.Call.Args) == 3 {
|
if len(v.Call.Args) == 3 {
|
||||||
if bitSize, ok := v.Call.Args[2].(*ssa.Const); ok {
|
if bitSize, ok := v.Call.Args[2].(*ssa.Const); ok {
|
||||||
|
signed := v.Call.StaticCallee().Name() == "ParseInt"
|
||||||
bitSizeValue, err := strconv.Atoi(bitSize.Value.String())
|
bitSizeValue, err := strconv.Atoi(bitSize.Value.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
|
@ -145,7 +146,7 @@ func isStringToIntConversion(instr *ssa.Convert, dstType string) bool {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
isSafe := bitSizeValue <= dstInt.size
|
isSafe := bitSizeValue <= dstInt.size && signed == dstInt.signed
|
||||||
return isSafe
|
return isSafe
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -356,4 +356,38 @@ func main() {
|
||||||
}
|
}
|
||||||
`,
|
`,
|
||||||
}, 0, gosec.NewConfig()},
|
}, 0, gosec.NewConfig()},
|
||||||
|
{[]string{
|
||||||
|
`
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var a string = "13"
|
||||||
|
b, _ := strconv.ParseUint(a, 10, 8)
|
||||||
|
c := uint8(b)
|
||||||
|
fmt.Printf("%d\n", c)
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
}, 0, gosec.NewConfig()},
|
||||||
|
{[]string{
|
||||||
|
`
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var a string = "13"
|
||||||
|
b, _ := strconv.ParseInt(a, 10, 8)
|
||||||
|
c := uint8(b)
|
||||||
|
fmt.Printf("%d\n", c)
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
}, 1, gosec.NewConfig()},
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue