Skip to content

Commit

Permalink
Fix invalid Pointer convertion (#97)
Browse files Browse the repository at this point in the history
  • Loading branch information
khasanovbi committed May 2, 2024
1 parent 52975fd commit b65cd51
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 33 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
go-version: ${{ matrix.go }}
check-latest: true
- name: Run Go tests
run: go test ${{ matrix.link.goflags }} ./...
run: go test -race ${{ matrix.link.goflags }} ./...
- name: Test linking capability
run: |
go build -o linktest ${{ matrix.link.goflags }} ./test/link
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ _testmain.go
*.exe
*.test
*.prof

.idea
65 changes: 33 additions & 32 deletions clib/clib.go
Original file line number Diff line number Diff line change
Expand Up @@ -608,8 +608,8 @@ func isSafeName(name string) error {
for i := 0; i < len(name); i++ {
buf[i] = C.xmlChar(name[i])
}
bufptr := (uintptr)(unsafe.Pointer(&buf[0]))
if C.MY_test_node_name((*C.xmlChar)(unsafe.Pointer(bufptr))) == 0 {
bufptr := unsafe.Pointer(&buf[0])
if C.MY_test_node_name((*C.xmlChar)(bufptr)) == 0 {
return ErrInvalidNodeName
}
return nil
Expand Down Expand Up @@ -643,11 +643,11 @@ func XMLNewNode(ns PtrSource, name string) (uintptr, error) {
for i := 0; i < len(name); i++ {
cname[i] = C.xmlChar(name[i])
}
cnameptr := (uintptr)(unsafe.Pointer(&cname[0]))
cnameptr := unsafe.Pointer(&cname[0])

n := C.xmlNewNode(
(*C.xmlNs)(unsafe.Pointer(nsptr)),
(*C.xmlChar)(unsafe.Pointer(cnameptr)),
(*C.xmlChar)(cnameptr),
)
return uintptr(unsafe.Pointer(n)), nil
}
Expand All @@ -672,13 +672,13 @@ func XMLNewDocProp(doc PtrSource, k, v string) (uintptr, error) {
}
// Taking the pointer as uintptr somehow fools the go compiler
// to not think this escapes to heap
kxptr := uintptr(unsafe.Pointer(&kx[0]))
kxptr := unsafe.Pointer(&kx[0])

ent, err := XMLEncodeEntitiesReentrant(docptr, v)
if err != nil {
return 0, err
}
attr := C.xmlNewDocProp(docptr, (*C.xmlChar)(unsafe.Pointer(kxptr)), ent)
attr := C.xmlNewDocProp(docptr, (*C.xmlChar)(kxptr), ent)
return uintptr(unsafe.Pointer(attr)), nil
}

Expand All @@ -701,12 +701,12 @@ func XMLSearchNsByHref(doc PtrSource, _ PtrSource, uri string) (uintptr, error)
for i := 0; i < len(uri); i++ {
xcuri[i] = C.xmlChar(uri[i])
}
xcuriptr := (uintptr)(unsafe.Pointer(&xcuri[0]))
xcuriptr := unsafe.Pointer(&xcuri[0])

ns := C.xmlSearchNsByHref(
(*C.xmlDoc)(unsafe.Pointer(docptr)),
(*C.xmlNode)(unsafe.Pointer(nptr)),
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
(*C.xmlChar)(xcuriptr),
)
if ns == nil {
return 0, ErrNamespaceNotFound{Target: uri}
Expand Down Expand Up @@ -1357,12 +1357,12 @@ func XMLCreateAttributeNS(doc PtrSource, uri, k, v string) (uintptr, error) {
for i := 0; i < len(uri); i++ {
xcuri[i] = C.xmlChar(uri[i])
}
xcuriptr := (uintptr)(unsafe.Pointer(&xcuri[0]))
xcuriptr := unsafe.Pointer(&xcuri[0])

ns := C.xmlSearchNsByHref(
(*C.xmlDoc)(unsafe.Pointer(dptr)),
(*C.xmlNode)(unsafe.Pointer(rootptr)),
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
(*C.xmlChar)(xcuriptr),
)
if ns == nil {
if len(prefix) > MaxAttributeNameLength {
Expand All @@ -1372,12 +1372,12 @@ func XMLCreateAttributeNS(doc PtrSource, uri, k, v string) (uintptr, error) {
for i := 0; i < len(prefix); i++ {
xcprefix[i] = C.xmlChar(prefix[i])
}
xcprefixptr := (uintptr)(unsafe.Pointer(&xcprefix))
xcprefixptr := unsafe.Pointer(&xcprefix)

ns = C.xmlNewNs(
rootptr,
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
(*C.xmlChar)(unsafe.Pointer(xcprefixptr)),
(*C.xmlChar)(xcuriptr),
(*C.xmlChar)(xcprefixptr),
)
if ns == nil {
return 0, errors.New("failed to create namespace")
Expand Down Expand Up @@ -1415,9 +1415,9 @@ func XMLCreateElement(d PtrSource, name string) (uintptr, error) {
for i := 0; i < len(name); i++ {
xcname[i] = C.xmlChar(name[i])
}
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
xcnameptr := unsafe.Pointer(&xcname[0])

nptr := C.MY_xmlCreateElement(dptr, (*C.xmlChar)(unsafe.Pointer(xcnameptr)))
nptr := C.MY_xmlCreateElement(dptr, (*C.xmlChar)(xcnameptr))
if nptr == nil {
return 0, errors.New("element creation failed")
}
Expand All @@ -1443,18 +1443,18 @@ func XMLCreateElementNS(doc PtrSource, nsuri, name string) (uintptr, error) {
for i := 0; i < len(nsuri); i++ {
xcnsuri[i] = C.xmlChar(nsuri[i])
}
xcnsuriptr := (uintptr)(unsafe.Pointer(&xcnsuri[0]))
xcnsuriptr := unsafe.Pointer(&xcnsuri[0])

var xcname [MaxElementNameLength]C.xmlChar
for i := 0; i < len(name); i++ {
xcname[i] = C.xmlChar(name[i])
}
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
xcnameptr := unsafe.Pointer(&xcname[0])

nptr := C.MY_xmlCreateElementNS(
dptr,
(*C.xmlChar)(unsafe.Pointer(xcnsuriptr)),
(*C.xmlChar)(unsafe.Pointer(xcnameptr)),
(*C.xmlChar)(xcnsuriptr),
(*C.xmlChar)(xcnameptr),
)
if nptr == nil {
return 0, errors.New("failed to create element")
Expand Down Expand Up @@ -1539,11 +1539,12 @@ func XMLDocumentString(doc PtrSource, encoding string, format bool) string {
for i := 0; i < len(encoding); i++ {
xcencoding[i] = C.char(encoding[i])
}
xcencodingptr := (uintptr)(unsafe.Pointer(&xcencoding[0]))
xcencodingptr := unsafe.Pointer(&xcencoding[0])

var i C.int
var xc *C.xmlChar
C.xmlDocDumpFormatMemoryEnc(dptr, &xc, &i, (*C.char)(unsafe.Pointer(xcencodingptr)), intformat)

C.xmlDocDumpFormatMemoryEnc(dptr, &xc, &i, (*C.char)(xcencodingptr), intformat)

defer C.MY_xmlFree(unsafe.Pointer(xc))
return xmlCharToString(xc)
Expand Down Expand Up @@ -1627,7 +1628,7 @@ func XMLSetProp(n PtrSource, name, value string) error {
for i := 0; i < len(name); i++ {
xcname[i] = C.xmlChar(name[i])
}
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
xcnameptr := unsafe.Pointer(&xcname[0])

if len(value) > MaxValueBufferSize {
return ErrValueTooLong
Expand All @@ -1636,12 +1637,12 @@ func XMLSetProp(n PtrSource, name, value string) error {
for i := 0; i < len(value); i++ {
xcvalue[i] = C.xmlChar(value[i])
}
xcvalueptr := (uintptr)(unsafe.Pointer(&xcvalue[0]))
xcvalueptr := unsafe.Pointer(&xcvalue[0])

C.xmlSetProp(
nptr,
(*C.xmlChar)(unsafe.Pointer(xcnameptr)),
(*C.xmlChar)(unsafe.Pointer(xcvalueptr)),
(*C.xmlChar)(xcnameptr),
(*C.xmlChar)(xcvalueptr),
)
return nil
}
Expand Down Expand Up @@ -1928,9 +1929,9 @@ func XMLXPathCompile(s string) (uintptr, error) {
for i := 0; i < len(s); i++ {
xcs[i] = C.xmlChar(s[i])
}
xcsptr := (uintptr)(unsafe.Pointer(&xcs[0]))
xcsptr := unsafe.Pointer(&xcs[0])

if p := C.xmlXPathCompile((*C.xmlChar)(unsafe.Pointer(xcsptr))); p != nil {
if p := C.xmlXPathCompile((*C.xmlChar)(xcsptr)); p != nil {
return uintptr(unsafe.Pointer(p)), nil
}
return 0, ErrXPathCompileFailure
Expand Down Expand Up @@ -1983,7 +1984,7 @@ func XMLXPathRegisterNS(x PtrSource, prefix, nsuri string) error {
for i := 0; i < len(prefix); i++ {
cprefix[i] = C.xmlChar(prefix[i])
}
cprefixptr := (uintptr)(unsafe.Pointer(&cprefix[0]))
cprefixptr := unsafe.Pointer(&cprefix[0])

if len(nsuri) > MaxNamespaceURILength {
return ErrNamespaceURITooLong
Expand All @@ -1992,9 +1993,9 @@ func XMLXPathRegisterNS(x PtrSource, prefix, nsuri string) error {
for i := 0; i < len(nsuri); i++ {
cnsuri[i] = C.xmlChar(nsuri[i])
}
cnsuriptr := (uintptr)(unsafe.Pointer(&cnsuri[0]))
cnsuriptr := unsafe.Pointer(&cnsuri[0])

if res := C.xmlXPathRegisterNs(xptr, (*C.xmlChar)(unsafe.Pointer(cprefixptr)), (*C.xmlChar)(unsafe.Pointer(cnsuriptr))); res == -1 {
if res := C.xmlXPathRegisterNs(xptr, (*C.xmlChar)(cprefixptr), (*C.xmlChar)(cnsuriptr)); res == -1 {
return ErrXPathNamespaceRegisterFailure
}
return nil
Expand All @@ -2019,8 +2020,8 @@ func XMLEvalXPath(x PtrSource, expr PtrSource) (uintptr, error) {

if xptr.doc == nil {
var xcv [3]C.xmlChar = [3]C.xmlChar{'1', '.', '0'}
xcvptr := (uintptr)(unsafe.Pointer(&xcv[0]))
xptr.doc = C.xmlNewDoc((*C.xmlChar)(unsafe.Pointer(xcvptr)))
xcvptr := unsafe.Pointer(&xcv[0])
xptr.doc = C.xmlNewDoc((*C.xmlChar)(xcvptr))

defer C.xmlFreeDoc(xptr.doc)
}
Expand Down

0 comments on commit b65cd51

Please sign in to comment.