From b65cd51053703d2b0eb6992c8a815430474578ed Mon Sep 17 00:00:00 2001 From: Bulat Khasanov Date: Thu, 2 May 2024 14:27:18 +0300 Subject: [PATCH] Fix invalid Pointer convertion (#97) --- .github/workflows/ci.yml | 2 +- .gitignore | 2 ++ clib/clib.go | 65 ++++++++++++++++++++-------------------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 886460d..efee397 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -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 diff --git a/.gitignore b/.gitignore index daf913b..11b90db 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,5 @@ _testmain.go *.exe *.test *.prof + +.idea diff --git a/clib/clib.go b/clib/clib.go index de8cf3c..e8319ae 100644 --- a/clib/clib.go +++ b/clib/clib.go @@ -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 @@ -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 } @@ -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 } @@ -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} @@ -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 { @@ -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") @@ -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") } @@ -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") @@ -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) @@ -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 @@ -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 } @@ -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 @@ -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 @@ -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 @@ -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) }