Skip to content

fix(go): allow non-utf8 resource handles #325

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

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ wasmtime-wasi = { version = "24", default-features = false }
wit-bindgen = { version = "0.30", default-features = false }
wit-bindgen-core = { version = "0.30", default-features = false }
wit-bindgen-wrpc = { version = "0.6.5", default-features = false, path = "./crates/wit-bindgen" }
wit-bindgen-wrpc-go = { version = "0.8", default-features = false, path = "./crates/wit-bindgen-go" }
wit-bindgen-wrpc-go = { version = "0.8.1", default-features = false, path = "./crates/wit-bindgen-go" }
wit-bindgen-wrpc-rust = { version = "0.6.5", default-features = false, path = "./crates/wit-bindgen-rust" }
wit-bindgen-wrpc-rust-macro = { version = "0.6.5", default-features = false, path = "./crates/wit-bindgen-rust-macro" }
wit-component = { version = "0.215", default-features = false }
Expand Down
2 changes: 1 addition & 1 deletion crates/wit-bindgen-go/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "wit-bindgen-wrpc-go"
version = "0.8.0"
version = "0.8.1"
description = """
Go bindings generator for wRPC
"""
Expand Down
32 changes: 12 additions & 20 deletions crates/wit-bindgen-go/src/interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1180,7 +1180,6 @@ impl InterfaceGenerator<'_> {
let fmt = self.deps.fmt();
let io = self.deps.io();
let slog = self.deps.slog();
let utf8 = self.deps.utf8();
uwrite!(
self.src,
"func(r interface {{ {io}.ByteReader; {io}.Reader }}) (",
Expand All @@ -1192,27 +1191,24 @@ impl InterfaceGenerator<'_> {
var x uint32
var s uint
for i := 0; i < 5; i++ {{
{slog}.Debug("reading owned resource ID length byte", "i", i)
{slog}.Debug("reading owned resource handle length byte", "i", i)
b, err := r.ReadByte()
if err != nil {{
if i > 0 && err == {io}.EOF {{
err = {io}.ErrUnexpectedEOF
}}
return "", {fmt}.Errorf("failed to read owned resource ID length byte: %w", err)
return nil, {fmt}.Errorf("failed to read owned resource handle length byte: %w", err)
}}
if b < 0x80 {{
if i == 4 && b > 1 {{
return "", {errors}.New("owned resource ID length overflows a 32-bit integer")
return nil, {errors}.New("owned resource handle length overflows a 32-bit integer")
}}
x = x | uint32(b)<<s
buf := make([]byte, x)
{slog}.Debug("reading owned resource ID bytes", "len", x)
{slog}.Debug("reading owned resource handle bytes", "len", x)
_, err = r.Read(buf)
if err != nil {{
return "", {fmt}.Errorf("failed to read owned resource ID bytes: %w", err)
}}
if !{utf8}.Valid(buf) {{
return "", {errors}.New("owned resource ID is not valid UTF-8")
return nil, {fmt}.Errorf("failed to read owned resource handle bytes: %w", err)
}}
return "#,
);
Expand All @@ -1224,7 +1220,7 @@ impl InterfaceGenerator<'_> {
x |= uint32(b&0x7f) << s
s += 7
}}
return "", {errors}.New("owned resource ID length overflows a 32-bit integer")
return nil, {errors}.New("owned resource handle length overflows a 32-bit integer")
}}({reader})"#,
);
}
Expand All @@ -1234,7 +1230,6 @@ impl InterfaceGenerator<'_> {
let fmt = self.deps.fmt();
let io = self.deps.io();
let slog = self.deps.slog();
let utf8 = self.deps.utf8();
uwrite!(
self.src,
"func(r interface {{ {io}.ByteReader; {io}.Reader }}) (",
Expand All @@ -1246,27 +1241,24 @@ impl InterfaceGenerator<'_> {
var x uint32
var s uint
for i := 0; i < 5; i++ {{
{slog}.Debug("reading borrowed resource ID length byte", "i", i)
{slog}.Debug("reading borrowed resource handle length byte", "i", i)
b, err := r.ReadByte()
if err != nil {{
if i > 0 && err == {io}.EOF {{
err = {io}.ErrUnexpectedEOF
}}
return "", {fmt}.Errorf("failed to read borrowed resource ID length byte: %w", err)
return nil, {fmt}.Errorf("failed to read borrowed resource handle length byte: %w", err)
}}
if b < 0x80 {{
if i == 4 && b > 1 {{
return "", {errors}.New("borrowed resource ID length overflows a 32-bit integer")
return nil, {errors}.New("borrowed resource handle length overflows a 32-bit integer")
}}
x = x | uint32(b)<<s
buf := make([]byte, x)
{slog}.Debug("reading borrowed resource ID bytes", "len", x)
{slog}.Debug("reading borrowed resource handle bytes", "len", x)
_, err = r.Read(buf)
if err != nil {{
return "", {fmt}.Errorf("failed to read borrowed resource ID bytes: %w", err)
}}
if !{utf8}.Valid(buf) {{
return "", {errors}.New("borrowed resource ID is not valid UTF-8")
return nil, {fmt}.Errorf("failed to read borrowed resource handle bytes: %w", err)
}}
return "#,
);
Expand All @@ -1278,7 +1270,7 @@ impl InterfaceGenerator<'_> {
x |= uint32(b&0x7f) << s
s += 7
}}
return "", {errors}.New("borrowed resource ID length overflows a 32-bit integer")
return nil, {errors}.New("borrowed resource handle length overflows a 32-bit integer")
}}({reader})"#,
);
}
Expand Down
2 changes: 1 addition & 1 deletion examples/go/hello-client/bindings/client.wrpc.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// Generated by `wit-bindgen-wrpc-go` 0.7.0. DO NOT EDIT!
// Generated by `wit-bindgen-wrpc-go` 0.8.1. DO NOT EDIT!
// client package contains wRPC bindings for `client` world
package client
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Generated by `wit-bindgen-wrpc-go` 0.7.0. DO NOT EDIT!
// Generated by `wit-bindgen-wrpc-go` 0.8.1. DO NOT EDIT!
package handler

import (
Expand Down
4 changes: 2 additions & 2 deletions examples/go/hello-client/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.22.2

require (
github.com/nats-io/nats.go v1.37.0
wrpc.io/go v0.0.3
wrpc.io/go v0.0.4
)

require (
Expand All @@ -15,4 +15,4 @@ require (
golang.org/x/sys v0.20.0 // indirect
)

replace wrpc.io/go v0.0.3 => ../../../go
replace wrpc.io/go v0.0.4 => ../../../go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Generated by `wit-bindgen-wrpc-go` 0.7.0. DO NOT EDIT!
// Generated by `wit-bindgen-wrpc-go` 0.8.1. DO NOT EDIT!
package handler

import (
Expand Down Expand Up @@ -68,7 +68,7 @@ func ServeInterface(s wrpc.Server, h Handler) (stop func() error, err error) {
return nil
}(r0, &buf)
if err != nil {
slog.WarnContext(ctx, "failed to write result value", "i", 0, "wrpc-examples:hello/handler", "name", "hello", "err", err)
slog.WarnContext(ctx, "failed to write result value", "i", 0, "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
return
}
if write0 != nil {
Expand All @@ -77,21 +77,21 @@ func ServeInterface(s wrpc.Server, h Handler) (stop func() error, err error) {
slog.DebugContext(ctx, "transmitting `wrpc-examples:hello/handler.hello` result")
_, err = w.Write(buf.Bytes())
if err != nil {
slog.WarnContext(ctx, "failed to write result", "wrpc-examples:hello/handler", "name", "hello", "err", err)
slog.WarnContext(ctx, "failed to write result", "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
return
}
if len(writes) > 0 {
for index, write := range writes {
w, err := w.Index(index)
if err != nil {
slog.ErrorContext(ctx, "failed to index writer", "index", index, "wrpc-examples:hello/handler", "name", "hello", "err", err)
slog.ErrorContext(ctx, "failed to index writer", "index", index, "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
return
}
index := index
write := write
go func() {
if err := write(w); err != nil {
slog.WarnContext(ctx, "failed to write nested result value", "index", index, "wrpc-examples:hello/handler", "name", "hello", "err", err)
slog.WarnContext(ctx, "failed to write nested result value", "index", index, "instance", "wrpc-examples:hello/handler", "name", "hello", "err", err)
}
}()
}
Expand Down
2 changes: 1 addition & 1 deletion examples/go/hello-server/bindings/server.wrpc.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Generated by `wit-bindgen-wrpc-go` 0.7.0. DO NOT EDIT!
// Generated by `wit-bindgen-wrpc-go` 0.8.1. DO NOT EDIT!
// server package contains wRPC bindings for `server` world
package server

Expand Down
4 changes: 2 additions & 2 deletions examples/go/hello-server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ go 1.22.2

require (
github.com/nats-io/nats.go v1.37.0
wrpc.io/go v0.0.3
wrpc.io/go v0.0.4
)

require (
Expand All @@ -15,4 +15,4 @@ require (
golang.org/x/sys v0.20.0 // indirect
)

replace wrpc.io/go v0.0.3 => ../../../go
replace wrpc.io/go v0.0.4 => ../../../go
Loading