appstream_dart 0.4.2
appstream_dart: ^0.4.2 copied to clipboard
High-performance AppStream XML parser with C++23 FFI bridge. Streams catalog metadata into SQLite with Drift ORM and FTS5 search.
0.4.2 #
- Fix undefined behavior parsing untrusted catalog data. The digit
accumulators in
AppStreamParsercomputedresult * 10 + digitwith no bound, so a long enough run of digits overflowed. Signed overflow is undefined behavior, and UBSan confirmed it on two reachable paths:<release timestamp="999...">overflowinglong long, and<icon width="999...">overflowingint. Both values come from an attribute in a catalog fetched over the network. The same helper also feedspriority, image and video dimensions, and icon scale. Accumulation now saturates, so a hostile value is clamped rather than wrapped. Regression tests cover both inputs. - Check the
gmtime_rreturn value inunixEpochToISO8601. It returns null for atime_tit cannot represent, which a saturated epoch reaches; ignoring it left thestd::tmzero-initialized and silently produced a1900-01-01T00:00:00Ztimestamp. An unrepresentable epoch now yields no timestamp. - Add
scripts/tidy.sh, pinning clang-tidy the wayscripts/format.shpins clang-format, and make the CI clang-tidy job blocking rather than advisory. The unpinned checker gave results that depended on which LLVM happened to be first onPATH: the version CI installed could not parse a current libstdc++ and bailed early, while also emitting abugprone-use-after-movefalse positive onx = {}immediately afterstd::move(x). The pinned version is what found thegmtime_rdefect above.
0.4.1 #
- Restore Flutter compatibility, which 0.4.0 broke.
hooks^2.1.0 requiresmeta^1.19.0, butflutter_testfrom the Flutter SDK pinsmeta1.18.0 on 3.44.x, so any Flutter app failed version solving against appstream_dart 0.4.0 — the bundled example included. The constraints are nowhooks: '>=1.0.2 <3.0.0'andcode_assets: '>=1.0.0 <2.0.0', which resolve to 2.1.0/1.2.1 standalone and to 1.0.2/1.0.0 under an older Flutter. The build hook is source-compatible with both majors. - Bind the native symbols as
@Nativeexternals against@DefaultAssetinstead of resolving them throughDynamicLibrary.open.hook/build.dartalready emitted the library as a code asset, but the VM consults its asset table only for@Nativedeclarations, so that asset was built and then never used; the loader compensated with a seven-step search. The public API is unchanged. - Remove that search chain (~180 lines): a
/proc/self/mapsscan, a glob through.dart_tool/hooks_runner/internals, and candidate paths derived fromPlatform.script, the executable, and the current directory. The last of those made the process loadlibappstream.sofrom a CWD-relativelib/,build/, orsrc/build/directory, so running an application from a directory an attacker could write to was enough to get a library of their choosing loaded. - Correct the comments in
hook/build.dartandlib/src/appstream_native.dart, which described the@Nativemechanism that did not yet exist. - Refresh stale facts in the README, which is the pub.dev landing page: the
install snippet advertised
^0.2.2, the status line and test count were three releases old (194 tests, not 185), the project tree was rooted at the pre-renameappstream/and listed adart_api_dl.cthat is now.cpp, and the prerequisites claimed Clang 17+ while thestd::expectedpolyfill targets Clang 18.
0.4.0 #
- Breaking (dependency resolution):
hooks^1.0.2 → ^2.1.0 andcode_assets^1.0.0 → ^1.2.1. Consumers pinned tohooks1.x will no longer resolve. The build hook API is unchanged betweenhooks1.x and 2.x, sohook/build.dartneeded no edits and the public Dart API is untouched; the bump also unpinsnative_toolchain_candrecord_usefrom their 1.x-era versions. The SDK constraint stays^3.10.0. - Repository moved to
github.com/flatpak-minimal/appstream_dart;repositoryandissue_trackerupdated to match. - Fix
scripts/test.shpassing-DBUILD_TESTING=ON, which the CMake build ignores — the gate has been-DAPPSTREAM_BUILD_TESTS=ONsince 0.2.2. The C++ suite was therefore never configured or rebuilt, andctestsilently ran whatever stale binary was left in the build directory. CI already passed the correct flag, so only local runs were affected. - clang-tidy cleanups in
AppStreamParserandXmlScanner: explicit parentheses in mixed*/+accumulator arithmetic,contains()in place of afind() != nposmembership test, and consistent braces across theprovidesif/else chain.
0.3.0 #
- Licensing: adopt SPDX license headers (
SPDX-License-Identifier/SPDX-FileCopyrightText) across all source files; addTHIRD_PARTY_LICENSEScataloging every direct dependency. - LICENSE file replaced with the compact SPDX-standard Apache-2.0 text.
- Dependency bumps:
sqlite3^2.4.0 → ^3.3.1,lints^4.0.0 → ^6.1.0 (applies to both the main package and the Flutter example). - Public API documentation: add dartdoc comments to all exported classes,
fields, and constructors in
lib/appstream.dart,lib/src/database/database.dart, andlib/src/database/tables.dart.
0.2.2 #
- pub.dev publishing hygiene:
- Add
lib/appstream_dart.dartre-export so the primary library name matches the package name. The originallib/appstream.dartimport continues to work. - Rename
docs/→doc/andtests/→native_tests/to match the pub package layout (singulardoc/, no clash with the Darttest/directory). - Add
.pubignoreto keep build artifacts, the cachedappstream.xml/catalog.db, the Flutter example sub-package, and legacy/dev shell scripts out of the published archive.
- Add
- Native build: gate the C++ test suite behind
-DAPPSTREAM_BUILD_TESTS=ONso thepackage:hooksbuild hook and downstream consumers no longer fetch GoogleTest or build the test executable by default. - Reliability and security fixes surfaced by clang-tidy:
- Fix 8 use-after-move bugs in
AppStreamParser(member key strings were re-checked via.empty()after being moved). - Mark
SqliteWriter::~SqliteWriternoexceptand wrap its body in a try/catch so a logging failure during teardown can no longerstd::terminatethe parsing process. postString(FFI) now returns success/failure and a stack-allocated OOM sentinel (-2) is posted if the malloc fails, instead of the progress message being silently dropped.- Document path-handling expectations on
appstream_parse_to_sqlite: paths are passed directly toopen(2)/SQLite with no normalization or sandboxing, so callers accepting them from untrusted input must validate first.
- Fix 8 use-after-move bugs in
- Tooling: add
.clang-formatand.clang-tidyat the repo root so formatting and lint runs are deterministic. - Flutter example (
example/flathub_catalog): drive the package's CMake build viaExternalProject_Addsolibappstream.sois always built and bundled before the runner is linked.
0.2.1 #
- Add
std::expectedpolyfill for Clang 18 (Flutter's default Linux toolchain), removing the hard requirement on Clang 19+ - Rename package from
appstreamtoappstream_dartand fix example imports to match
0.2.0 #
- Multi-language translation support: store
xml:langfield translations incomponent_field_translationstable, select at runtime with locale fallback chain - Streaming XML parser: replace mmap with fd-based 256 KB sliding buffer, reducing peak memory from ~64 MB to ~22 MB
- Drift ORM database layer with 20 tables, FTS5 search, locale-aware queries
- Native asset build hook (
hook/build.dart) for automatic C++ compilation - Flutter example app with catalog browsing, language picker, screenshot viewer, and AppStream HTML rendering
- Security hardening: SQLITE_TRANSIENT bindings, URI scheme validation, FTS5 query sanitization, numeric entity overflow protection
0.1.0 #
- Initial release
- C++23 XML parser with FFI bridge
- Streaming pipeline: XML to SQLite via ComponentSink
- Dart API with isolate-based parsing and progress events
- CLI tools for downloading, parsing, and querying Flathub catalog