]> Cypherpunks repositories - gostls13.git/commitdiff
net: check for NUL bytes in strings passed to C functions
authorIan Lance Taylor <iant@golang.org>
Tue, 18 Apr 2023 21:48:36 +0000 (14:48 -0700)
committerGopher Robot <gobot@golang.org>
Wed, 19 Apr 2023 00:29:39 +0000 (00:29 +0000)
Use syscall.BytePtrFromString and syscall.ByteSliceFromString.

Change-Id: I9409ecd93aaca82390bf3f34be56ec354148a241
Reviewed-on: https://go-review.googlesource.com/c/go/+/486015
Run-TryBot: Ian Lance Taylor <iant@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>

src/net/cgo_unix.go
src/net/cgo_unix_cgo.go
src/net/cgo_unix_syscall.go

index c5281ad3a5a2fef8c88507771e4d90c2d62a5559..de6a64b23b06874b4e77d8958de85b1ce16639e6 100644 (file)
@@ -94,8 +94,10 @@ func cgoLookupPort(ctx context.Context, network, service string) (port int, err
 }
 
 func cgoLookupServicePort(hints *_C_struct_addrinfo, network, service string) (port int, err error) {
-       cservice := make([]byte, len(service)+1)
-       copy(cservice, service)
+       cservice, err := syscall.ByteSliceFromString(service)
+       if err != nil {
+               return 0, &DNSError{Err: err.Error(), Name: network + "/" + service}
+       }
        // Lowercase the C service name.
        for i, b := range cservice[:len(service)] {
                cservice[i] = lowerASCII(b)
@@ -147,10 +149,12 @@ func cgoLookupHostIP(network, name string) (addrs []IPAddr, err error) {
                *_C_ai_family(&hints) = _C_AF_INET6
        }
 
-       h := make([]byte, len(name)+1)
-       copy(h, name)
+       h, err := syscall.BytePtrFromString(name)
+       if err != nil {
+               return nil, &DNSError{Err: err.Error(), Name: name}
+       }
        var res *_C_struct_addrinfo
-       gerrno, err := _C_getaddrinfo((*_C_char)(unsafe.Pointer(&h[0])), nil, &hints, &res)
+       gerrno, err := _C_getaddrinfo((*_C_char)(unsafe.Pointer(h)), nil, &hints, &res)
        if gerrno != 0 {
                isErrorNoSuchHost := false
                isTemporary := false
@@ -325,12 +329,14 @@ func cgoResSearch(hostname string, rtype, class int) ([]dnsmessage.Resource, err
        buf := (*_C_uchar)(_C_malloc(uintptr(bufSize)))
        defer _C_free(unsafe.Pointer(buf))
 
-       s := _C_CString(hostname)
-       defer _C_FreeCString(s)
+       s, err := syscall.BytePtrFromString(hostname)
+       if err != nil {
+               return nil, err
+       }
 
        var size int
        for {
-               size, _ = _C_res_nsearch(state, s, class, rtype, buf, bufSize)
+               size, _ = _C_res_nsearch(state, (*_C_char)(unsafe.Pointer(s)), class, rtype, buf, bufSize)
                if size <= 0 || size > 0xffff {
                        return nil, errors.New("res_nsearch failure")
                }
index c0aa373a9b98527388d1f98d9059cfbe5a7d54ff..7520c5d95cba1c85bc0a563a731a094d39f95cdb 100644 (file)
@@ -56,7 +56,6 @@ type (
 )
 
 func _C_GoString(p *_C_char) string      { return C.GoString(p) }
-func _C_CString(s string) *_C_char       { return C.CString(s) }
 func _C_FreeCString(p *_C_char)          { C.free(unsafe.Pointer(p)) }
 func _C_malloc(n uintptr) unsafe.Pointer { return C.malloc(C.size_t(n)) }
 func _C_free(p unsafe.Pointer)           { C.free(p) }
index cbdeb4771447d3a0839fedd3a941884043a59f59..332ca6bc2f24fde4e459b0061b0f5848b45b358d 100644 (file)
@@ -43,12 +43,6 @@ func _C_GoString(p *_C_char) string {
        return unix.GoString(p)
 }
 
-func _C_CString(s string) *_C_char {
-       p := make([]byte, len(s)+1)
-       copy(p, s)
-       return &p[0]
-}
-
 func _C_FreeCString(p *_C_char) { _C_free(unsafe.Pointer(p)) }
 func _C_free(p unsafe.Pointer)  { runtime.KeepAlive(p) }