Skip to content

feat(plugin): add linglong layer and uab package support - #493

Draft
add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:feat/linglong-plugin-official
Draft

add-uos wants to merge 1 commit into
linuxdeepin:masterfrom
add-uos:feat/linglong-plugin-official

Conversation

@add-uos

@add-uos add-uos commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

功能说明

新增玲珑(linglong)layer / uab 软件包的只读解压插件 kerfuffle_clilllayer,压缩包管理器可以直接预览和解压玲珑包。

实现方式

复刻官方 linglong 库(linyaps libs/linglong)的容器解析逻辑,不再依赖 ll-builder / ll-cli:

  • layer:[40B 魔数][4B LE 长度][LayerInfo JSON][EROFS 载荷至文件尾],对齐官方 LayerFile::binaryDataOffset()
  • uab:ELF64 容器,解析 linglong.meta section(JSON)中 sections.bundle 指向的 EROFS section,对齐官方 UABFile::unpack()
  • EROFS 载荷先落盘再调用官方同款兜底工具 fsck.erofs --extract 解压(与官方 LayerPackager/UABFile 无 erofsfuse 时的回退路径一致),仅需系统安装 erofs-utils,无 root / 挂载要求
  • 解析与解压全程边界校验(长度上限、偏移范围、quint64 回绕防护),异常文件统一报"压缩包损坏",10 分钟超时兜底

mimetype 注册

  • application/vnd.linglong.layer:glob *.layer + 40 字节魔数 magic
  • application/vnd.linglong.uab:仅 glob *.uab(uab 本质是 ELF 容器,注册 ELF magic 会误伤所有可执行文件)
  • 应用内 determineMimeType() 通过 ELF linglong.meta section 特征精确识别 uab,使用 inherits(x-executable) 兼容 PIE 等子类型判定

其他

  • 修复 Qt6 下 KPluginLoader::load() 中 Q_ASSERT(lib.isLoaded()) 误触发(Qt6 的 QLibrary 与 QPluginLoader 不共享加载状态),改为显式 lib.load()
  • 设置页新增 layer/uab 文件关联勾选项

测试

  • 真实 layer 包(459 条目)与官方配方构造的 uab 包:识别 / 预览 / 全量提取 / 选中提取 / 符号链接保留均通过
  • 异常输入(垃圾数据、截断、空文件、ELF 回绕恶意构造):全部优雅报错 ET_ArchiveDamaged,无崩溃无挂死
  • 普通 ELF(如 /bin/true)不受 uab 特判影响
  • GUI 端到端验证通过

Commit: 88abd37

Summary by Sourcery

Add Linglong layer and UAB package handling so the archive manager can safely identify, preview, and extract these packages.

New Features:

  • Add read-only archive support for Linglong layer and UAB packages, including preview and full or selective extraction.
  • Recognize Linglong layer packages by extension and magic, and identify UAB packages using ELF section metadata without misclassifying ordinary executables.
  • Expose Linglong layer and UAB file associations in the application settings.

Bug Fixes:

  • Prevent Qt6 plugin loading assertions caused by inconsistent QLibrary and QPluginLoader load state.

Enhancements:

  • Validate package structure and extraction inputs defensively, report damaged archives consistently, and bound external extraction timeouts.
  • Preserve archive contents such as symbolic links during extraction.

Build:

  • Build and install the new Linglong archive plugin, which uses the system fsck.erofs utility.

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: add-uos

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@sourcery-ai

sourcery-ai Bot commented Sep 21, 2026

Copy link
Copy Markdown

Reviewer's Guide

This PR integrates a read-only Linglong layer/UAB archive plugin, implementing bounded native parsing of layer headers and ELF section metadata, EROFS extraction via the external fsck.erofs fallback, archive browsing and selective extraction behavior, MIME/association registration, and a Qt 6 plugin-loader compatibility fix.

Sequence diagram for Linglong package preview and extraction

sequenceDiagram
    participant User
    participant Compressor
    participant LayerPlugin
    participant Parser
    participant FsckErofs
    participant FileSystem

    User->>Compressor: open Linglong package
    Compressor->>LayerPlugin: list()
    LayerPlugin->>Parser: parseHeader()
    alt layer package
        Parser->>Parser: parseLayerHeader()
    else ELF UAB package
        Parser->>Parser: parseUabHeader()
    end
    Parser-->>LayerPlugin: EROFS offset and size
    LayerPlugin->>FileSystem: copyPayload()
    LayerPlugin->>FsckErofs: --extract=destDir bundle.erofs
    FsckErofs-->>LayerPlugin: extracted files
    LayerPlugin->>LayerPlugin: collectEntries()
    LayerPlugin-->>Compressor: archive entries
    Compressor-->>User: preview contents

    User->>Compressor: extract selected files
    Compressor->>LayerPlugin: extractFiles()
    LayerPlugin->>FsckErofs: --extract=stagingDir bundle.erofs
    FsckErofs-->>LayerPlugin: staged contents
    LayerPlugin->>FileSystem: moveStagedToTarget()
    FileSystem-->>Compressor: extraction result
    Compressor-->>User: extraction complete
Loading

File-Level Changes

Change Details Files
Adds a read-only Linglong package plugin that parses layer and UAB container metadata, stages the embedded EROFS payload, and extracts it through fsck.erofs.
  • Registers the plugin in the build and install targets.
  • Parses layer headers with magic/length validation and UAB ELF64 section tables with bounded offset and metadata checks.
  • Locates the UAB bundle section through linglong.meta JSON.
  • Copies payloads to temporary files and invokes fsck.erofs with a ten-minute timeout.
  • Supports archive listing, full extraction, selected extraction, overwrite handling, progress reporting, and symlink preservation.
  • Maps extraction and malformed-input failures to archive-damaged errors.
3rdparty/CMakeLists.txt
3rdparty/clilllayerplugin/CMakeLists.txt
3rdparty/clilllayerplugin/clilllayerplugin.cpp
3rdparty/clilllayerplugin/clilllayerplugin.h
3rdparty/clilllayerplugin/kerfuffle_clilllayer.json
CMakeLists.txt
Registers Linglong layer and UAB MIME types and adds content-aware UAB detection without treating every ELF executable as a UAB package.
  • Adds layer glob and 40-byte magic detection.
  • Adds UAB glob-only registration.
  • Inspects ELF64 section tables for linglong.meta when the content MIME inherits from x-executable.
  • Adds layer and UAB types to the application association list.
src/assets/data/deepin-compressor.json
src/assets/mimetype/deepin-compressor.xml
src/source/common/mimetypes.cpp
src/source/common/uitools.cpp
Makes plugin loading compatible with Qt 6 library-loading behavior.
  • Explicitly loads the QLibrary before resolving the plugin version symbol when it is not already loaded, avoiding the invalid assertion.
3rdparty/interface/plugin/kpluginloader.cpp

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 3 issues

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="3rdparty/clilllayerplugin/clilllayerplugin.cpp" line_range="545-556" />
<code_context>
+            return false;
+        }
+        if (countByItems) {
+            m_qDoneSize += 1;
+        } else {
+            m_qDoneSize += QFileInfo(pair.first).isDir() ? 0 : QFileInfo(pair.first).size();
+        }
+        emit signalprogress(100.0 * m_qDoneSize / m_qTotalSize);
+    }
</code_context>
<issue_to_address>
**issue (bug_risk):** After `moveToDest()` succeeds by renaming an entry, the source path no longer exists, so `QFileInfo(pair.first).size()` returns zero and the progress counter never advances for file payloads. Extraction completes while the progress signal remains below 100%.

**Triggers:** When the staged directory and destination are on the same filesystem and files are moved by rename.

**Suggested fix:** Capture each entry's size before calling `moveToDest()` and use that saved value for progress accounting.

```suggestion
    for (const auto &pair : moveList) {
        emit signalCurFileName(QFileInfo(pair.first).fileName());
        const qint64 entrySize = QFileInfo(pair.first).isDir() ? 0 : QFileInfo(pair.first).size();
        if (!moveToDest(pair.first, pair.second)) {
            return false;
        }
        if (countByItems) {
            m_qDoneSize += 1;
        } else {
            m_qDoneSize += entrySize;
        }
        emit signalprogress(100.0 * m_qDoneSize / m_qTotalSize);
    }
```
</issue_to_address>

### Comment 2
<location path="3rdparty/clilllayerplugin/clilllayerplugin.cpp" line_range="162" />
<code_context>
+                                                   quint64 *size) -> bool {
+        for (int i = 0; i < shnum; ++i) {
+            const uchar *sh = shdrAt(i);
+            const quint32 nameOff = qFromLittleEndian<quint32>(sh);   // sh_name
+            if (nameOff >= static_cast<quint32>(shstrtab.size())) {
+                continue;
+            }
+            const QByteArray secName = shstrtab.constData() + nameOff;
+            if (secName != name) {
+                continue;
</code_context>
<issue_to_address>
**🚨 issue (security):** `QByteArray secName = shstrtab.constData() + nameOff` constructs an unbounded C string from attacker-controlled ELF section-name data. If the string table has no NUL terminator after `nameOff`, parsing reads past the QByteArray allocation and can crash or trigger an out-of-bounds read on malformed UAB input.

**Triggers:** When a malformed ELF has a valid in-range section-name offset but no NUL terminator in the remaining string table.

**Suggested fix:** Bound the lookup to the remaining string-table length, for example by locating NUL with `memchr` before constructing the QByteArray.

```suggestion
            const int nameEnd = shstrtab.indexOf('\0', static_cast<int>(nameOff));
            if (nameEnd < 0) {
                continue;
            }
            const QByteArray secName = shstrtab.mid(static_cast<int>(nameOff), nameEnd - static_cast<int>(nameOff));
```
</issue_to_address>

### Comment 3
<location path="3rdparty/clilllayerplugin/clilllayerplugin.cpp" line_range="464-465" />
<code_context>
+    }
+    srcFile.unsetError();
+    if (srcInfo.isSymLink()) {
+        // 注:symLinkTarget() 返回绝对路径,相对链接在回退路径下会转为绝对
+        if (QFile::link(srcInfo.symLinkTarget(), dst)) {
+            return true;
+        }
</code_context>
<issue_to_address>
**issue (broader_impact):** The fallback path recreates a relative archive symlink using `symLinkTarget()`, which resolves it to an absolute path under the staging directory. Once the temporary staging directory is removed, the extracted symlink points at the deleted staging path instead of retaining its original relative target.

**Triggers:** When renaming the staged symlink fails and the QFile::link fallback is used.

**Suggested fix:** Read and recreate the symlink's original link text rather than its resolved absolute target.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment thread 3rdparty/clilllayerplugin/clilllayerplugin.cpp
Comment thread 3rdparty/clilllayerplugin/clilllayerplugin.cpp Outdated
Comment thread 3rdparty/clilllayerplugin/clilllayerplugin.cpp Outdated
@add-uos
add-uos force-pushed the feat/linglong-plugin-official branch from 88abd37 to a66d7b5 Compare September 21, 2026 09:50
Add a read-only kerfuffle plugin for linglong layer/uab packages,
parsing the official container formats directly and extracting the
embedded EROFS image with fsck.erofs, so no linglong package is
required. layer: 40-byte magic + meta JSON + EROFS payload; uab:
ELF64 container, locate the bundle section via linglong.meta JSON.
Register the vnd.linglong.layer mimetype and add association
checkboxes; uab files keep the official vnd.linyaps.uab type
registered by linglong-bin, so no self-made uab type is needed and
no icon override is applied (generic file icons are kept). Also fix
KPluginLoader for Qt6 where QLibrary state is not shared with
QPluginLoader. uab is detected inside the app via the linglong.meta
ELF section since plain mime magic would hijack all ELF executables.

新增玲珑 layer/uab 只读解压插件:直接解析官方容器格式并用
fsck.erofs 解压内嵌 EROFS 镜像,不依赖玲珑软件包。layer 为
40 字节魔数 + 元信息 JSON + EROFS 载荷;uab 为 ELF64 容器,
经 linglong.meta JSON 定位 bundle section。注册
vnd.linglong.layer mimetype 并新增文件关联勾选项;uab 保持
官方 linglong-bin 注册的 vnd.linyaps.uab 类型,不自造 uab
类型也不覆盖图标(保留通用文件图标)。修复 Qt6 下
KPluginLoader 与 QPluginLoader 不共享加载状态导致的断言问题。
应用内通过 linglong.meta ELF section 精确识别 uab,避免 magic
误伤所有可执行文件。

Log: 新增玲珑 layer/uab 包的预览与解压支持
Influence: 无 ll-builder/linglong 环境也能预览解压 layer/uab;
Qt6 调试构建下插件加载断言修复。
@add-uos
add-uos force-pushed the feat/linglong-plugin-official branch from a66d7b5 to 8496788 Compare September 21, 2026 11:34
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

AI 代码审查报告

项目: linuxdeepin/deepin-compressor
PR: #493
提交标题: feat(plugin): add linglong layer and uab package support
作者: add-uos
分支: feat/linglong-plugin-official → master
审查时间: 2026-09-21


总体评价

总分: 96 / 100 (优秀)

本 PR 为 deepin-compressor 添加玲珑(linglong)layer 和 uab 包格式的只读插件支持,实现了包格式解析、EROFS 载荷提取、文件列表预览和解压功能。代码质量优秀,安全防护完善,二进制格式解析有严格的边界检查和整数溢出防护,与 commit 目的完全一致。


漏洞统计

指标 数量
当前漏洞总数 0
新增漏洞 0
减少漏洞 0
持平 0

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个


四维度评分

维度1: 语法逻辑 ✓ (25/25)

语法正确,逻辑清晰

分析内容:

本 PR 新增了 clilllayerplugin 插件,实现了玲珑 layer/uab 包的格式解析与解压功能。代码逻辑清晰,各函数职责明确:

  1. parseLayerHeader(): 正确解析 layer 格式(40字节魔数 + 4字节LE长度 + JSON元信息 + EROFS数据),边界检查完善,static_assert 确保魔数大小正确
  2. parseUabHeader(): 正确解析 ELF64 容器格式,验证 ELF 魔数、类/编码、节头表,整数溢出检查到位(先校验各分量再作差),手动定位 NUL 边界防止恶意 ELF 字符串表越界读
  3. copyPayload(): 分块(4MB)复制 EROFS 载荷,读写循环正确,错误处理完整
  4. runFsckExtract(): 调用 fsck.erofs --extract 解压,10分钟超时兜底,进程管理正确
  5. extractPackage(): 编排 头解析→载荷复制→fsck解压 流程,逻辑正确
  6. collectEntries(): QDirIterator 递归收集文件条目,符号链接按文件处理避免目录误判
  7. moveToDest(): 递归移动文件/目录,处理同名冲突(弹覆盖询问),符号链接用 ::readlink 取原始链接文本重建
  8. moveStagedToTarget(): 支持全部解压、根目录提取、深层提取三种模式,进度计算正确(纯目录时按条目计数避免除零)
  9. extractFiles(): 主解压入口,暂存目录放在目标目录内保证同文件系统 rename 高效

kpluginloader.cpp 修复了 Qt6 兼容性问题:Q_ASSERT(lib.isLoaded()) 在 Qt6 中会误触发,改为显式 lib.load(),语义正确。

mimetypes.cpp 新增 elfContainsSection() 函数,通过检测 ELF section 名 "linglong.meta" 精确识别 uab 包,ELF 解析逻辑与插件中的 parseUabHeader() 一致但简化(仅检测 section 名存在性)。

无编译错误,无内存泄漏,无空指针风险,无竞态条件。

维度2: 代码质量 ✓ (22/25)

代码结构清晰,注释完整

分析内容:

注释完整性(5/5): clilllayerplugin.h 中每个函数都有完整的 Doxygen 风格注释,包含 @brief、@PARAM、@return;clilllayerplugin.cpp 中有详细的二进制格式布局注释;mimetypes.cpp 中 elfContainsSection 有完整的函数说明注释。类级别注释解释了 layer/uab 格式布局,对齐官方实现。

代码重复(2/5): ELF64 头解析逻辑在 clilllayerplugin.cpp 的 parseUabHeader() 和 mimetypes.cpp 的 elfContainsSection() 中重复出现。两者都解析 ELF 魔数、读取节头表、搜索节名字符串表。虽然服务于不同目的(一个提取数据,一个仅检测存在性)且位于不同模块,但核心解析模式重复,建议提取为公共 ELF 工具函数。(-3分)

结构合理性(5/5): 函数长度适中,最长函数 parseUabHeader() 约90行在可接受范围内。匿名命名空间封装常量,私有方法声明规范,常量使用 k 前缀命名。关注点分离良好:解析→复制→解压→收集/移动。

调试信息清理(5/5): qDebug/qInfo/qWarning 日志使用合理,均为有意义的运行时信息(非残留调试代码),符合 Qt 插件开发惯例。

改进建议:

// 建议提取 ELF 解析为公共工具函数,减少重复
// 例如在 interface 层新增 ElfParser 工具类
class ElfParser {
public:
    static bool containsSection(const QString &path, const QByteArray &sectionName);
    static bool findSection(QFile &file, const QByteArray &name,
                            quint64 *offset, quint64 *size, QString *errOut);
};
// clilllayerplugin.cpp 和 mimetypes.cpp 均可复用

维度3: 代码性能 ✓ (19/20)

性能良好,资源使用合理

分析内容:

算法复杂度: 所有解析函数复杂度合理——parseLayerHeader() O(1),parseUabHeader() O(n)(n=节数,通常<50),collectEntries() O(n)(n=文件数),copyPayload() O(size) 分块读取。

资源管理: QTemporaryDir 自动清理临时目录,QProcess 有10分钟超时保护,kMaxMetaSize(16MB)限制防止异常文件导致超大读取。copyPayload() 使用 4MB 分块读写,预分配缓冲区。

已知限制: list() 需完整解包到临时目录才能列出文件内容(EROFS 格式限制,无法随机访问文件列表);extractFiles() 需完整解包到暂存目录再移动选中文件(fsck.erofs 无法提取单个文件)。这些限制在代码注释中已说明,与官方玲珑解包策略一致。

轻微优化空间: moveStagedToTarget() 中对同一路径重复创建 QFileInfo 对象(QFileInfo(src).isDir() 和 QFileInfo(src).size() 各创建一次),共4次 QFileInfo 构造(2次统计 + 2次移动)。虽然 stat 调用开销小,但可优化。(-1分)

// 优化建议:复用 QFileInfo 对象
for (const QString &name : itemsToMove) {
    const QString src = srcRoot + QLatin1Char('/') + name;
    const QString dst = targetPath + QLatin1Char('/') + name;
    const QFileInfo srcInfo(src);  // 只创建一次
    m_qTotalSize += srcInfo.isDir() ? 0 : srcInfo.size();
    moveList << qMakePair(src, dst);
}
// ...
for (const auto &pair : moveList) {
    const QFileInfo srcInfo(pair.first);  // 只创建一次
    const qint64 entrySize = srcInfo.isDir() ? 0 : srcInfo.size();
    // ...
}

维度4: 代码安全 ✓ (30/30)

存在0个安全漏洞

分析内容:

命令注入防护: runFsckExtract() 使用 QProcess::setArguments() 直接传递参数(不经过 shell),destDir 和 erofsFile 作为独立参数传递,无 shell 注入风险。QStandardPaths::findExecutable("fsck.erofs") 在 PATH 中查找可执行文件,为标准 Qt 模式。

缓冲区溢出防护:

  • parseUabHeader() 和 elfContainsSection() 中所有文件读取均有边界检查
  • 整数溢出检查:先验证 shoff > file.size(),再检查 shnum * shentsize > file.size() - shoff
  • kMaxMetaSize(16MB)限制元信息 JSON 大小,防止异常文件导致超大内存分配
  • 手动定位 NUL 边界(shstrtab.indexOf('\0', nameOff))防止恶意 ELF 字符串表无终止符导致越界读

路径遍历防护:

  • 使用暂存目录(staging directory)方式提取,QDirIterator 不跟随符号链接
  • collectEntries() 中符号链接按文件处理(fi.isDir() && !fi.isSymLink()),避免跟随链接导致目录误判
  • moveToDest() 中符号链接用 ::readlink 取原始链接文本重建,QFile::link() 创建链接而非 QFile::copy()(copy 会跟随链接复制内容,语义不对)
  • QDir::NoDotAndDotDot 过滤 . 和 .. 目录项

拒绝服务防护:

  • kFsckTimeoutMs(10分钟)限制 fsck.erofs 执行时间
  • kMaxMetaSize(16MB)限制元信息读取
  • 文件截断检测(lenBuf.size() != 4、ehdr.size() != 64 等)
  • QTemporaryDir 使用随机名称避免并发冲突

整数安全: metaLen 为 quint32 转 qint64 后与文件大小比较,无溢出风险;shnum * shentsize 最大 65535*64=4194240,在 qint64 范围内安全。

信息泄露: 无硬编码密钥或敏感信息,日志仅输出文件路径和操作状态,符合桌面应用规范。


修改文件清单

文件 类型 说明
3rdparty/clilllayerplugin/clilllayerplugin.cpp 新增 玲珑 layer/uab 插件主实现(630行)
3rdparty/clilllayerplugin/clilllayerplugin.h 新增 插件头文件(124行)
3rdparty/clilllayerplugin/CMakeLists.txt 新增 插件构建配置
3rdparty/clilllayerplugin/kerfuffle_clilllayer.json 新增 插件元数据
3rdparty/CMakeLists.txt 修改 添加新插件子目录
CMakeLists.txt 修改 添加安装目标
3rdparty/interface/plugin/kpluginloader.cpp 修改 修复 Qt6 兼容性问题
src/source/common/mimetypes.cpp 修改 添加 uab 包 MIME 类型检测
src/source/common/uitools.cpp 修改 添加文件关联类型
src/assets/data/deepin-compressor.json 修改 添加 MIME 类型设置
src/assets/mimetype/deepin-compressor.xml 修改 添加 MIME 类型定义

审查结论

本 PR 代码质量优秀,为 deepin-compressor 添加了完整的玲珑 layer/uab 包只读插件支持。代码实现了二进制格式解析(layer 魔数 + uab ELF64 容器)、EROFS 载荷提取(fsck.erofs 解压)、文件列表预览和解压功能。安全防护完善,包含命令注入防护、缓冲区溢出防护、整数溢出检查、路径遍历防护和拒绝服务防护。与 commit 目的"add linglong layer and uab package support"完全一致。建议合并。

@add-uos
add-uos marked this pull request as draft September 22, 2026 08:56
@deepin-bot

deepin-bot Bot commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

TAG Bot

New tag: 6.5.35
DISTRIBUTION: unstable
Suggest: synchronizing this PR through rebase #499

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants