Avoid sending a partial dirent when the Rreaddir response exceeds message limit.

PiperOrigin-RevId: 304542967
This commit is contained in:
Uros Prestor 2020-04-02 22:01:57 -07:00 committed by gVisor bot
parent dd3bc49997
commit d151693530
2 changed files with 7 additions and 9 deletions

View File

@ -1926,19 +1926,17 @@ func (r *Rreaddir) decode(b *buffer) {
// encode implements encoder.encode.
func (r *Rreaddir) encode(b *buffer) {
entriesBuf := buffer{}
payloadSize := 0
for _, d := range r.Entries {
d.encode(&entriesBuf)
if len(entriesBuf.data) >= int(r.Count) {
if len(entriesBuf.data) > int(r.Count) {
break
}
payloadSize = len(entriesBuf.data)
}
if len(entriesBuf.data) < int(r.Count) {
r.Count = uint32(len(entriesBuf.data))
r.payload = entriesBuf.data
} else {
r.payload = entriesBuf.data[:r.Count]
}
b.Write32(uint32(r.Count))
r.Count = uint32(payloadSize)
r.payload = entriesBuf.data[:payloadSize]
b.Write32(r.Count)
}
// Type implements message.Type.

View File

@ -216,7 +216,7 @@ func TestEncodeDecode(t *testing.T) {
},
&Rreaddir{
// Count must be sufficient to encode a dirent.
Count: 0x18,
Count: 0x1a,
Entries: []Dirent{{QID: QID{Type: 2}}},
},
&Tfsync{