marshal.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package protocol
  2. import (
  3. "errors"
  4. "io"
  5. "github.com/calmh/syncthing/buffers"
  6. )
  7. func pad(l int) int {
  8. d := l % 4
  9. if d == 0 {
  10. return 0
  11. }
  12. return 4 - d
  13. }
  14. var padBytes = []byte{0, 0, 0}
  15. type marshalWriter struct {
  16. w io.Writer
  17. tot int
  18. err error
  19. b [8]byte
  20. }
  21. // We will never encode nor expect to decode blobs larger than 10 MB. Check
  22. // inserted to protect against attempting to allocate arbitrary amounts of
  23. // memory when reading a corrupt message.
  24. const maxBytesFieldLength = 10 * 1 << 20
  25. var ErrFieldLengthExceeded = errors.New("Raw bytes field size exceeds limit")
  26. func (w *marshalWriter) writeString(s string) {
  27. w.writeBytes([]byte(s))
  28. }
  29. func (w *marshalWriter) writeBytes(bs []byte) {
  30. if w.err != nil {
  31. return
  32. }
  33. if len(bs) > maxBytesFieldLength {
  34. w.err = ErrFieldLengthExceeded
  35. return
  36. }
  37. w.writeUint32(uint32(len(bs)))
  38. if w.err != nil {
  39. return
  40. }
  41. _, w.err = w.w.Write(bs)
  42. if p := pad(len(bs)); w.err == nil && p > 0 {
  43. _, w.err = w.w.Write(padBytes[:p])
  44. }
  45. w.tot += len(bs) + pad(len(bs))
  46. }
  47. func (w *marshalWriter) writeUint32(v uint32) {
  48. if w.err != nil {
  49. return
  50. }
  51. w.b[0] = byte(v >> 24)
  52. w.b[1] = byte(v >> 16)
  53. w.b[2] = byte(v >> 8)
  54. w.b[3] = byte(v)
  55. _, w.err = w.w.Write(w.b[:4])
  56. w.tot += 4
  57. }
  58. func (w *marshalWriter) writeUint64(v uint64) {
  59. if w.err != nil {
  60. return
  61. }
  62. w.b[0] = byte(v >> 56)
  63. w.b[1] = byte(v >> 48)
  64. w.b[2] = byte(v >> 40)
  65. w.b[3] = byte(v >> 32)
  66. w.b[4] = byte(v >> 24)
  67. w.b[5] = byte(v >> 16)
  68. w.b[6] = byte(v >> 8)
  69. w.b[7] = byte(v)
  70. _, w.err = w.w.Write(w.b[:8])
  71. w.tot += 8
  72. }
  73. type marshalReader struct {
  74. r io.Reader
  75. tot int
  76. err error
  77. b [8]byte
  78. }
  79. func (r *marshalReader) readString() string {
  80. bs := r.readBytes()
  81. defer buffers.Put(bs)
  82. return string(bs)
  83. }
  84. func (r *marshalReader) readBytes() []byte {
  85. if r.err != nil {
  86. return nil
  87. }
  88. l := int(r.readUint32())
  89. if r.err != nil {
  90. return nil
  91. }
  92. if l > maxBytesFieldLength {
  93. r.err = ErrFieldLengthExceeded
  94. return nil
  95. }
  96. b := buffers.Get(l + pad(l))
  97. _, r.err = io.ReadFull(r.r, b)
  98. r.tot += int(l + pad(l))
  99. return b[:l]
  100. }
  101. func (r *marshalReader) readUint32() uint32 {
  102. if r.err != nil {
  103. return 0
  104. }
  105. _, r.err = io.ReadFull(r.r, r.b[:4])
  106. r.tot += 4
  107. return uint32(r.b[3]) | uint32(r.b[2])<<8 | uint32(r.b[1])<<16 | uint32(r.b[0])<<24
  108. }
  109. func (r *marshalReader) readUint64() uint64 {
  110. if r.err != nil {
  111. return 0
  112. }
  113. _, r.err = io.ReadFull(r.r, r.b[:8])
  114. r.tot += 8
  115. return uint64(r.b[7]) | uint64(r.b[6])<<8 | uint64(r.b[5])<<16 | uint64(r.b[4])<<24 |
  116. uint64(r.b[3])<<32 | uint64(r.b[2])<<40 | uint64(r.b[1])<<48 | uint64(r.b[0])<<56
  117. }