Skip to content

Commit 8082165

Browse files
Additional work on Co-Pilot code review. One more fix to do.
1 parent 4557098 commit 8082165

3 files changed

Lines changed: 15 additions & 13 deletions

File tree

sigmf/convert/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def detect_converter(file_path: Path):
109109
return "rohdeschwarz"
110110
else:
111111
raise SigMFConversionError(
112-
f"Unsupported XML file format. Root element: {rohde_schwarz_expanded_magic_bytes}. "
112+
f"Unsupported XML file format in tar file. Root element: {rohde_schwarz_expanded_magic_bytes}. "
113113
f"Expected RS_IQ_TAR_FileFormat for IQ.TAR files."
114114
)
115115

sigmf/convert/__main__.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,5 @@ def main() -> None:
9898
elif converter_type == "rohdeschwarz":
9999
_ = rohdeschwarz_to_sigmf(rohdeschwarz_path=input_path, out_path=output_path, create_archive=args.archive, create_ncd=args.ncd)
100100

101-
else:
102-
raise SigMFConversionError(
103-
f"Supported formats for conversion are WAV, BLUE/Platinum, Signal Hound Spike and Rohde and Schwarz IQ.TAR."
104-
)
105-
106101
if __name__ == "__main__":
107102
main()

sigmf/convert/rohdeschwarz.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
# SPDX-License-Identifier: LGPL-3.0-or-later
66
#
7-
# Last Updated: 6-15-2026
7+
# Last Updated: 6-16-2026
88

99
"""Rohde and Schwarz Converter"""
1010

@@ -82,10 +82,19 @@ def safe_extract(tar, target_dir):
8282
"""
8383
Extract only safe members from a tarfile.
8484
"""
85+
safe_members = []
8586
for member in tar.getmembers():
87+
if member.issym() or member.islnk():
88+
raise SigMFConversionError(f"Refusing to extract link from TAR: {member.name}")
8689
if not is_safe_member(tar, member, target_dir):
87-
raise Exception(f"Unsafe path detected in TAR: {member.name}")
88-
tar.extract(member, target_dir)
90+
raise SigMFConversionError(f"Unsafe path detected in TAR: {member.name}")
91+
safe_members.append(member)
92+
93+
for member in safe_members:
94+
try:
95+
tar.extract(member, target_dir, set_attrs=False)
96+
except TypeError:
97+
tar.extract(member, target_dir)
8998

9099
def extract_iq_tar_to_directory(rohdeschwarz_path, file_dest_dir=None):
91100
tar_path = Path(rohdeschwarz_path)
@@ -259,7 +268,7 @@ def _build_metadata(xml_path: Path) -> Tuple[dict, dict, list, int]:
259268

260269
datafilename = None
261270
datafilename_raw = _text_of(root, "DataFilename")
262-
if datafilename_raw:
271+
if datafilename_raw is not None:
263272
try:
264273
datafilename = str(datafilename_raw)
265274
except ValueError:
@@ -321,8 +330,6 @@ def _build_metadata(xml_path: Path) -> Tuple[dict, dict, list, int]:
321330
dt = datetime.fromtimestamp(secs, tz=timezone.utc) + timedelta(microseconds=rem_ns / 1000)
322331
iso_8601_string = dt.strftime(SIGMF_DATETIME_ISO8601_FMT)
323332

324-
325-
326333
# base global metadata
327334
global_md = {
328335
SigMFFile.AUTHOR_KEY: getpass.getuser(),
@@ -336,7 +343,7 @@ def _build_metadata(xml_path: Path) -> Tuple[dict, dict, list, int]:
336343

337344
# add optional rohdeschwarz-specific fields to global metadata using rohdeschwarz: namespace
338345
# only include fields that aren't already represented in standard SigMF metadata
339-
if scaling_factor:
346+
if scaling_factor is not None:
340347
global_md["rohdeschwarz:scaling_factor"] = scaling_factor
341348
if datafilename:
342349
global_md["rohdeschwarz:iq_datafilename"] = datafilename # provenance

0 commit comments

Comments
 (0)