decoder.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package dbus
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "reflect"
  6. )
  7. type decoder struct {
  8. in io.Reader
  9. order binary.ByteOrder
  10. pos int
  11. fds []int
  12. }
  13. // newDecoder returns a new decoder that reads values from in. The input is
  14. // expected to be in the given byte order.
  15. func newDecoder(in io.Reader, order binary.ByteOrder, fds []int) *decoder {
  16. dec := new(decoder)
  17. dec.in = in
  18. dec.order = order
  19. dec.fds = fds
  20. return dec
  21. }
  22. // align aligns the input to the given boundary and panics on error.
  23. func (dec *decoder) align(n int) {
  24. if dec.pos%n != 0 {
  25. newpos := (dec.pos + n - 1) & ^(n - 1)
  26. empty := make([]byte, newpos-dec.pos)
  27. if _, err := io.ReadFull(dec.in, empty); err != nil {
  28. panic(err)
  29. }
  30. dec.pos = newpos
  31. }
  32. }
  33. // Calls binary.Read(dec.in, dec.order, v) and panics on read errors.
  34. func (dec *decoder) binread(v interface{}) {
  35. if err := binary.Read(dec.in, dec.order, v); err != nil {
  36. panic(err)
  37. }
  38. }
  39. func (dec *decoder) Decode(sig Signature) (vs []interface{}, err error) {
  40. defer func() {
  41. var ok bool
  42. v := recover()
  43. if err, ok = v.(error); ok {
  44. if err == io.EOF || err == io.ErrUnexpectedEOF {
  45. err = FormatError("unexpected EOF")
  46. }
  47. }
  48. }()
  49. vs = make([]interface{}, 0)
  50. s := sig.str
  51. for s != "" {
  52. err, rem := validSingle(s, &depthCounter{})
  53. if err != nil {
  54. return nil, err
  55. }
  56. v := dec.decode(s[:len(s)-len(rem)], 0)
  57. vs = append(vs, v)
  58. s = rem
  59. }
  60. return vs, nil
  61. }
  62. func (dec *decoder) decode(s string, depth int) interface{} {
  63. dec.align(alignment(typeFor(s)))
  64. switch s[0] {
  65. case 'y':
  66. var b [1]byte
  67. if _, err := dec.in.Read(b[:]); err != nil {
  68. panic(err)
  69. }
  70. dec.pos++
  71. return b[0]
  72. case 'b':
  73. i := dec.decode("u", depth).(uint32)
  74. switch {
  75. case i == 0:
  76. return false
  77. case i == 1:
  78. return true
  79. default:
  80. panic(FormatError("invalid value for boolean"))
  81. }
  82. case 'n':
  83. var i int16
  84. dec.binread(&i)
  85. dec.pos += 2
  86. return i
  87. case 'i':
  88. var i int32
  89. dec.binread(&i)
  90. dec.pos += 4
  91. return i
  92. case 'x':
  93. var i int64
  94. dec.binread(&i)
  95. dec.pos += 8
  96. return i
  97. case 'q':
  98. var i uint16
  99. dec.binread(&i)
  100. dec.pos += 2
  101. return i
  102. case 'u':
  103. var i uint32
  104. dec.binread(&i)
  105. dec.pos += 4
  106. return i
  107. case 't':
  108. var i uint64
  109. dec.binread(&i)
  110. dec.pos += 8
  111. return i
  112. case 'd':
  113. var f float64
  114. dec.binread(&f)
  115. dec.pos += 8
  116. return f
  117. case 's':
  118. length := dec.decode("u", depth).(uint32)
  119. b := make([]byte, int(length)+1)
  120. if _, err := io.ReadFull(dec.in, b); err != nil {
  121. panic(err)
  122. }
  123. dec.pos += int(length) + 1
  124. return string(b[:len(b)-1])
  125. case 'o':
  126. return ObjectPath(dec.decode("s", depth).(string))
  127. case 'g':
  128. length := dec.decode("y", depth).(byte)
  129. b := make([]byte, int(length)+1)
  130. if _, err := io.ReadFull(dec.in, b); err != nil {
  131. panic(err)
  132. }
  133. dec.pos += int(length) + 1
  134. sig, err := ParseSignature(string(b[:len(b)-1]))
  135. if err != nil {
  136. panic(err)
  137. }
  138. return sig
  139. case 'v':
  140. if depth >= 64 {
  141. panic(FormatError("input exceeds container depth limit"))
  142. }
  143. var variant Variant
  144. sig := dec.decode("g", depth).(Signature)
  145. if len(sig.str) == 0 {
  146. panic(FormatError("variant signature is empty"))
  147. }
  148. err, rem := validSingle(sig.str, &depthCounter{})
  149. if err != nil {
  150. panic(err)
  151. }
  152. if rem != "" {
  153. panic(FormatError("variant signature has multiple types"))
  154. }
  155. variant.sig = sig
  156. variant.value = dec.decode(sig.str, depth+1)
  157. return variant
  158. case 'h':
  159. idx := dec.decode("u", depth).(uint32)
  160. if int(idx) < len(dec.fds) {
  161. return UnixFD(dec.fds[idx])
  162. }
  163. return UnixFDIndex(idx)
  164. case 'a':
  165. if len(s) > 1 && s[1] == '{' {
  166. ksig := s[2:3]
  167. vsig := s[3 : len(s)-1]
  168. v := reflect.MakeMap(reflect.MapOf(typeFor(ksig), typeFor(vsig)))
  169. if depth >= 63 {
  170. panic(FormatError("input exceeds container depth limit"))
  171. }
  172. length := dec.decode("u", depth).(uint32)
  173. // Even for empty maps, the correct padding must be included
  174. dec.align(8)
  175. spos := dec.pos
  176. for dec.pos < spos+int(length) {
  177. dec.align(8)
  178. if !isKeyType(v.Type().Key()) {
  179. panic(InvalidTypeError{v.Type()})
  180. }
  181. kv := dec.decode(ksig, depth+2)
  182. vv := dec.decode(vsig, depth+2)
  183. v.SetMapIndex(reflect.ValueOf(kv), reflect.ValueOf(vv))
  184. }
  185. return v.Interface()
  186. }
  187. if depth >= 64 {
  188. panic(FormatError("input exceeds container depth limit"))
  189. }
  190. sig := s[1:]
  191. length := dec.decode("u", depth).(uint32)
  192. // capacity can be determined only for fixed-size element types
  193. var capacity int
  194. if s := sigByteSize(sig); s != 0 {
  195. capacity = int(length) / s
  196. }
  197. v := reflect.MakeSlice(reflect.SliceOf(typeFor(sig)), 0, capacity)
  198. // Even for empty arrays, the correct padding must be included
  199. align := alignment(typeFor(s[1:]))
  200. if len(s) > 1 && s[1] == '(' {
  201. //Special case for arrays of structs
  202. //structs decode as a slice of interface{} values
  203. //but the dbus alignment does not match this
  204. align = 8
  205. }
  206. dec.align(align)
  207. spos := dec.pos
  208. for dec.pos < spos+int(length) {
  209. ev := dec.decode(s[1:], depth+1)
  210. v = reflect.Append(v, reflect.ValueOf(ev))
  211. }
  212. return v.Interface()
  213. case '(':
  214. if depth >= 64 {
  215. panic(FormatError("input exceeds container depth limit"))
  216. }
  217. dec.align(8)
  218. v := make([]interface{}, 0)
  219. s = s[1 : len(s)-1]
  220. for s != "" {
  221. err, rem := validSingle(s, &depthCounter{})
  222. if err != nil {
  223. panic(err)
  224. }
  225. ev := dec.decode(s[:len(s)-len(rem)], depth+1)
  226. v = append(v, ev)
  227. s = rem
  228. }
  229. return v
  230. default:
  231. panic(SignatureError{Sig: s})
  232. }
  233. }
  234. // sigByteSize tries to calculates size of the given signature in bytes.
  235. //
  236. // It returns zero when it can't, for example when it contains non-fixed size
  237. // types such as strings, maps and arrays that require reading of the transmitted
  238. // data, for that we would need to implement the unread method for Decoder first.
  239. func sigByteSize(sig string) int {
  240. var total int
  241. for offset := 0; offset < len(sig); {
  242. switch sig[offset] {
  243. case 'y':
  244. total += 1
  245. offset += 1
  246. case 'n', 'q':
  247. total += 2
  248. offset += 1
  249. case 'b', 'i', 'u', 'h':
  250. total += 4
  251. offset += 1
  252. case 'x', 't', 'd':
  253. total += 8
  254. offset += 1
  255. case '(':
  256. i := 1
  257. depth := 1
  258. for i < len(sig[offset:]) && depth != 0 {
  259. if sig[offset+i] == '(' {
  260. depth++
  261. } else if sig[offset+i] == ')' {
  262. depth--
  263. }
  264. i++
  265. }
  266. s := sigByteSize(sig[offset+1 : offset+i-1])
  267. if s == 0 {
  268. return 0
  269. }
  270. total += s
  271. offset += i
  272. default:
  273. return 0
  274. }
  275. }
  276. return total
  277. }
  278. // A FormatError is an error in the wire format.
  279. type FormatError string
  280. func (e FormatError) Error() string {
  281. return "dbus: wire format error: " + string(e)
  282. }