Skip to content

Commit 4257b0f

Browse files
committed
fix: escape race condition
1 parent 84fda34 commit 4257b0f

File tree

9 files changed

+71
-25
lines changed

9 files changed

+71
-25
lines changed

ext/pkg/control/split.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ func (n *SplitNode) action(_ *process.Process, inPck *packet.Packet) ([]*packet.
3939
switch inPayload := inPck.Payload().(type) {
4040
case types.Slice:
4141
outPcks := make([]*packet.Packet, 0, inPayload.Len())
42-
for i := 0; i < inPayload.Len(); i++ {
43-
outPck := packet.New(inPayload.Get(i))
42+
for _, v := range inPayload.Range() {
43+
outPck := packet.New(v)
4444
outPcks = append(outPcks, outPck)
4545
}
4646
return outPcks, nil

ext/pkg/io/print.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,10 @@ func (n *PrintNode) action(_ *process.Process, inPck *packet.Packet) (*packet.Pa
9292
if !ok {
9393
return nil, packet.New(types.NewError(encoding.ErrUnsupportedType))
9494
}
95-
for i := 1; i < payload.Len(); i++ {
96-
args = append(args, types.InterfaceOf(payload.Get(i)))
95+
for i, v := range payload.Range() {
96+
if i > 0 {
97+
args = append(args, types.InterfaceOf(v))
98+
}
9799
}
98100
}
99101

@@ -124,8 +126,10 @@ func (n *DynPrintNode) action(_ *process.Process, inPck *packet.Packet) (*packet
124126
}
125127

126128
var args []any
127-
for i := 2; i < payload.Len(); i++ {
128-
args = append(args, types.InterfaceOf(payload.Get(i)))
129+
for i, v := range payload.Range() {
130+
if i > 1 {
131+
args = append(args, types.InterfaceOf(v))
132+
}
129133
}
130134

131135
writer, err := n.fs.Open(filename, os.O_WRONLY|os.O_APPEND|os.O_CREATE)

ext/pkg/mime/encoding.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func Encode(writer io.Writer, value types.Value, header textproto.MIMEHeader) er
105105
elements = types.NewSlice(value)
106106
}
107107

108-
for _, element := range elements.Values() {
108+
for _, element := range elements.Range() {
109109
h := textproto.MIMEHeader{}
110110
h.Set(HeaderContentDisposition, fmt.Sprintf(`form-data; name="%s"`, quoteEscaper.Replace(key.String())))
111111

@@ -121,7 +121,7 @@ func Encode(writer io.Writer, value types.Value, header textproto.MIMEHeader) er
121121

122122
writeFields := func(value types.Value) error {
123123
if value, ok := value.(types.Map); ok {
124-
for _, key := range value.Keys() {
124+
for key := range value.Range() {
125125
if err := writeField(value, key); err != nil {
126126
return err
127127
}
@@ -132,7 +132,7 @@ func Encode(writer io.Writer, value types.Value, header textproto.MIMEHeader) er
132132

133133
writeFiles := func(value types.Value) error {
134134
if value, ok := value.(types.Map); ok {
135-
for _, key := range value.Keys() {
135+
for key := range value.Range() {
136136
if key, ok := key.(types.String); ok {
137137
value := value.GetOr(key, nil)
138138

@@ -195,9 +195,7 @@ func Encode(writer io.Writer, value types.Value, header textproto.MIMEHeader) er
195195
}
196196

197197
if v, ok := value.(types.Map); ok {
198-
for _, key := range v.Keys() {
199-
value := v.GetOr(key, nil)
200-
198+
for key, value := range v.Range() {
201199
if key.Equal(keyValues) {
202200
if err := writeFields(value); err != nil {
203201
return err

ext/pkg/network/listener_test.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,6 @@ func BenchmarkHTTPListenNode_ServeHTTP(b *testing.B) {
339339
n := NewHTTPListenNode("")
340340
defer n.Close()
341341

342-
in := port.NewOut()
343-
in.Link(n.In(node.PortIn))
344-
345342
out := port.NewIn()
346343
n.Out(node.PortOut).Link(out)
347344

pkg/scheme/scheme.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ func (s *Scheme) AddCodec(kind string, codec Codec) bool {
9292

9393
// RemoveCodec removes the codec associated with a kind.
9494
func (s *Scheme) RemoveCodec(kind string) bool {
95+
s.mu.Lock()
96+
defer s.mu.Unlock()
97+
9598
if _, ok := s.codecs[kind]; ok {
9699
delete(s.codecs, kind)
97100
return true

pkg/types/map.go

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,18 @@ func (m Map) Pairs() []Value {
103103
return pairs
104104
}
105105

106+
// Range returns a function that iterates over all key-value pairs in the map.
107+
func (m Map) Range() func(func(key, value Value) bool) {
108+
return func(yield func(key Value, value Value) bool) {
109+
for itr := m.value.Iterator(); !itr.Done(); {
110+
k, v, _ := itr.Next()
111+
if !yield(k, v) {
112+
return
113+
}
114+
}
115+
}
116+
}
117+
106118
// Len returns the number of key-value pairs in the map.
107119
func (m Map) Len() int {
108120
return m.value.Len()
@@ -234,6 +246,10 @@ func (m *mapProxy) Delete(key Value) {
234246
m.Map = m.Map.Delete(key)
235247
}
236248

249+
func (m *mapProxy) Close() {
250+
m.Map = NewMap()
251+
}
252+
237253
func (*comparer) Compare(x, y Value) int {
238254
return Compare(x, y)
239255
}
@@ -375,14 +391,7 @@ func newMapDecoder(decoder *encoding.DecodeAssembler[Value, any]) encoding.Decod
375391
t.Set(reflect.MakeMapWithSize(t.Type(), proxy.Len()))
376392
}
377393

378-
for _, key := range proxy.Keys() {
379-
value, ok := proxy.Get(key)
380-
if !ok {
381-
continue
382-
}
383-
384-
proxy.Delete(key)
385-
394+
for key, value := range proxy.Range() {
386395
k := reflect.New(keyType)
387396
v := reflect.New(valueType)
388397

@@ -394,6 +403,7 @@ func newMapDecoder(decoder *encoding.DecodeAssembler[Value, any]) encoding.Decod
394403
t.SetMapIndex(k.Elem(), v.Elem())
395404
}
396405
}
406+
proxy.Close()
397407
return nil
398408
}), nil
399409
} else if typ.Elem().Kind() == reflect.Struct {

pkg/types/map_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ func TestMap_Pairs(t *testing.T) {
7272
assert.Contains(t, pairs, v1)
7373
}
7474

75+
func TestMap_Range(t *testing.T) {
76+
k1 := NewString(faker.UUIDHyphenated())
77+
v1 := NewString(faker.UUIDHyphenated())
78+
79+
o := NewMap(k1, v1)
80+
81+
for k, v := range o.Range() {
82+
assert.Equal(t, k1, k)
83+
assert.Equal(t, v1, v)
84+
}
85+
}
86+
7587
func TestMap_Len(t *testing.T) {
7688
k1 := NewString(faker.UUIDHyphenated())
7789
v1 := NewString(faker.UUIDHyphenated())

pkg/types/slice.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,18 @@ func (s Slice) Values() []Value {
6666
return elements
6767
}
6868

69+
// Range returns a function that iterates over all key-value pairs of the slice.
70+
func (s Slice) Range() func(func(key int, value Value) bool) {
71+
return func(yield func(key int, value Value) bool) {
72+
for itr := s.value.Iterator(); !itr.Done(); {
73+
i, v := itr.Next()
74+
if !yield(i, v) {
75+
return
76+
}
77+
}
78+
}
79+
}
80+
6981
// Len returns the length of the slice.
7082
func (s Slice) Len() int {
7183
return s.value.Len()
@@ -214,8 +226,8 @@ func newSliceDecoder(decoder *encoding.DecodeAssembler[Value, any]) encoding.Dec
214226
return encoding.DecodeFunc(func(source Value, target unsafe.Pointer) error {
215227
t := reflect.NewAt(typ.Elem(), target).Elem()
216228
if s, ok := source.(Slice); ok {
217-
for i := 0; i < s.Len(); i++ {
218-
if err := setElement(s.Get(i), t, i); err != nil {
229+
for i, v := range s.Range() {
230+
if err := setElement(v, t, i); err != nil {
219231
return err
220232
}
221233
}

pkg/types/slice_test.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,16 @@ func TestSlice_Values(t *testing.T) {
7575
assert.Equal(t, []Value{v1, v2}, o.Values())
7676
}
7777

78+
func TestSlice_Range(t *testing.T) {
79+
v1 := NewString(faker.UUIDHyphenated())
80+
81+
o := NewSlice(v1)
82+
83+
for _, v := range o.Range() {
84+
assert.Equal(t, v1, v)
85+
}
86+
}
87+
7888
func TestSlice_Len(t *testing.T) {
7989
v1 := NewString(faker.UUIDHyphenated())
8090
v2 := NewString(faker.UUIDHyphenated())

0 commit comments

Comments
 (0)