@@ -3,6 +3,7 @@ package mbox
33import (
44 "errors"
55 "fmt"
6+ "math"
67 "os"
78 "unsafe"
89
@@ -189,8 +190,11 @@ func (m *Mailbox) Close() {
189190// the next request is made.
190191func (m * Mailbox ) Do (tagID uint32 , bufferBytes int , args ... uint32 ) ([]Tag , error ) {
191192 m .alignBuffer ()
193+
192194 bufferBytes = m .ensureBufferSize (bufferBytes , len (args ))
193- m .writeRequestHeader (bufferBytes , tagID , args )
195+ if err := m .writeRequestHeader (bufferBytes , tagID , args ); err != nil {
196+ return nil , fmt .Errorf ("unable to write request header: %w" , err )
197+ }
194198
195199 debugf ("TX:\n " )
196200 m .debugBuffer (" %02d: 0x%08X\n " , m .buf [:MailboxRequestHeaderWords + len (args )])
@@ -364,14 +368,27 @@ func (m *Mailbox) ensureBufferSize(bufferBytes, numArgs int) int {
364368 return bufferBytes
365369}
366370
367- // writeRequestHeader writes the message header and tag into the buffer.
368- func (m * Mailbox ) writeRequestHeader (bufferBytes int , tagID uint32 , args []uint32 ) {
369- m .buf [0 ] = uint32 (len (m .buf )) * MailboxWordBytes
371+ // writeRequestHeader writes the message header and tag into the buffer with overflow safety.
372+ func (m * Mailbox ) writeRequestHeader (bufferBytes int , tagID uint32 , args []uint32 ) error {
373+ bufLen := len (m .buf )
374+
375+ computedLen := bufLen * MailboxWordBytes
376+ if bufLen < 0 || computedLen < 0 || computedLen > int (math .MaxUint32 ) {
377+ return fmt .Errorf ("mailbox header length out of range: %d" , computedLen )
378+ }
379+
380+ if bufferBytes < 0 || bufferBytes > int (math .MaxUint32 ) {
381+ return fmt .Errorf ("mailbox bufferBytes out of range: %d" , bufferBytes )
382+ }
383+
384+ m .buf [0 ] = uint32 (computedLen )
370385 m .buf [1 ] = RequestCodeDefault
371386 m .buf [2 ] = tagID
372387 m .buf [3 ] = uint32 (bufferBytes )
373388 m .buf [4 ] = 0 // request
374389 copy (m .buf [MailboxRequestHeaderWords :], args )
390+
391+ return nil
375392}
376393
377394// debugBuffer prints out buffer values for debugging.
0 commit comments