@@ -35,8 +35,6 @@ pub fn (mut d Decoder) decode_from_string[T](data string) ! {
3535pub fn (mut d Decoder) decode [T](data []u8 , mut val T) ! {
3636 d.buffer = data
3737 d.next ()!
38- println (d.buffer)
39- println (d.bd)
4038
4139 $if T is $int {
4240 d.decode_integer[T](mut val) or { return error ('error decoding integer: ${err} ' ) }
@@ -221,10 +219,12 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
221219 | 0xd6 | -1 | seconds in 32-bit unsigned int |
222220 +--------+--------+--------+--------+--------+--------+
223221 */
224- sec := int (binary.big_endian_u32 (data[d.pos..d.pos + 4 ]))
225- println (binary.big_endian_u32 (data[d.pos..d.pos + 4 ]))
226- val = time.unix (i64 (sec))
227- d.pos + = 4
222+ if data[d.pos] != u8 (0xFF ) {
223+ return error ('invalid extension format' )
224+ }
225+ data32 := binary.big_endian_u32 (data[d.pos + 1 ..d.pos + 4 ])
226+ val = time.unix (i64 (data32 ))
227+ d.pos + = 5
228228 }
229229 mp_fix_ext_8 {
230230 /*
@@ -234,8 +234,13 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
234234 | 0xd7 | -1 | nanosec. in 30-bit unsigned int | seconds in 34-bit unsigned int |
235235 +--------+--------+--------+--------+--------+------^-+--------+--------+--------+--------+
236236 */
237- sec := int (binary.big_endian_u64 (data[d.pos..d.pos + 8 ]))
238- val = time.unix (i64 (sec))
237+ if data[d.pos] != u8 (0xFF ) {
238+ return error ('invalid extension format' )
239+ }
240+ data64 := binary.big_endian_u64 (data[d.pos + 1 ..d.pos + 8 ])
241+ sec := int (data64 & 0x00000003ffffffff )
242+ nsec := int (data64 >> 34 )
243+ val = time.unix_nanosecond (i64 (sec), nsec)
239244 d.pos + = 8
240245 }
241246 mp_ext_8 {
@@ -249,8 +254,13 @@ pub fn (mut d Decoder) decode_time[T](mut val T) ! {
249254 seconds in 64-bit signed int |
250255 +--------+--------+--------+--------+--------+--------+--------+--------+
251256 */
252- sec := int (binary.big_endian_u64 (data[d.pos..d.pos + 12 ]))
253- val = time.unix (i64 (sec))
257+
258+ if data[d.pos] != u8 (0x0C ) || data[d.pos + 4 ] != u8 (0xFF ) {
259+ return error ('invalide extension format' )
260+ }
261+ data32 := binary.big_endian_u32 (data[d.pos + 1 + 4 ..d.pos + 12 ])
262+ data64 := binary.big_endian_u64 (data[d.pos + 1 + 8 ..d.pos + 12 ])
263+ val = time.unix_nanosecond (i64 (data64 ), data32 )
254264 d.pos + = 12
255265 }
256266 else {
0 commit comments