• Bug#1091493: segfault in python script using appstream provides

    From Petter Reinholdtsen@21:1/5 to All on Fri Dec 27 19:40:01 2024
    Package: gir1.2-appstream-1.0
    Version: 1.0.4-1
    Severity: important

    The following script segfaults when running in Debian unstable:

    #!/usr/bin/env python3
    #
    # Find all software components which have a modalias in the
    # AppStream database and prints them to stdout.
    #
    # WARNING: This is pure example code, which does no error
    # checking at all!

    import gi
    gi.require_version('AppStream', '1.0')
    from gi.repository import AppStream
    import re

    pool = AppStream.Pool()
    pool.load()
    try:
    cpts = pool.get_components().as_array()
    except AttributeError:
    # Handle old API too (before version 1.0)
    cpts = pool.get_components()

    ma_cpts = list()
    fwr_cpts = list()
    fwf_cpts = list()
    for cpt in cpts:
    modalias = cpt.get_provided_for_kind(AppStream.ProvidedKind.MODALIAS)
    fwruntime = cpt.get_provided_for_kind(AppStream.ProvidedKind.FIRMWARE_RUNTIME)
    fwflashed = cpt.get_provided_for_kind(AppStream.ProvidedKind.FIRMWARE_FLASHED)
    if modalias:
    ma_cpts.append(cpt)
    if fwruntime:
    fwr_cpts.append(cpt)
    if fwflashed:
    fwf_cpts.append(cpt)

    # we got all components providing modaliases
    pkgaliases = {}
    for cpt in ma_cpts:
    for pkg in sorted(cpt.get_pkgnames()):
    if pkg not in pkgaliases:
    pkgaliases[pkg] = {}
    aliases = pkgaliases[pkg]
    prov = cpt.get_provided_for_kind(AppStream.ProvidedKind.MODALIAS)
    for item in prov.get_items():
    m = re.match(r'usb:v([0-9a-fA-F]{4})p([0-9a-fA-F]{4})d\*', item)
    if m:
    item = "usb:v%sp%sd*" % (
    m.group(1).upper(), m.group(2).upper()
    )
    aliases[str(item)] = 1

    if False:
    for cpt in fwr_cpts:
    for pkg in sorted(cpt.get_pkgnames()):
    if pkg not in pkgaliases:
    pkgaliases[pkg] = {}
    aliases = pkgaliases[pkg]
    prov = cpt.get_provided_for_kind(AppStream.ProvidedKind.FIRMWARE_RUNTIME)
    for item in prov.get_items():
    aliases["firmware:%s" % str(item)] = 1

    for pkg in sorted(pkgaliases.keys()):
    print("Package: %s" % pkg)
    print("Modaliases: unused(%s)" % ", ".join(sorted(pkgaliases[pkg].keys())))
    print()

    This used to list all packages with modalias provides. This script is
    part of the utilities used during isenkram maintenance.

    --
    Happy hacking
    Petter Reinholdtsen

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)