Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit b65cd51

Browse files
authored
Fix invalid Pointer convertion (#97)
1 parent 52975fd commit b65cd51

File tree

3 files changed

+36
-33
lines changed

3 files changed

+36
-33
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ jobs:
3838
go-version: ${{ matrix.go }}
3939
check-latest: true
4040
- name: Run Go tests
41-
run: go test ${{ matrix.link.goflags }} ./...
41+
run: go test -race ${{ matrix.link.goflags }} ./...
4242
- name: Test linking capability
4343
run: |
4444
go build -o linktest ${{ matrix.link.goflags }} ./test/link

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ _testmain.go
2222
*.exe
2323
*.test
2424
*.prof
25+
26+
.idea

clib/clib.go

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -608,8 +608,8 @@ func isSafeName(name string) error {
608608
for i := 0; i < len(name); i++ {
609609
buf[i] = C.xmlChar(name[i])
610610
}
611-
bufptr := (uintptr)(unsafe.Pointer(&buf[0]))
612-
if C.MY_test_node_name((*C.xmlChar)(unsafe.Pointer(bufptr))) == 0 {
611+
bufptr := unsafe.Pointer(&buf[0])
612+
if C.MY_test_node_name((*C.xmlChar)(bufptr)) == 0 {
613613
return ErrInvalidNodeName
614614
}
615615
return nil
@@ -643,11 +643,11 @@ func XMLNewNode(ns PtrSource, name string) (uintptr, error) {
643643
for i := 0; i < len(name); i++ {
644644
cname[i] = C.xmlChar(name[i])
645645
}
646-
cnameptr := (uintptr)(unsafe.Pointer(&cname[0]))
646+
cnameptr := unsafe.Pointer(&cname[0])
647647

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

677677
ent, err := XMLEncodeEntitiesReentrant(docptr, v)
678678
if err != nil {
679679
return 0, err
680680
}
681-
attr := C.xmlNewDocProp(docptr, (*C.xmlChar)(unsafe.Pointer(kxptr)), ent)
681+
attr := C.xmlNewDocProp(docptr, (*C.xmlChar)(kxptr), ent)
682682
return uintptr(unsafe.Pointer(attr)), nil
683683
}
684684

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

706706
ns := C.xmlSearchNsByHref(
707707
(*C.xmlDoc)(unsafe.Pointer(docptr)),
708708
(*C.xmlNode)(unsafe.Pointer(nptr)),
709-
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
709+
(*C.xmlChar)(xcuriptr),
710710
)
711711
if ns == nil {
712712
return 0, ErrNamespaceNotFound{Target: uri}
@@ -1357,12 +1357,12 @@ func XMLCreateAttributeNS(doc PtrSource, uri, k, v string) (uintptr, error) {
13571357
for i := 0; i < len(uri); i++ {
13581358
xcuri[i] = C.xmlChar(uri[i])
13591359
}
1360-
xcuriptr := (uintptr)(unsafe.Pointer(&xcuri[0]))
1360+
xcuriptr := unsafe.Pointer(&xcuri[0])
13611361

13621362
ns := C.xmlSearchNsByHref(
13631363
(*C.xmlDoc)(unsafe.Pointer(dptr)),
13641364
(*C.xmlNode)(unsafe.Pointer(rootptr)),
1365-
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
1365+
(*C.xmlChar)(xcuriptr),
13661366
)
13671367
if ns == nil {
13681368
if len(prefix) > MaxAttributeNameLength {
@@ -1372,12 +1372,12 @@ func XMLCreateAttributeNS(doc PtrSource, uri, k, v string) (uintptr, error) {
13721372
for i := 0; i < len(prefix); i++ {
13731373
xcprefix[i] = C.xmlChar(prefix[i])
13741374
}
1375-
xcprefixptr := (uintptr)(unsafe.Pointer(&xcprefix))
1375+
xcprefixptr := unsafe.Pointer(&xcprefix)
13761376

13771377
ns = C.xmlNewNs(
13781378
rootptr,
1379-
(*C.xmlChar)(unsafe.Pointer(xcuriptr)),
1380-
(*C.xmlChar)(unsafe.Pointer(xcprefixptr)),
1379+
(*C.xmlChar)(xcuriptr),
1380+
(*C.xmlChar)(xcprefixptr),
13811381
)
13821382
if ns == nil {
13831383
return 0, errors.New("failed to create namespace")
@@ -1415,9 +1415,9 @@ func XMLCreateElement(d PtrSource, name string) (uintptr, error) {
14151415
for i := 0; i < len(name); i++ {
14161416
xcname[i] = C.xmlChar(name[i])
14171417
}
1418-
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
1418+
xcnameptr := unsafe.Pointer(&xcname[0])
14191419

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

14481448
var xcname [MaxElementNameLength]C.xmlChar
14491449
for i := 0; i < len(name); i++ {
14501450
xcname[i] = C.xmlChar(name[i])
14511451
}
1452-
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
1452+
xcnameptr := unsafe.Pointer(&xcname[0])
14531453

14541454
nptr := C.MY_xmlCreateElementNS(
14551455
dptr,
1456-
(*C.xmlChar)(unsafe.Pointer(xcnsuriptr)),
1457-
(*C.xmlChar)(unsafe.Pointer(xcnameptr)),
1456+
(*C.xmlChar)(xcnsuriptr),
1457+
(*C.xmlChar)(xcnameptr),
14581458
)
14591459
if nptr == nil {
14601460
return 0, errors.New("failed to create element")
@@ -1539,11 +1539,12 @@ func XMLDocumentString(doc PtrSource, encoding string, format bool) string {
15391539
for i := 0; i < len(encoding); i++ {
15401540
xcencoding[i] = C.char(encoding[i])
15411541
}
1542-
xcencodingptr := (uintptr)(unsafe.Pointer(&xcencoding[0]))
1542+
xcencodingptr := unsafe.Pointer(&xcencoding[0])
15431543

15441544
var i C.int
15451545
var xc *C.xmlChar
1546-
C.xmlDocDumpFormatMemoryEnc(dptr, &xc, &i, (*C.char)(unsafe.Pointer(xcencodingptr)), intformat)
1546+
1547+
C.xmlDocDumpFormatMemoryEnc(dptr, &xc, &i, (*C.char)(xcencodingptr), intformat)
15471548

15481549
defer C.MY_xmlFree(unsafe.Pointer(xc))
15491550
return xmlCharToString(xc)
@@ -1627,7 +1628,7 @@ func XMLSetProp(n PtrSource, name, value string) error {
16271628
for i := 0; i < len(name); i++ {
16281629
xcname[i] = C.xmlChar(name[i])
16291630
}
1630-
xcnameptr := (uintptr)(unsafe.Pointer(&xcname[0]))
1631+
xcnameptr := unsafe.Pointer(&xcname[0])
16311632

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

16411642
C.xmlSetProp(
16421643
nptr,
1643-
(*C.xmlChar)(unsafe.Pointer(xcnameptr)),
1644-
(*C.xmlChar)(unsafe.Pointer(xcvalueptr)),
1644+
(*C.xmlChar)(xcnameptr),
1645+
(*C.xmlChar)(xcvalueptr),
16451646
)
16461647
return nil
16471648
}
@@ -1928,9 +1929,9 @@ func XMLXPathCompile(s string) (uintptr, error) {
19281929
for i := 0; i < len(s); i++ {
19291930
xcs[i] = C.xmlChar(s[i])
19301931
}
1931-
xcsptr := (uintptr)(unsafe.Pointer(&xcs[0]))
1932+
xcsptr := unsafe.Pointer(&xcs[0])
19321933

1933-
if p := C.xmlXPathCompile((*C.xmlChar)(unsafe.Pointer(xcsptr))); p != nil {
1934+
if p := C.xmlXPathCompile((*C.xmlChar)(xcsptr)); p != nil {
19341935
return uintptr(unsafe.Pointer(p)), nil
19351936
}
19361937
return 0, ErrXPathCompileFailure
@@ -1983,7 +1984,7 @@ func XMLXPathRegisterNS(x PtrSource, prefix, nsuri string) error {
19831984
for i := 0; i < len(prefix); i++ {
19841985
cprefix[i] = C.xmlChar(prefix[i])
19851986
}
1986-
cprefixptr := (uintptr)(unsafe.Pointer(&cprefix[0]))
1987+
cprefixptr := unsafe.Pointer(&cprefix[0])
19871988

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

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

20202021
if xptr.doc == nil {
20212022
var xcv [3]C.xmlChar = [3]C.xmlChar{'1', '.', '0'}
2022-
xcvptr := (uintptr)(unsafe.Pointer(&xcv[0]))
2023-
xptr.doc = C.xmlNewDoc((*C.xmlChar)(unsafe.Pointer(xcvptr)))
2023+
xcvptr := unsafe.Pointer(&xcv[0])
2024+
xptr.doc = C.xmlNewDoc((*C.xmlChar)(xcvptr))
20242025

20252026
defer C.xmlFreeDoc(xptr.doc)
20262027
}

0 commit comments

Comments
 (0)