[ffmpeg][goav][issues] goav Dictionary crash double free
最编程
2024-01-08 10:17:46
...
[ffmpeg][goav][issues] goav Dictionary crash double free
用goav 配置avoption时的一个bug
github.com/giorgisio/goav/issues/57
code :
var dict *avutil.Dictionary = &avutil.Dictionary{}
er := dict.AvDictSet("profile", "main", 0)
if er < 0 {
log.Critical("AvDictSet failed")
return
}
er = dict.AvDictSet("level", "51", 0)
if er < 0 {
log.Critical("AvDictSet failed")
return
}
fmt.Println(dict.AvDictCount())
fmt.Println(dict.AvDictGet("profile", nil, 0))
fmt.Println(dict.AvDictGet("level", nil, 0))
err = context_enc.AvcodecOpen2(codec_enc, (**avcodec.Dictionary)(unsafe.Pointer(&dict)))
if err < 0 {
log.Critical("AvcodecOpen2 failed.")
return
}
double free or corruption (out)
SIGABRT: abort
PC=0x7f3a6082aed7 m=0 sigcode=18446744073709551610
goroutine 0 [idle]:
runtime: unknown pc 0x7f3a6082aed7
stack: frame={sp:0x7fff8f1abb70, fp:0x0} stack=[0x7fff8e9ad228,0x7fff8f1ac250)
00007fff8f1aba70: 0000000000000000 000000000227fbc0
00007fff8f1aba80: 00000000ffffffff 00007fff8f1abae8
00007fff8f1aba90: 00007f3a60cc3030 00007f3a623509f0
00007fff8f1abaa0: 00007f3a60cc5c25 0000000000000017
根本原因应该是没有dict.h里面没有AVDictionary的定义,添加一个alloc函数可以解决这个问题。
然后这样分配dict空间:
var dict *avutil.Dictionary = avutil.AvDictAlloc()
er := dict.AvDictSet("profile", "constrained_baseline", 0)
if er < 0 {
log.Critical("AvDictSet failed")
return
}
er = dict.AvDictSet("level", "52", 0)
if er < 0 {
log.Critical("AvDictSet failed")
return
}
fmt.Println(dict.AvDictCount())
//fmt.Println(dict.AvDictGet("profile", nil, 0))
//fmt.Println(dict.AvDictGet("level", nil, 0))
//dict.AvDictFree()
err = context_enc.AvcodecOpen2(codec_enc, (**avcodec.Dictionary)(unsafe.Pointer(&dict)))
if err < 0 {
log.Critical("AvcodecOpen2 failed.")
return
}
fmt.Println(dict.AvDictCount())