From ebb410afd916047ee17f0e51dfba36ad3a6c002b Mon Sep 17 00:00:00 2001 From: Ayke van Laethem Date: Tue, 10 Jan 2023 18:41:00 +0100 Subject: [PATCH] reflect: make sure null bytes are supported in tags --- testdata/reflect.go | 7 ++++--- testdata/reflect.txt | 30 +++++++++++++++--------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/testdata/reflect.go b/testdata/reflect.go index 47359e66..f7c6616c 100644 --- a/testdata/reflect.go +++ b/testdata/reflect.go @@ -3,6 +3,7 @@ package main import ( "errors" "reflect" + "strconv" "unsafe" ) @@ -17,8 +18,8 @@ type ( Y int16 } mystruct struct { - n int `foo:"bar"` - some point + n int `foo:"bar"` + some point "some\x00tag" zero struct{} buf []byte Buf []byte @@ -480,7 +481,7 @@ func showValue(rv reflect.Value, indent string) { for i := 0; i < rv.NumField(); i++ { field := rt.Field(i) println(indent+" field:", i, field.Name) - println(indent+" tag:", field.Tag) + println(indent+" tag:", strconv.Quote(string(field.Tag))) println(indent+" embedded:", field.Anonymous) println(indent+" exported:", field.IsExported()) showValue(rv.Field(i), indent+" ") diff --git a/testdata/reflect.txt b/testdata/reflect.txt index 03a7e5e5..b8f93715 100644 --- a/testdata/reflect.txt +++ b/testdata/reflect.txt @@ -233,7 +233,7 @@ reflect type: struct reflect type: struct struct: 1 field: 0 error - tag: + tag: "" embedded: true exported: false reflect type: interface caninterface=false @@ -242,19 +242,19 @@ reflect type: struct reflect type: struct struct: 3 field: 0 a - tag: + tag: "" embedded: false exported: false reflect type: uint8 caninterface=false uint: 42 field: 1 b - tag: + tag: "" embedded: false exported: false reflect type: int16 caninterface=false int: 321 field: 2 c - tag: + tag: "" embedded: false exported: false reflect type: int8 caninterface=false @@ -262,37 +262,37 @@ reflect type: struct reflect type: struct comparable=false struct: 5 field: 0 n - tag: foo:"bar" + tag: "foo:\"bar\"" embedded: false exported: false reflect type: int caninterface=false int: 5 field: 1 some - tag: + tag: "some\x00tag" embedded: false exported: false reflect type: struct caninterface=false struct: 2 field: 0 X - tag: + tag: "" embedded: false exported: true reflect type: int16 caninterface=false int: -5 field: 1 Y - tag: + tag: "" embedded: false exported: true reflect type: int16 caninterface=false int: 3 field: 2 zero - tag: + tag: "" embedded: false exported: false reflect type: struct caninterface=false struct: 0 field: 3 buf - tag: + tag: "" embedded: false exported: false reflect type: slice caninterface=false comparable=false @@ -306,7 +306,7 @@ reflect type: struct comparable=false reflect type: uint8 addrable=true caninterface=false uint: 111 field: 4 Buf - tag: + tag: "" embedded: false exported: true reflect type: slice comparable=false @@ -322,14 +322,14 @@ reflect type: ptr reflect type: struct settable=true addrable=true struct: 2 field: 0 next - tag: description:"chain" + tag: "description:\"chain\"" embedded: false exported: false reflect type: ptr addrable=true caninterface=false pointer: false struct nil: true field: 1 foo - tag: + tag: "" embedded: false exported: false reflect type: int addrable=true caninterface=false @@ -337,13 +337,13 @@ reflect type: ptr reflect type: struct struct: 2 field: 0 A - tag: + tag: "" embedded: false exported: true reflect type: uintptr uint: 2 field: 1 B - tag: + tag: "" embedded: false exported: true reflect type: uintptr