media-converter: Don't panic on unknown tags for read-only DBs

CW-Bug-Id: #19516
This commit is contained in:
Andrew Eikum 2021-12-03 09:08:02 -06:00 committed by Arkadiusz Hiler
parent cecfa8c9fa
commit 9bd80565b3
3 changed files with 13 additions and 7 deletions

View File

@ -213,7 +213,7 @@ impl AudioConverterDumpFozdb {
return self; return self;
} }
match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(create), AUDIOCONV_FOZ_NUM_TAGS) { match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(create), false /* read-only? */, AUDIOCONV_FOZ_NUM_TAGS) {
Ok(newdb) => { Ok(newdb) => {
self.fozdb = Some(newdb); self.fozdb = Some(newdb);
}, },
@ -235,7 +235,7 @@ impl AudioConverterDumpFozdb {
} }
if let Some(fozdb) = &mut self.open(false).fozdb { if let Some(fozdb) = &mut self.open(false).fozdb {
if let Ok(read_fozdb_path) = std::env::var("MEDIACONV_AUDIO_TRANSCODED_FILE") { if let Ok(read_fozdb_path) = std::env::var("MEDIACONV_AUDIO_TRANSCODED_FILE") {
if let Ok(read_fozdb) = fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), AUDIOCONV_FOZ_NUM_TAGS) { if let Ok(read_fozdb) = fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, AUDIOCONV_FOZ_NUM_TAGS) {
let mut chunks_to_discard = HashSet::<(u32, u128)>::new(); let mut chunks_to_discard = HashSet::<(u32, u128)>::new();
let mut chunks_to_keep = HashSet::<(u32, u128)>::new(); let mut chunks_to_keep = HashSet::<(u32, u128)>::new();
@ -558,7 +558,7 @@ impl AudioConvState {
gst_loggable_error!(CAT, "MEDIACONV_AUDIO_TRANSCODED_FILE is not set!") gst_loggable_error!(CAT, "MEDIACONV_AUDIO_TRANSCODED_FILE is not set!")
})?; })?;
let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), AUDIOCONV_FOZ_NUM_TAGS) { let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, AUDIOCONV_FOZ_NUM_TAGS) {
Ok(s) => Some(s), Ok(s) => Some(s),
Err(_) => None, Err(_) => None,
}; };

View File

@ -197,6 +197,7 @@ impl PayloadEntry {
pub struct StreamArchive { pub struct StreamArchive {
file: fs::File, file: fs::File,
read_only: bool,
seen_blobs: Vec<HashMap<FossilizeHash, PayloadEntry>>, seen_blobs: Vec<HashMap<FossilizeHash, PayloadEntry>>,
@ -210,7 +211,7 @@ pub enum CRCCheck {
impl StreamArchive { impl StreamArchive {
pub fn new<P: AsRef<std::path::Path>>(filename: P, fileopts: &OpenOptions, num_tags: usize) -> Result<Self, Error> { pub fn new<P: AsRef<std::path::Path>>(filename: P, fileopts: &OpenOptions, read_only: bool, num_tags: usize) -> Result<Self, Error> {
let file = fileopts.open(filename)?; let file = fileopts.open(filename)?;
@ -221,6 +222,7 @@ impl StreamArchive {
let mut ret = Self { let mut ret = Self {
file, file,
read_only,
seen_blobs, seen_blobs,
write_pos: 0, write_pos: 0,
}; };
@ -272,6 +274,10 @@ impl StreamArchive {
match res { match res {
Ok(p) => { Ok(p) => {
self.write_pos = p; self.write_pos = p;
if tag >= self.seen_blobs.len() && self.read_only {
/* ignore unknown tags for read-only DBs, otherwise panic */
continue;
}
self.seen_blobs[tag].insert(hash, payload_entry); self.seen_blobs[tag].insert(hash, payload_entry);
}, },

View File

@ -139,7 +139,7 @@ impl VideoConverterDumpFozdb {
return self; return self;
} }
match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(create), VIDEOCONV_FOZ_NUM_TAGS) { match fossilize::StreamArchive::new(&dump_file_path, OpenOptions::new().write(true).read(true).create(create), false /* read-only? */, VIDEOCONV_FOZ_NUM_TAGS) {
Ok(newdb) => { Ok(newdb) => {
self.fozdb = Some(newdb); self.fozdb = Some(newdb);
}, },
@ -161,7 +161,7 @@ impl VideoConverterDumpFozdb {
} }
if let Some(fozdb) = &mut self.open(false).fozdb { if let Some(fozdb) = &mut self.open(false).fozdb {
if let Ok(read_fozdb_path) = std::env::var("MEDIACONV_VIDEO_TRANSCODED_FILE") { if let Ok(read_fozdb_path) = std::env::var("MEDIACONV_VIDEO_TRANSCODED_FILE") {
if let Ok(read_fozdb) = fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), VIDEOCONV_FOZ_NUM_TAGS) { if let Ok(read_fozdb) = fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, VIDEOCONV_FOZ_NUM_TAGS) {
let mut chunks = Vec::<(u32, u128)>::new(); let mut chunks = Vec::<(u32, u128)>::new();
for stream_id in fozdb.iter_tag(VIDEOCONV_FOZ_TAG_STREAM).cloned().collect::<Vec<u128>>() { for stream_id in fozdb.iter_tag(VIDEOCONV_FOZ_TAG_STREAM).cloned().collect::<Vec<u128>>() {
@ -301,7 +301,7 @@ impl VideoConvState {
gst_loggable_error!(CAT, "MEDIACONV_VIDEO_TRANSCODED_FILE is not set!") gst_loggable_error!(CAT, "MEDIACONV_VIDEO_TRANSCODED_FILE is not set!")
})?; })?;
let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), VIDEOCONV_FOZ_NUM_TAGS) { let read_fozdb = match fossilize::StreamArchive::new(&read_fozdb_path, OpenOptions::new().read(true), true /* read-only? */, VIDEOCONV_FOZ_NUM_TAGS) {
Ok(s) => Some(s), Ok(s) => Some(s),
Err(_) => None, Err(_) => None,
}; };