Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Go] array.String.Value is unsafe #68

Open
lidavidm opened this issue Feb 2, 2023 · 1 comment
Open

[Go] array.String.Value is unsafe #68

lidavidm opened this issue Feb 2, 2023 · 1 comment
Assignees
Labels
Type: bug Something isn't working

Comments

@lidavidm
Copy link
Member

lidavidm commented Feb 2, 2023

Describe the bug, including details regarding any error messages, version, and platform.

String.Value slices a backing string:

func (a *String) Value(i int) string {
	i = i + a.array.data.offset
	return a.values[a.offsets[i]:a.offsets[i+1]]
}

Which points directly into the buffer data:

	if vdata := data.buffers[2]; vdata != nil {
		b := vdata.Bytes()
		a.values = *(*string)(unsafe.Pointer(&b))
	}

This seems OK when the buffer is Go-allocated since the GC will take care of it (regardless of Release/Retain). But when the buffer is C-allocated (e.g. C Data Interface, mallocator), if the string outlives the array, we have a dangling pointer!

I believe we should copy the string (and frankly, get rid of the unsafe here) to be safe (which also has the side effect that getting a single value out of an array will no longer keep the entire backing array alive). If the extra garbage is an issue, we should consider some sort of string view type.

Component(s)

Go

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Type: bug Something isn't working
Projects
None yet
2 participants