Skip to content

Commit c34a862

Browse files
Raise warnings if any data in unknown/reserved subsystem metadata regions (JuliaIO#227)
* Raise warnings if any data in unknown/reserved subsystem metadata regions * Log warning for unknown class ID and object ID metadata --------- Co-authored-by: Matthijs Cox <[email protected]>
1 parent f845dee commit c34a862

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

src/MAT_subsys.jl

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ const matlab_saveobj_ret_types = String[
3939
"timetable"
4040
]
4141

42+
# Warning message for unknown regions
43+
const warn_msg = "Unknown metadata found in MCOS subsystem. Please raise an issue to the maintainers to help improve support."
44+
4245
mutable struct Subsystem
4346
load_object_cache::Dict{UInt32,MatlabOpaque}
4447
save_object_cache::IdDict{MatlabOpaque,UInt32}
@@ -179,6 +182,34 @@ function load_mcos_regions!(
179182
end
180183
end
181184

185+
function check_unknown_regions(subsys::Subsystem)
186+
# Warn about unsupported regions
187+
# We don't know what they contain yet
188+
# Users can raise issues if they see this warning to help improve support
189+
190+
if length(subsys._u6_metadata) > 0
191+
# This region is supposedly empty
192+
@warn warn_msg
193+
end
194+
195+
if any(subsys._u7_metadata .!= 0)
196+
# This is an 8 byte region, all zeros
197+
@warn warn_msg
198+
end
199+
200+
if subsys._c3 === nothing
201+
return
202+
else
203+
for i=1:length(subsys._c3)
204+
# This region is a cell array of empty structs
205+
if length(subsys._c3[i]) > 0
206+
@warn warn_msg
207+
break
208+
end
209+
end
210+
end
211+
end
212+
182213
function get_region(
183214
fwrap_metadata::Vector{UInt8}, region_offsets::AbstractVector{UInt32}, region::Integer
184215
)
@@ -221,6 +252,7 @@ function load_subsys!(subsys::Subsystem, subsystem_data::Dict{String,Any}, swap_
221252
end
222253

223254
subsys.prop_vals_defaults = mcos_data[end, 1]
255+
check_unknown_regions(subsys)
224256
return subsys
225257
catch
226258
@warn "Failed to load MAT-file subsystem data. Opaque objects will be skipped. Error: $(catch_backtrace())"
@@ -232,6 +264,12 @@ function get_classname(subsys::Subsystem, class_id::UInt32)
232264
namespace_idx = subsys.class_id_metadata[class_id * 4 + 1]
233265
classname_idx = subsys.class_id_metadata[class_id * 4 + 2]
234266

267+
if subsys.class_id_metadata[class_id * 4 + 3] != 0 ||
268+
subsys.class_id_metadata[class_id * 4 + 4] != 0
269+
# Unknown metadata
270+
@warn warn_msg
271+
end
272+
235273
namespace = if namespace_idx == 0
236274
""
237275
else
@@ -369,7 +407,12 @@ function get_properties(subsys::Subsystem, object_id::UInt32)
369407
return Dict{String,Any}()
370408
end
371409

372-
class_id, _, _, saveobj_id, normobj_id, dep_id = get_object_metadata(subsys, object_id)
410+
class_id, _x1, _x2, saveobj_id, normobj_id, dep_id = get_object_metadata(subsys, object_id)
411+
if _x1 != 0 || _x2 != 0
412+
# Unknown metadata
413+
@warn warn_msg
414+
end
415+
373416
if saveobj_id != 0
374417
saveobj_ret_type = true
375418
obj_type_id = saveobj_id

0 commit comments

Comments
 (0)