Crash in `tracker3 info` due to not checking `tracker_namespace_manager_compress_uri` return value
I got this testing a feature branch:
sam@ausecuma ~/s/t/build (wip/landlock) [SIGSEGV]> gdb --args tracker3 info file:///home/sam/.../01%20My%20Patch.mp3
(gdb) run
file:///home/sam/Music/2022%20VC05%20Maharaja%20-%20Animals/01%20Maharajah/samples/01%20My%20Patch.mp3:
nrl:added[🡕]: 2023-12-13T10:34:02Z
nfo:hasHash[🡕]: urn:bnode:2486
nfo:fileSize[🡕]: 4460782
dc:date[🡕]: 2022-08-05T22:11:02Z
2020-06-22T18:46:33Z
nfo:fileLastAccessed[🡕]: 2022-08-05T22:11:02Z
tracker:extractorHash[🡕]: @hash@
nie:dataSource[🡕]: urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:22937628
dc:source[🡕]: urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:22937628
nfo:fileName[🡕]: 01 My Patch.mp3
nie:created[🡕]: 2022-08-05T22:11:01Z
nie:url[🡕]: file:///home/sam/Music/2022%20VC05%20Maharaja%20-%20Animals/01%20Maharajah/samples/01>
nfo:fileLastModified[🡕]: 2020-06-22T18:46:33Z
rdf:type[🡕]: nfo:FileDataObject[🡕]
nie:DataObject[🡕]
rdfs:Resource[🡕]
nfo:fileCreated[🡕]: 2022-08-05T22:11:01Z
nie:interpretedAs[🡕]: urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513390
nie:byteSize[🡕]: 4460782
nie:isPartOf[🡕]: urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513382
nrl:modified[🡕]: 7
nfo:belongsToContainer[🡕]: urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513382
urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513390:
nco:publisher[🡕]: urn:contact:My%20Dad%20Recordings
nfo:duration[🡕]: 185
nmm:dlnaProfile[🡕]: MP3
dc:contributor[🡕]: urn:artist:Jim%20Noir
dc:publisher[🡕]: urn:contact:My%20Dad%20Recordings
dc:date[🡕]: 2006-01-01T00:00:00Z
nco:contributor[🡕]: urn:artist:Jim%20Noir
nie:informationElementDate[🡕]: 2006-01-01T00:00:00Z
nrl:added[🡕]: 2023-12-13T10:34:04Z
nrl:modified[🡕]: 7
nfo:codec[🡕]: MPEG
rdf:type[🡕]: nmm:MusicPiece[🡕]
nfo:Audio[🡕]
nfo:Media[🡕]
Then the process segfaults. Here is the backtrace:
(gdb) bt
#0 0x00007ffff7a583a3 in __strchr_avx2 () at /lib64/libc.so.6
#1 0x0000000000409727 in print_object (object=0x0, multiline_padding=34) at ../src/tracker/tracker-info.c:169
#2 0x00000000004099f3 in print_plain_values
(subject=0x45c130 "urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513390", values=Python Exception <class 'gdb.error'>: There is no member named keys.
0x4572a0, namespaces=0x7fffdc0106a0, axis_column=29) at ../src/tracker/tracker-info.c:243
#3 0x0000000000409ac4 in print_plain_objects (objects=Python Exception <class 'gdb.error'>: There is no member named keys.
0x4571e0, namespaces=0x7fffdc0106a0, axis_column=29)
at ../src/tracker/tracker-info.c:266
#4 0x0000000000409d12 in print_plain (cursor=0x4508b0, namespaces=0x7fffdc0106a0) at ../src/tracker/tracker-info.c:308
#5 0x000000000040a702 in info_run () at ../src/tracker/tracker-info.c:558
#6 0x000000000040a9cb in main (argc=1, argv=0x7fffffffdb58) at ../src/tracker/tracker-info.c:647
In print_plain_values()
the code was processing an element of objects
list:
#2 0x00000000004099f3 in print_plain_values (
subject=0x45c890 "urn:fileid:/dev/mapper/luks-a49083aa-62a9-4d73-bdbd-6b4a69e72b69:24513390", values=Python Exception <class 'gdb.error'>: There is no member named keys.
0x457aa0,
namespaces=0x7fffdc00fea0, axis_column=29) at ../src/tracker/tracker-info.c:243
243 print_object (str, axis_column + link_padding + 2);
(gdb) print (char *)((GList *)l)->data
$7 = 0x459540 "https://musicbrainz.org/recording/c59ae95f-7cdf-407b-a299-4121b16296cc"
The code then calls tracker_namespace_manager_compress_uri()
:
235 if (!full_namespaces && g_str_has_prefix (l->data, "http"))
236 str = tracker_namespace_manager_compress_uri (namespaces, l->data);
237 else
238 str = g_strdup (l->data);
239
The URI doesn't correspond to a known RDF namespace, so tracker_namespace_manager_compress_uri()
returns NULL which is documented behaviour.
The code doesn't check for this case, and proceeds with str = NULL
causing the segfault.