continue;
}
if (tag[0] == b'i' && tag[1] == b'x') || (&tag == b"idx1") {
+ let idx_pos = self.src.tell() - 8;
if !self.odml {
return Err(EOF);
}
self.src.read_skip(size)?;
- self.try_next_odml_chunk()?;
+ if idx_pos > self.movi_pos {
+ self.try_next_odml_chunk()?;
+ } else {
+ self.movi_pos = self.src.tell();
+ }
continue;
}
if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
if ret.is_err() { break; }
let (csz, end) = ret.unwrap();
if end {
- let _res = parse_idx1(&mut self.src, strmgr, seek_idx, csz, self.movi_pos, &mut self.key_offs);
+ let _res = parse_idx1(self.src, strmgr, seek_idx, csz, self.movi_pos, &mut self.key_offs);
break;
}
rest_size -= csz;
start = 0;
last_strm_no = stream_no;
}
- let ret = parse_odml_ix(&mut self.src, strmgr, seek_idx, stream_no, size, start);
+ let ret = parse_odml_ix(self.src, strmgr, seek_idx, stream_no, size, start);
if let Ok(new_start) = ret {
start = new_start;
} else {
offset += add_offset;
if tag[0] < b'0' || tag[0] > b'9' || tag[1] < b'0' || tag[1] > b'9' {
- return Err(InvalidData);
+ continue;
}
let stream_no = ((tag[0] - b'0') * 10 + (tag[1] - b'0')) as usize;
let idx_type = src.read_byte()?;
validate!(sub_type == 0 && idx_type == 1);
let entries = src.read_u32le()? as usize;
- validate!(size == 24 + entries * 4 * entry_size);
+ validate!(size >= 24 + entries * 4 * entry_size);
src.read_tag()?; //chunk id
let base_offset = src.read_u64le()?;
src.read_u32le()?; //reserved