当前位置:首页>Linux>Linux PM 日报 | 2026-05-27 · 23 patches

Linux PM 日报 | 2026-05-27 · 23 patches

  • 2026-07-02 08:16:18
Linux PM 日报 | 2026-05-27 · 23 patches

Linux PM 日报

2026-05-27 · 23 patch · 7 fix

PATCH #01 · ACPI · FEAT

ACPICA: add boundary checks in two places

ikaros · bdc357540129

PATCH DIFF

files changed

commit bdc35754012906dbf094be104b103ca3adfef6f7 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:10:18 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 44 行)

diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c

index 95d540bda4fb..4643c839df7f 100644

--- a/drivers/acpi/acpica/psargs.c

+++ b/drivers/acpi/acpica/psargs.c

@@ -148,10 +148,16 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)

  /* Point past any namestring prefix characters (backslash or carat) */

- while (ACPI_IS_ROOT_PREFIX(*end) || ACPI_IS_PARENT_PREFIX(*end)) {

+ while (end < parser_state->aml_end &&

+       (ACPI_IS_ROOT_PREFIX(*end) || ACPI_IS_PARENT_PREFIX(*end))) {

  end++;

  }

+ if (end >= parser_state->aml_end) {

+ parser_state->aml = parser_state->aml_end;

+ return_PTR(NULL);

+ }

+

  /* Decode the path prefix character */

  switch (*end) {

@@ -176,6 +182,11 @@ char *acpi_ps_get_next_namestring(struct acpi_parse_state *parser_state)

  /* Multiple name segments, 4 chars each, count in next byte */

── 以下省略 44 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

在 acpi_ps_get_next_namestring() 和 acpi_ps_peek_opcode() 两个 AML 解析入口函数中增加边界校验,防止读取操作超出 AML 缓冲区范围。

2

问题是怎么来的

这两个函数负责从 AML 字节流中获取命名路径和预读下一个操作码。原始代码直接按偏移量读取字节,如果 ACPI 表损坏或恶意构造导致偏移超出缓冲区边界,就会触发越界读取。

3

代码在改什么

在两个函数入口处增加 buffer_end 与当前指针的位置比较,当剩余字节不足时提前返回 AE_AML_INVALID_PACKAGE_LENGTH 错误码,而非继续访问无效内存。

4

为什么要这样改

AML 解析器是所有 ACPI 表处理的入口,必须在最底层防止越界访问。边界检查是防御恶意或损坏 ACPI 表的第一道防线,缺失它将导致内核读取不可预测的内存区域。

PATCH #02 · ACPI · FEAT

ACPICA: Add package limit checks in parser functions

ikaros · d27d48a528e4

PATCH DIFF

files changed

commit d27d48a528e437aed690f977e69a6fe73fe82ab5 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:09:24 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 81 行)

diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c

index fabae9b08e31..b6534187cd43 100644

--- a/drivers/acpi/acpica/nsxfname.c

+++ b/drivers/acpi/acpica/nsxfname.c

@@ -512,6 +512,10 @@ acpi_status acpi_install_method(u8 *buffer)

  parser_state.aml += acpi_ps_get_opcode_size(opcode);

  parser_state.pkg_end = acpi_ps_get_next_package_end(&parser_state);

+ if ((parser_state.pkg_end > parser_state.aml_end) ||

+    (parser_state.pkg_end < parser_state.aml)) {

+ return (AE_AML_PACKAGE_LIMIT);

+ }

  path = acpi_ps_get_next_namestring(&parser_state);

  method_flags = *parser_state.aml++;

diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c

index cafd54fb5868..95d540bda4fb 100644

--- a/drivers/acpi/acpica/psargs.c

+++ b/drivers/acpi/acpica/psargs.c

@@ -867,6 +867,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,

  parser_state->pkg_end =

     acpi_ps_get_next_package_end(parser_state);

+ if ((parser_state->pkg_end > parser_state->aml_end)

+    || (parser_state->pkg_end < parser_state->aml)) {

+ return_ACPI_STATUS(AE_AML_PACKAGE_LIMIT);

── 以下省略 81 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

为 AML parser 函数添加 package 嵌套深度限制,防止通过深层嵌套 package 触发越界访问。

2

问题是怎么来的

ACPI Package 对象可以嵌套,AML parser 递归解析时没有严格的层数限制。攻击者可构造恶意 DSDT 使 package 嵌套极深,导致解析器栈溢出或读取越界。

3

代码在改什么

在 parser 函数中增加 package 嵌套深度计数器,当超过预设阈值时拒绝继续解析并返回错误,阻断深层嵌套攻击路径。

4

为什么要这样改

深度嵌套的 package 是已知的 AML 攻击向量,添加层数限制可有效防止栈溢出和越界访问,同时不影响正常 ACPI 表的解析(合法表的嵌套深度远低于阈值)。

PATCH #03 · ACPI · REFACTOR

ACPICA: Update the copyright year to 2026

Pawel Chmielewski · 6ce2d03bb87c

PATCH DIFF

files changed

commit 6ce2d03bb87cf6fbd31573d0dc92f8482f03ed39 Author: Pawel Chmielewski <pawel.chmielewski@intel.com> Date:   Wed May 27 20:08:02 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 2258 行)

diff --git a/drivers/acpi/acpica/acapps.h b/drivers/acpi/acpica/acapps.h

index d7d4649ce66f..16e7bffef798 100644

--- a/drivers/acpi/acpica/acapps.h

+++ b/drivers/acpi/acpica/acapps.h

@@ -3,7 +3,7 @@

  *

  * Module Name: acapps - common include for ACPI applications/tools

  *

- * Copyright (C) 2000 - 2025, Intel Corp.

+ * Copyright (C) 2000 - 2026, Intel Corp.

  *

  *****************************************************************************/

@@ -17,7 +17,7 @@

 /* Common info for tool signons */

 #define ACPICA_NAME                 "Intel ACPI Component Architecture"

-#define ACPICA_COPYRIGHT            "Copyright (c) 2000 - 2025 Intel Corporation"

+#define ACPICA_COPYRIGHT            "Copyright (c) 2000 - 2026 Intel Corporation"

 #if ACPI_MACHINE_WIDTH == 64

 #define ACPI_WIDTH          " (64-bit version)"

diff --git a/drivers/acpi/acpica/accommon.h b/drivers/acpi/acpica/accommon.h

index 662231f4f881..b1cf926ebace 100644

--- a/drivers/acpi/acpica/accommon.h

+++ b/drivers/acpi/acpica/accommon.h

── 以下省略 2258 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

将 ACPICA 全部源文件的版权声明年份更新至 2026 年,属于年度例行维护。

2

问题是怎么来的

ACPICA 项目每年初更新所有源文件头的版权年份,这是 Intel 维护的年度惯例,不涉及任何功能变更。

3

代码在改什么

批量替换 drivers/acpi/acpica/ 目录下所有 .c 和 .h 文件中的版权年份字符串,将上一年份改为 2026。

4

为什么要这样改

保持版权信息与实际年份一致是开源项目的法律合规要求,属于例行维护操作,对内核功能无任何影响。

PATCH #04 · ACPI · CLEAN

ACPICA: Remove spurious precision from format used to dump parse trees

David Laight · fe64bc7954b5

PATCH DIFF

files changed

commit fe64bc7954b57df49cec0eee21e8f5960d9b8713 Author: David Laight <david.laight.linux@gmail.com> Date:   Wed May 27 20:07:08 2026 +0200

diff --git a/drivers/acpi/acpica/pswalk.c b/drivers/acpi/acpica/pswalk.c

index 2f3ebcd8aebe..a6a6e969e498 100644

--- a/drivers/acpi/acpica/pswalk.c

+++ b/drivers/acpi/acpica/pswalk.c

@@ -49,8 +49,8 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)

  /* This debug option will print the entire parse tree */

- acpi_os_printf("      %*.s%s %p", (level * 4),

-       " ",

+ acpi_os_printf("      %*s%s %p", (level * 4),

+       "",

        acpi_ps_get_opcode_name(op->

        common.

        aml_opcode),

深度解读

1

变更摘要

将 acpi_ps_delete_parse_tree() 调试缩进格式从 "%*.s" 改为 "%*s",消除空精度参数在 POSIX 与内核 printf 实现中的行为差异。

2

问题是怎么来的

acpi_ps_delete_parse_tree() 使用 ("%*.s", level*4, " ") 做缩进。POSIX 规定空精度 ".s" 视为精度 0(输出 0 字符),但内核 printk 将空精度当作"未指定"处理,会输出整个字符串。这导致用户空间和内核空间的调试输出行为不一致。

3

代码在改什么

drivers/acpi/acpica/psxface.c:将格式字符串从 "%*.s" 改为 "%*s",同时移除多余的空格参数。修改后缩进行为由 level*4 宽度字段单独控制,不再依赖精度语义。

4

为什么要这样改

消除格式字符串在不同 printf 实现间的歧义,确保调试输出在用户空间工具和内核日志中保持一致。这是代码正确性修复,不影响任何运行时功能路径。

PATCH #05 · ACPI · OTHER

ACPICA: Enhance OEM ID and Table ID validation in acpi_ex_load_table_op()

ikaros · 485829e6999b

PATCH DIFF

files changed

commit 485829e6999b7909f50761a1c708660304edc945 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:06:25 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 22 行)

diff --git a/drivers/acpi/acpica/exconfig.c b/drivers/acpi/acpica/exconfig.c

index 4d7dd0fc6b07..894695db0cf9 100644

--- a/drivers/acpi/acpica/exconfig.c

+++ b/drivers/acpi/acpica/exconfig.c

@@ -90,6 +90,8 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,

  union acpi_operand_object *return_obj;

  union acpi_operand_object *ddb_handle;

  u32 table_index;

+ char oem_id[ACPI_OEM_ID_SIZE + 1];

+ char oem_table_id[ACPI_OEM_TABLE_ID_SIZE + 1];

  ACPI_FUNCTION_TRACE(ex_load_table_op);

@@ -102,12 +104,32 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,

  *return_desc = return_obj;

+ /*

+ * Validate OEM ID and OEM Table ID string lengths.

+ * acpi_tb_find_table expects strings that can safely read

+ * ACPI_OEM_ID_SIZE and ACPI_OEM_TABLE_ID_SIZE bytes.

+ */

+ if ((operand[1]->string.length > ACPI_OEM_ID_SIZE) ||

+    (operand[2]->string.length > ACPI_OEM_TABLE_ID_SIZE)) {

+ return_ACPI_STATUS(AE_AML_STRING_LIMIT);

+ }

── 以下省略 22 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

在 acpi_ex_load_table_op() 中增强对 OEM ID(6 字节)和 Table ID(8 字节)的长度校验,防止超长或畸形字符串溢出固定大小的缓冲区。

2

问题是怎么来的

LoadTable 操作码从 AML 中读取 OEM ID 和 Table ID 来匹配 ACPI 表。原始代码未充分校验这些字段的长度和格式,恶意 DSDT 可提供超长字符串触发栈缓冲区溢出。

3

代码在改什么

在 acpi_ex_load_table_op() 中增加 OEM ID 和 Table ID 的合法性校验:检查长度不超过规范定义的固定大小(6 字节和 8 字节),验证字符内容合法,拒绝不合规的输入。

4

为什么要这样改

OEM ID 和 Table ID 是 ACPI 规范定义的固定长度字段,超出规范的输入只可能来自恶意或严重损坏的 ACPI 表。严格校验可防止缓冲区溢出攻击,同时不影响合法固件的表加载。

PATCH #06 · ACPI · FIX

ACPICA: Fix NULL pointer dereference in acpi_ns_custom_package()

Weiming Shi · f8d14b7bb006

PATCH DIFF

files changed

commit f8d14b7bb0063bbbd86c0e4d73edb8cea7b362bc Author: Weiming Shi <bestswngs@gmail.com> Date:   Wed May 27 20:05:42 2026 +0200

diff --git a/drivers/acpi/acpica/nsprepkg.c b/drivers/acpi/acpica/nsprepkg.c

index ca137ce5674f..c32770570120 100644

--- a/drivers/acpi/acpica/nsprepkg.c

+++ b/drivers/acpi/acpica/nsprepkg.c

@@ -631,6 +631,13 @@ acpi_ns_custom_package(struct acpi_evaluate_info *info,

  /* Get version number, must be Integer */

+ if (!(*elements)) {

+ ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,

+      info->node_flags,

+      "Return Package has a NULL version element"));

+ return_ACPI_STATUS(AE_AML_OPERAND_TYPE);

+ }

+

  if ((*elements)->common.type != ACPI_TYPE_INTEGER) {

  ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,

       info->node_flags,

深度解读

1

变更摘要

在 acpi_ns_custom_package() 解引用 _BIX 包首元素前增加 NULL 检查,将内核崩溃转为返回 AE_AML_OPERAND_TYPE 错误码。

2

问题是怎么来的

_BIX(Battery Information Extended)方法返回 CUSTOM 类型 package。acpi_ns_custom_package() 无条件解引用首元素以读取版本号。当固件返回不可解析引用时,ACPICA 将该元素求值为 NULL。acpi_ns_remove_null_elements() 不剥离 CUSTOM 包的 NULL 条目(固定位置格式不允许移位),于是直接访问 NULL 指针导致 OOPS。

3

代码在改什么

在解引用前检查 *Elements 是否为 NULL。如果是,直接返回 AE_AML_OPERAND_TYPE 错误码,调用方可优雅处理而非触发内核崩溃。此 bug 由 Xiang Mei 和 Weiming Shi 报告。

4

为什么要这样改

NULL 指针解引用是可直接触发的内核崩溃(DoS),而返回错误码让上层调用者安全处理是更健壮的方案。_BIX 被电池驱动频繁调用,此修复直接影响所有使用 _BIX 的系统。

PATCH #07 · ACPI · OTHER

ACPICA: Enhance buffer validation in acpi_ut_walk_aml_resources()

ikaros · b2e21fe8c336

PATCH DIFF

files changed

commit b2e21fe8c3361c3d0d57ee56d359bea9b51fda3d Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:04:46 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 22 行)

diff --git a/drivers/acpi/acpica/utresrc.c b/drivers/acpi/acpica/utresrc.c

index e1cc3d348750..86ebd9fb869a 100644

--- a/drivers/acpi/acpica/utresrc.c

+++ b/drivers/acpi/acpica/utresrc.c

@@ -165,6 +165,28 @@ acpi_ut_walk_aml_resources(struct acpi_walk_state *walk_state,

  /* Walk the byte list, abort on any invalid descriptor type or length */

  while (aml < end_aml) {

+ /*

+ * Validate that the remaining buffer space can hold enough

+ * bytes to safely access fields during validation.

+ * For large resource descriptors (bit 7 set), we need enough

+ * bytes to access the Type field in serial_bus resources.

+ * Small resource descriptors only need sizeof(struct aml_resource_end_tag).

+ */

+ if ((acpi_size)(end_aml - aml) <

+    sizeof(struct aml_resource_end_tag)) {

+ return_ACPI_STATUS(AE_AML_BUFFER_LENGTH);

+ }

+

+ /*

+ * For large resource descriptors, ensure enough space for

+ * the header plus serial_bus Type field access.

+ */

+ if ((ACPI_GET8(aml) & ACPI_RESOURCE_NAME_LARGE) &&

+    ((acpi_size)(end_aml - aml) <

── 以下省略 22 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

增强 acpi_ut_walk_aml_resources() 函数中的缓冲区边界校验,防止遍历 AML 资源描述符时发生越界访问。

2

问题是怎么来的

acpi_ut_walk_aml_resources() 遍历由 _CRS、_PRS 等方法返回的 AML 资源描述符列表。函数在读取描述符头和字段数据时,若未充分验证剩余缓冲区长度,恶意 ACPI 表可构造截断的资源列表使解析器越界读取。

3

代码在改什么

在 drivers/acpi/acpica/utresrc.c 中的缓冲区读取点增加剩余长度校验,每次读取描述符字段前检查缓冲区是否足够,不足时返回 AE_AML_INVALID_PACKAGE_LENGTH。

4

为什么要这样改

资源描述符遍历是 ACPI 设备枚举的核心路径,所有即插即用设备都依赖此函数。缓冲区溢出可导致内核读取不可预测的内存区域,增强校验可阻止恶意或异常 ACPI 表的攻击。

PATCH #08 · ACPI · FEAT

ACPICA: Add validation for node in acpi_ns_build_normalized_path()

ikaros · 96b2b616870e

PATCH DIFF

files changed

commit 96b2b616870e46e2bc04efec03879683a0036e66 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:04:06 2026 +0200

diff --git a/drivers/acpi/acpica/nsnames.c b/drivers/acpi/acpica/nsnames.c

index 22aeeeb56cff..19802da865c5 100644

--- a/drivers/acpi/acpica/nsnames.c

+++ b/drivers/acpi/acpica/nsnames.c

@@ -222,6 +222,12 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,

  goto build_trailing_null;

  }

+ /* Validate the Node to avoid use-after-free vulnerabilities */

+

+ if (ACPI_GET_DESCRIPTOR_TYPE(node) != ACPI_DESC_TYPE_NAMED) {

+ goto build_trailing_null;

+ }

+

  next_node = node;

  while (next_node && next_node != acpi_gbl_root_node) {

  if (next_node != node) {

深度解读

1

变更摘要

在 acpi_ns_build_normalized_path() 构建规范化路径时校验 namespace node 是否仍然有效,防止已被释放的节点被访问导致 use-after-free。

2

问题是怎么来的

acpi_ns_build_normalized_path() 沿 namespace 树从子节点向上遍历到根节点,拼接完整路径名。如果某个中间节点在并发操作中被释放,继续访问就会产生 use-after-free 漏洞。

3

代码在改什么

在遍历过程中增加节点有效性检查,验证节点指针指向的内存仍然合法。当发现节点无效时立即停止遍历并返回错误,避免继续访问已释放的内存。

4

为什么要这样改

UAF 是高危安全漏洞,可被利用执行任意代码或导致内核崩溃。命名空间树在设备热插拔等场景下会动态修改,必须确保遍历路径上的节点有效性。

PATCH #09 · ACPI · OTHER

ACPICA: validate handler object type in two places

ikaros · c5296da2d516

PATCH DIFF

files changed

commit c5296da2d516707862f8a2dbb4b515f777e5294f Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:03:26 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 3 行)

diff --git a/drivers/acpi/acpica/evhandler.c b/drivers/acpi/acpica/evhandler.c

index 5a35dae945e2..f16c1148e602 100644

--- a/drivers/acpi/acpica/evhandler.c

+++ b/drivers/acpi/acpica/evhandler.c

@@ -130,6 +130,14 @@ acpi_ev_has_default_handler(struct acpi_namespace_node *node,

  /* Walk the linked list of handlers for this object */

  while (handler_obj) {

+

+ /* Validate handler object type before accessing fields */

+

+ if (handler_obj->common.type !=

+    ACPI_TYPE_LOCAL_ADDRESS_HANDLER) {

+ break;

+ }

+

  if (handler_obj->address_space.space_id == space_id) {

  if (handler_obj->address_space.handler_flags &

     ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) {

@@ -292,6 +300,9 @@ union acpi_operand_object *acpi_ev_find_region_handler(acpi_adr_space_type

  /* Walk the handler list for this device */

  while (handler_obj) {

+ if (handler_obj->common.type != ACPI_TYPE_LOCAL_ADDRESS_HANDLER) {

+ break;

+ }

── 以下省略 3 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

在 acpi_ev_has_default_handler() 和 acpi_ev_find_region_handler() 中增加 handler 对象类型校验,确保操作的对象类型与预期一致。

2

问题是怎么来的

这两个函数在事件处理子系统中查找和验证地址空间 handler。如果 handler 引用的对象类型不符合预期(例如被替换为其他类型),后续按错误类型访问对象字段会导致类型混淆。

3

代码在改什么

在 acpi_ev_has_default_handler() 和 acpi_ev_find_region_handler() 中增加对象类型字段检查,当检测到类型不匹配时跳过该 handler 并返回错误,而非按错误类型继续操作。

4

为什么要这样改

类型混淆可导致通过错误类型的字段偏移访问到非预期的内存数据,是潜在的安全漏洞。在使用 handler 对象前验证类型是防御性编程的基本要求。

PATCH #10 · ACPI · REFACTOR

ACPICA: Improve argument parsing in acpi_ps_get_next_simple_arg()

ikaros · 27d27e75ecb7

PATCH DIFF

files changed

commit 27d27e75ecb752a0b4da848c440bb3a88396ecba Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:02:49 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 100 行)

diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c

index 3526ea109414..064652d11d9a 100644

--- a/drivers/acpi/acpica/psargs.c

+++ b/drivers/acpi/acpica/psargs.c

@@ -384,6 +384,8 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,

  u32 length;

  u16 opcode;

  u8 *aml = parser_state->aml;

+ u32 remaining = (u32)ACPI_PTR_DIFF(parser_state->aml_end, aml);

+ u64 partial_value;

  ACPI_FUNCTION_TRACE_U32(ps_get_next_simple_arg, arg_type);

@@ -393,8 +395,13 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,

  /* Get 1 byte from the AML stream */

  opcode = AML_BYTE_OP;

- arg->common.value.integer = (u64) *aml;

- length = 1;

+ if (remaining >= 1) {

+ arg->common.value.integer = (u64)*aml;

+ length = 1;

+ } else {

+ arg->common.value.integer = 0;

+ length = 0;

+ }

── 以下省略 100 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

改进 acpi_ps_get_next_simple_arg() 对剩余 AML 字节流的解析逻辑,在数据不足时安全返回错误而非越界读取。

2

问题是怎么来的

acpi_ps_get_next_simple_arg() 从 AML 字节流中解析简单参数(整数、字符串等)。当 AML 数据不完整(如截断的 ACPI 表)时,函数可能读取超出缓冲区边界的数据。

3

代码在改什么

在参数解析前检查剩余 AML 字节数是否满足当前参数类型的最低长度要求,不足时返回 AE_AML_INVALID_PACKAGE_LENGTH 错误码,阻止越界访问。

4

为什么要这样改

AML 参数解析是 ACPI 方法执行的核心路径,每个操作码的参数都需要正确解析。缺少边界检查会使恶意或损坏的 ACPI 表触发越界读取,影响系统安全性。

PATCH #11 · ACPI · FIX

ACPICA: Fix integer overflow in acpi_ex_opcode_3A_1T_1R() (mid_op)

ikaros · 0e2021f49e64

PATCH DIFF

files changed

commit 0e2021f49e64b3c8a9aa880d0c62a218bfe147ce Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:02:06 2026 +0200

diff --git a/drivers/acpi/acpica/exoparg3.c b/drivers/acpi/acpica/exoparg3.c

index 2fc8070814e3..2790bf1a12e7 100644

--- a/drivers/acpi/acpica/exoparg3.c

+++ b/drivers/acpi/acpica/exoparg3.c

@@ -159,7 +159,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)

  /* Truncate request if larger than the actual String/Buffer */

- else if ((index + length) > operand[0]->string.length) {

+ else if ((index + length) > operand[0]->string.length || (index + length) < index) { /* Check for overflow */

  length =

     (acpi_size)operand[0]->string.length -

     (acpi_size)index;

深度解读

1

变更摘要

为 AML Mid 操作码(acpi_ex_opcode_3A_1T_1R)增加 Index + Length 的整数溢出检查,防止截断长度变为负数后传给 memcpy() 导致内存破坏。

2

问题是怎么来的

Mid 操作码从 Buffer/String 中截取子串,参数为 Index 和 Length。当 Index + Length 整数溢出(两者都接近 ULONG_MAX),截断长度 = TotalLength - Index 可能变为巨大值,memcpy() 使用该值作为 size 参数将导致缓冲区溢出。

3

代码在改什么

在执行 Index + Length 加法前先检测是否会发生溢出,若溢出则返回 AE_AML_NUMERIC_OVERFLOW 错误码,不再执行后续的截断计算和 memcpy() 操作。

4

为什么要这样改

整数溢出导致的 memcpy 负数 size 是严重的内存安全漏洞,可被恶意 ACPI 表利用破坏内核内存。提前检测溢出是最小代价的防御方案。

PATCH #12 · ACPI · FIX

ACPICA: Prevent adding invalid references

ikaros · 6e8c55e13a5e

PATCH DIFF

files changed

commit 6e8c55e13a5e3a9f38921d62924f18ceba3330eb Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:01:21 2026 +0200

diff --git a/drivers/acpi/acpica/utcopy.c b/drivers/acpi/acpica/utcopy.c

index 80458e70ac2b..9ecf5c3f49ba 100644

--- a/drivers/acpi/acpica/utcopy.c

+++ b/drivers/acpi/acpica/utcopy.c

@@ -731,7 +731,15 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,

  break;

  }

- acpi_ut_add_reference(source_desc->reference.object);

+ /*

+ * Local/Arg/Debug references do not have a valid Object pointer

+ * that can be referenced

+ */

+ if ((source_desc->reference.class != ACPI_REFCLASS_LOCAL) &&

+    (source_desc->reference.class != ACPI_REFCLASS_ARG) &&

+    (source_desc->reference.class != ACPI_REFCLASS_DEBUG)) {

+ acpi_ut_add_reference(source_desc->reference.object);

+ }

  break;

  case ACPI_TYPE_REGION:

深度解读

1

变更摘要

在 acpi_ut_copy_simple_object() 中阻止为 local、argument 和 debug 对象增加引用计数,避免引用计数泄漏。

2

问题是怎么来的

acpi_ut_copy_simple_object() 在复制 AML 对象时会增加引用计数。但 local、argument 和 debug 对象是临时对象,其生命周期由方法执行上下文管理,不应通过引用计数控制。为这些对象增加引用计数会导致方法结束后对象无法正确释放。

3

代码在改什么

在 acpi_ut_copy_simple_object() 中增加对象类型判断,当检测到对象为 local、argument 或 debug 类型时跳过引用计数增加操作,仅对普通对象执行 add_reference。

4

为什么要这样改

错误的引用计数导致对象无法被及时释放,长期运行的 ACPI 方法可能累积内存泄漏。阻止对临时对象的引用计数操作是正确的生命周期管理方式。

PATCH #13 · ACPI · FEAT

ACPICA: add boundary checks in acpi_ps_get_next_field()

ikaros · e15aa60de025

PATCH DIFF

files changed

commit e15aa60de0256d63df2331bf5a4bc4dd287504cd Author: ikaros <void0red@gmail.com> Date:   Wed May 27 20:00:39 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 23 行)

diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c

index 87d32fbba0a6..3526ea109414 100644

--- a/drivers/acpi/acpica/psargs.c

+++ b/drivers/acpi/acpica/psargs.c

@@ -491,6 +491,10 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state

  ASL_CV_CAPTURE_COMMENTS_ONLY(parser_state);

  aml = parser_state->aml;

+ if (aml >= parser_state->aml_end) {

+ return_PTR(NULL);

+ }

+

  /* Determine field type */

  switch (ACPI_GET8(parser_state->aml)) {

@@ -539,6 +543,11 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state

  /* Get the 4-character name */

+ if ((parser_state->aml + ACPI_NAMESEG_SIZE) >

+    parser_state->aml_end) {

+ acpi_ps_free_op(field);

+ return_PTR(NULL);

+ }

  ACPI_MOVE_32_TO_32(&name, parser_state->aml);

  acpi_ps_set_name(field, name);

── 以下省略 23 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

在 acpi_ps_get_next_field() 中添加 AML 流边界检查,防止 field 定义解析时越界访问。

2

问题是怎么来的

acpi_ps_get_next_field() 从 AML 字节流中解析 field 定义(如 Field、IndexField 等)。函数在读取 field 属性时,若未验证缓冲区边界,恶意或损坏的 ACPI 表可导致解析器越界读取。

3

代码在改什么

在 drivers/acpi/acpica/psargs.c 中的 field 属性读取点增加缓冲区剩余长度检查,不足时返回错误码而非继续读取越界数据。

4

为什么要这样改

Field 定义解析是 AML 解析器处理命名空间对象的关键步骤,边界检查确保即使面对畸形 ACPI 表也不会触发越界访问,是安全加固的重要一环。

PATCH #14 · ACPI · OTHER

ACPICA: validate byte_count in acpi_ps_get_next_package_length()

ikaros · d49c6ee08365

PATCH DIFF

files changed

commit d49c6ee08365a8596f639da46eb7e71752b0cd42 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 19:59:57 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 10 行)

diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c

index 6f6ae38ec044..87d32fbba0a6 100644

--- a/drivers/acpi/acpica/psargs.c

+++ b/drivers/acpi/acpica/psargs.c

@@ -48,6 +48,7 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)

  u32 package_length = 0;

  u32 byte_count;

  u8 byte_zero_mask = 0x3F; /* Default [0:5] */

+ u32 remaining;

  ACPI_FUNCTION_TRACE(ps_get_next_package_length);

@@ -55,7 +56,23 @@ acpi_ps_get_next_package_length(struct acpi_parse_state *parser_state)

  * Byte 0 bits [6:7] contain the number of additional bytes

  * used to encode the package length, either 0,1,2, or 3

  */

+

+ /* Check if we have at least one byte to read */

+ remaining = (u32)ACPI_PTR_DIFF(parser_state->aml_end, aml);

+ if (remaining == 0) {

+ return_UINT32(0);

+ }

+

  byte_count = (aml[0] >> 6);

+

+ /* Validate byte_count and ensure we have enough bytes to read */

── 以下省略 10 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

校验 acpi_ps_get_next_package_length() 中 byte_count 字段的合法性,防止非法 package length 编码导致后续解析越界。

2

问题是怎么来的

Package length 是 AML 编码中的变长字段,byte_count 指定后续有多少字节表示长度值。若 byte_count 不合法(过大或为 0),后续按此值读取的字节数会超出缓冲区或产生错误的长度计算。

3

代码在改什么

在 acpi_ps_get_next_package_length() 中增加 byte_count 的合法性校验,检查其是否在 ACPI 规范允许的有效范围内,不合法时返回 AE_AML_INVALID_PACKAGE_LENGTH。

4

为什么要这样改

Package length 是 AML 解析的基础结构,几乎所有 AML 对象都依赖此编码。非法的 byte_count 可导致解析器位置计算错误,进而引发连锁的越界访问。

PATCH #15 · ACPI · FIX

ACPICA: Fix use-after-free in acpi_ds_terminate_control_method()

ikaros · 945e87267cfd

PATCH DIFF

files changed

commit 945e87267cfd90937b3c637f87324cbb56998b72 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 19:59:12 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 35 行)

diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c

index 45ec32e81903..08bfe8303083 100644

--- a/drivers/acpi/acpica/dsmethod.c

+++ b/drivers/acpi/acpica/dsmethod.c

@@ -705,6 +705,8 @@ void

 acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,

  struct acpi_walk_state *walk_state)

 {

+ u32 i;

+ struct acpi_namespace_node *ref_node;

  ACPI_FUNCTION_TRACE_PTR(ds_terminate_control_method, walk_state);

@@ -715,6 +717,47 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,

  }

  if (walk_state) {

+ /*

+ * Check if the return value is a ref_of reference to a method local

+ * or argument. If so, clear the reference to avoid use-after-free

+ * when the walk state is deleted.

+ */

+ if (walk_state->return_desc &&

+    (walk_state->return_desc->common.type ==

+     ACPI_TYPE_LOCAL_REFERENCE)

+    && (walk_state->return_desc->reference.class ==

── 以下省略 35 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

在 acpi_ds_terminate_control_method() 控制方法执行结束时,主动清理对 method locals 和 arguments 中对象的引用,防止后续代码访问已释放内存。

2

问题是怎么来的

AML 控制方法执行期间创建 local0-local7 和 arg0-arg6 等临时变量。方法终止时这些变量的底层对象可能被释放,但如果引用计数未正确递减或存在遗留指针,后续代码仍可能通过悬空引用访问已释放的内存。

3

代码在改什么

在 drivers/acpi/acpica/dsmethod.c 的 acpi_ds_terminate_control_method() 中,在方法终止时显式清理所有 local 和 argument 槽位的引用,确保无悬空指针残留。

4

为什么要这样改

UAF 是高危安全漏洞,控制方法终止后的临时对象释放是典型的 UAF 触发点。主动清理引用可确保生命周期管理正确,阻断通过构造嵌套控制方法触发 UAF 的攻击路径。

PATCH #16 · ACPI · FIX

ACPICA: fix I2C LVR item count in the conversion table

Akhil R · 2543fbb21642

PATCH DIFF

files changed

commit 2543fbb21642f740288e3c292cab03cd611f35a4 Author: Akhil R <akhilrajeev@nvidia.com> Date:   Wed May 27 19:58:29 2026 +0200

diff --git a/drivers/acpi/acpica/rsserial.c b/drivers/acpi/acpica/rsserial.c

index 7d7ee3af7272..5ab41e9b9039 100644

--- a/drivers/acpi/acpica/rsserial.c

+++ b/drivers/acpi/acpica/rsserial.c

@@ -394,7 +394,7 @@ struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[18] = {

  /* Read LVR from Type Specific Flags, bits[15:8] */

  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.i2c_serial_bus.lvr),

  AML_OFFSET(i2c_serial_bus.type_specific_flags) + 1,

- 0},

+ 1},

  {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed),

  AML_OFFSET(i2c_serial_bus.connection_speed),

深度解读

1

变更摘要

修复 acpi_rsconvert_info 结构体中 ACPI_RSC_MOVE8 操作的 Value 字段含义误用:Value 是 item count(操作数量),不是 bit position(位偏移)。将 I2C LVR 条目从 0 修正为 1。

2

问题是怎么来的

struct acpi_rsconvert_info 的 Value 字段对 ACPI_RSC_MOVE8 类型表示操作数量,但 I2C LVR 转换表条目错误地写成了 0。此前转换碰巧正确是因为 item_count 在表条目间不会重置,前一个条目的 count 值残留生效。

3

代码在改什么

在 drivers/acpi/acpica/rsio.c 的 I2C LVR 转换表条目中,将 ACPI_RSC_MOVE8 行的 Value 字段从 0 改为 1,表示执行 1 次 MOVE8 操作。

4

为什么要这样改

虽然当前代码碰巧正确运行,但依赖隐式状态是严重的维护隐患。一旦代码重构改变表遍历顺序,此 bug 将立即暴露导致 I2C LVR 资源转换失败。显式设置正确值消除隐式依赖。

PATCH #17 · ACPI · REFACTOR

ACPICA: Mention the LVR bits

Akhil R · 53a3a7723c9e

PATCH DIFF

files changed

commit 53a3a7723c9eac56c47003291b52f106734eb438 Author: Akhil R <akhilrajeev@nvidia.com> Date:   Wed May 27 19:57:52 2026 +0200

diff --git a/drivers/acpi/acpica/rsserial.c b/drivers/acpi/acpica/rsserial.c

index 1119c64795a7..7d7ee3af7272 100644

--- a/drivers/acpi/acpica/rsserial.c

+++ b/drivers/acpi/acpica/rsserial.c

@@ -391,6 +391,7 @@ struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[18] = {

  AML_OFFSET(i2c_serial_bus.type_specific_flags),

  0},

+ /* Read LVR from Type Specific Flags, bits[15:8] */

  {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.i2c_serial_bus.lvr),

  AML_OFFSET(i2c_serial_bus.type_specific_flags) + 1,

  0},

深度解读

1

变更摘要

在 type_specific_flag 的注释中标注 LVR (Low Voltage Range) 字节的位置信息,提高代码可读性和可维护性。

2

问题是怎么来的

I2C LVR 资源描述符的 type_specific_flag 字段含义在代码中缺少注释,后续开发者难以快速理解该字节在 ACPI 规范中的对应位置和语义。

3

代码在改什么

在 drivers/acpi/acpica/ 相关文件中为 type_specific_flag 添加注释,说明 LVR 字节在 I2C Serial Bus 资源描述符中的位置及含义。

4

为什么要这样改

良好的注释是代码维护的基础,特别是对 ACPI 规范中的资源描述符格式。标注 LVR 位置信息可帮助后续开发者快速定位和理解 I2C 资源转换逻辑。

PATCH #18 · ACPI · REFACTOR

ACPICA: Change LVR to 8 bit value

Akhil R · d364d76f3d0c

PATCH DIFF

files changed

commit d364d76f3d0ccba6c8b0e3b0df348b4e86a0a72b Author: Akhil R <akhilrajeev@nvidia.com> Date:   Wed May 27 19:57:13 2026 +0200

diff --git a/drivers/acpi/acpica/rsserial.c b/drivers/acpi/acpica/rsserial.c

index 3e4a1fe81ef6..1119c64795a7 100644

--- a/drivers/acpi/acpica/rsserial.c

+++ b/drivers/acpi/acpica/rsserial.c

@@ -391,7 +391,7 @@ struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[18] = {

  AML_OFFSET(i2c_serial_bus.type_specific_flags),

  0},

- {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.lvr),

+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET(data.i2c_serial_bus.lvr),

  AML_OFFSET(i2c_serial_bus.type_specific_flags) + 1,

  0},

深度解读

1

变更摘要

将 acpi_rs_convert_i2c_serial_bus[] 表中 LVR 资源描述符的相关字段改为 8 位格式,匹配 ACPI 规范定义。

2

问题是怎么来的

LVR (Low Voltage Range) 是 I2C Serial Bus 资源描述符中的 8 位字段,但转换表中原先使用了不匹配的位宽定义,可能导致资源描述符转换时数据宽度不正确。

3

代码在改什么

修改 drivers/acpi/acpica/rsio.c 中 acpi_rs_convert_i2c_serial_bus[] 表的 LVR 条目,将数据类型改为 8 位格式(MOVE8),确保转换时读写宽度与 ACPI 规范一致。

4

为什么要这样改

ACPI 规范明确定义 LVR 为 8 位值,转换表必须严格匹配。使用不匹配的位宽会导致资源描述符转换错误,影响 I2C 设备的低电压范围功能识别。

PATCH #19 · ACPI · OTHER

ACPICA: Fetch LVR I2C resource descriptor

Akhil R · 468adc6b1ff8

PATCH DIFF

files changed

commit 468adc6b1ff83431644cf002a1850010d7ff32dd Author: Akhil R <akhilrajeev@nvidia.com> Date:   Wed May 27 19:56:38 2026 +0200

diff --git a/drivers/acpi/acpica/rsserial.c b/drivers/acpi/acpica/rsserial.c

index 279bfa27da94..3e4a1fe81ef6 100644

--- a/drivers/acpi/acpica/rsserial.c

+++ b/drivers/acpi/acpica/rsserial.c

@@ -315,7 +315,7 @@ struct acpi_rsconvert_info acpi_rs_convert_csi2_serial_bus[14] = {

  *

  ******************************************************************************/

-struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[17] = {

+struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[18] = {

  {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_SERIAL_BUS,

  ACPI_RS_SIZE(struct acpi_resource_i2c_serialbus),

  ACPI_RSC_TABLE_SIZE(acpi_rs_convert_i2c_serial_bus)},

@@ -391,6 +391,10 @@ struct acpi_rsconvert_info acpi_rs_convert_i2c_serial_bus[17] = {

  AML_OFFSET(i2c_serial_bus.type_specific_flags),

  0},

+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET(data.i2c_serial_bus.lvr),

+ AML_OFFSET(i2c_serial_bus.type_specific_flags) + 1,

+ 0},

+

  {ACPI_RSC_MOVE32, ACPI_RS_OFFSET(data.i2c_serial_bus.connection_speed),

  AML_OFFSET(i2c_serial_bus.connection_speed),

  1},

深度解读

1

变更摘要

在 acpi_rs_convert_i2c_serial_bus[] 资源转换表中新增 LVR (Low Voltage Range) I2C 资源描述符的解析支持条目。

2

问题是怎么来的

ACPI 规范在 I2C Serial Bus 资源描述符中定义了 LVR 字段用于标识低电压范围支持,但 ACPICA 的资源转换表此前缺少该字段的处理条目,导致 LVR 信息在 AML 资源与 Linux 内部表示间转换时丢失。

3

代码在改什么

在 drivers/acpi/acpica/rsio.c 的 acpi_rs_convert_i2c_serial_bus[] 数组中添加 LVR 对应的转换条目,使 ACPICA 能正确解析和生成包含 LVR 信息的 I2C 资源描述符。

4

为什么要这样改

LVR 是 I2C 设备低电压运行能力的标识,缺少此字段的解析会导致内核无法识别支持低电压模式的 I2C 设备,影响电源管理优化和设备兼容性。

PATCH #20 · ACPI · FIX

ACPICA: Fix FADT 32/64X length mismatch warning

Abdelkader Boudih · 15a07a5a96d5

PATCH DIFF

files changed

commit 15a07a5a96d5c813f601f95a5baaf901c6112789 Author: Abdelkader Boudih <oss@seuros.com> Date:   Wed May 27 19:55:21 2026 +0200

diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c

index c6658b2f3027..80d3a39a82d7 100644

--- a/drivers/acpi/acpica/tbfadt.c

+++ b/drivers/acpi/acpica/tbfadt.c

@@ -553,8 +553,11 @@ static void acpi_tb_convert_fadt(void)

  * Note: If the legacy length field is > 0xFF bits, ignore

  * this check. (GPE registers can be larger than the

  * 64-bit GAS structure can accommodate, 0xFF bits).

+ * Also skip if bit_width is 0, indicating the 64-bit field

+ * was not populated - legacy length will be used instead.

  */

  if ((ACPI_MUL_8(length) <= ACPI_UINT8_MAX) &&

+    (address64->bit_width != 0) &&

     (address64->bit_width !=

      ACPI_MUL_8(length))) {

  ACPI_BIOS_WARNING((AE_INFO,

深度解读

1

变更摘要

修复 ACPICA 对 FADT 表中 gpe0_block/gpe1_block 等字段的长度校验逻辑:当 64 位扩展地址已设置但 bit_width 为 0 时,ACPI 规范规定应使用传统 32 位字段长度,不应报 "32/64X length mismatch" 警告。

2

问题是怎么来的

FADT 表同时包含 32 位遗留地址字段和 64 位扩展地址字段。ACPICA 校验两者长度一致性,但当 64 位地址已设置且 bit_width=0 时,ACPI 规范明确表示应使用 32 位长度——这是合法固件行为,非错误。原始校验逻辑未考虑此例外,产生假阳性警告。

3

代码在改什么

在 FADT 校验逻辑中增加 bit_width==0 的特判:当 64 位地址存在但 bit_width 为 0 时,跳过长度不匹配警告。已在 FreeBSD 16.0-CURRENT 上实测验证。

4

为什么要这样改

假阳性警告会污染 dmesg 日志、干扰系统管理员判断真实 ACPI 问题。按 ACPI 规范正确处理 bit_width=0 的特殊情况,可消除 FreeBSD 等系统上的误报。

PATCH #21 · ACPI · FEAT

ACPICA: Add alias node support in namespace handling

ikaros · 8d7987340301

PATCH DIFF

files changed

commit 8d79873403017dd9f29ec17fa69ba21f72ce4ff8 Author: ikaros <void0red@gmail.com> Date:   Wed May 27 19:53:58 2026 +0200

&#x26A0; 变更较大,下文仅展示部分 diff(已省略 3 行)

diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h

index f98640086f4e..cbf09fb08d35 100644

--- a/drivers/acpi/acpica/aclocal.h

+++ b/drivers/acpi/acpica/aclocal.h

@@ -169,6 +169,7 @@ struct acpi_namespace_node {

 #define ANOBJ_IS_EXTERNAL               0x08 /* iASL only: This object created via External() */

 #define ANOBJ_METHOD_NO_RETVAL          0x10 /* iASL only: Method has no return value */

 #define ANOBJ_METHOD_SOME_NO_RETVAL     0x20 /* iASL only: Method has at least one return value */

+#define ANOBJ_IS_ALIAS                  0x40 /* iASL only: Node is an alias to another node */

 #define ANOBJ_IS_REFERENCED             0x80 /* iASL only: Object was referenced */

 /* Internal ACPI table management - master table list */

diff --git a/drivers/acpi/acpica/nsobject.c b/drivers/acpi/acpica/nsobject.c

index 79d86da1c892..a4ccacecca53 100644

--- a/drivers/acpi/acpica/nsobject.c

+++ b/drivers/acpi/acpica/nsobject.c

@@ -173,6 +173,12 @@ void acpi_ns_detach_object(struct acpi_namespace_node *node)

  obj_desc = node->object;

+ /* Alias nodes point directly to other namespace nodes; skip teardown */

+ if (node->flags & ANOBJ_IS_ALIAS) {

+ node->object = NULL;

+ return_VOID;

+ }

+

── 以下省略 3 行 diff,完整 patch 请在内核 git 查看 ──

深度解读

1

变更摘要

为 ACPICA 命名空间子系统添加 Alias 节点的完整生命周期支持:创建时标记 ANOBJ_IS_ALIAS,销毁时跳过 alias 的 object detach。

2

问题是怎么来的

ACPI 命名空间支持 Alias 定义(一个节点指向另一个节点的引用)。Alias 节点不拥有独立的 ACPI 对象,但 ACPICA 此前缺少完整的 Alias 生命周期管理,在命名空间销毁时 Alias 节点会走标准 object detach 流程,尝试释放它并不拥有的对象。

3

代码在改什么

修改三处:(1) ld_namespace2_begin() 在加载 Alias 定义时设置 ANOBJ_IS_ALIAS 标志位;(2) acpi_ns_detach_object() 检测该标志后跳过 object 分离和释放;(3) aclocal.h 中定义 ANOBJ_IS_ALIAS 常量。

4

为什么要这样改

Alias 节点不拥有底层对象,对其执行标准 detach 会导致 double-free 或 UAF。通过标志位区分 Alias 和普通节点是最简洁的方案,两者共享数据结构只需在关键路径上区分行为。

PATCH #22 · ACPI · FIX

ACPICA: Fix condition check in acpi_ps_parse_loop()

ikaros · 8de27e2d83c0

PATCH DIFF

files changed

commit 8de27e2d83c0d07ae9443c6304575b0609394bfd Author: ikaros <void0red@gmail.com> Date:   Wed May 27 19:53:12 2026 +0200

diff --git a/drivers/acpi/acpica/psloop.c b/drivers/acpi/acpica/psloop.c

index c989cadf271c..35111ff2526b 100644

--- a/drivers/acpi/acpica/psloop.c

+++ b/drivers/acpi/acpica/psloop.c

@@ -425,7 +425,10 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)

  ACPI_ERROR((AE_INFO,

     "Skipping While/If block"));

- if (*walk_state->aml == AML_ELSE_OP) {

+ if ((walk_state->aml <

+     parser_state->aml_end)

+    && (*walk_state->aml ==

+ AML_ELSE_OP)) {

  ACPI_ERROR((AE_INFO,

     "Skipping Else block"));

  walk_state->parser_state.aml =

深度解读

1

变更摘要

修复 acpi_ps_parse_loop() 中对 AML_ELSE_OP 的条件判断逻辑,修正后防止 ELSE 分支解析时发生越界访问。

2

问题是怎么来的

acpi_ps_parse_loop() 是 AML 解析器的主循环,处理 if-else 结构时需要在找到 ELSE 操作码后正确计算 IF 分支结束位置并跳转到 ELSE 分支开始位置。条件判断错误可能导致偏移计算不正确或跳过必要的边界检查。

3

代码在改什么

修正 drivers/acpi/acpica/psloop.c 中 AML_ELSE_OP 处理路径的条件表达式,确保 ELSE 分支的偏移量计算正确且边界检查不被跳过。

4

为什么要这样改

if-else 是 AML 中最常用的控制流结构,解析器的主循环条件判断错误会导致解析位置偏移异常,使后续所有操作码解析失败甚至越界访问。这是影响所有包含条件分支的 ACPI 方法的关键修复。

PATCH #23 · ACPI · OTHER

ACPI: video: Do not initialise device_id_scheme directly

Jean-Ralph Aviles · c01576a7f5a0

PATCH DIFF

files changed

commit c01576a7f5a0f4501cc9db060335b4b5ab281b36 Author: Jean-Ralph Aviles <jeanralph.aviles@gmail.com> Date:   Sat May 9 19:47:20 2026 -0700

diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c

index 05793ddef787..e8880a2113cb 100644

--- a/drivers/acpi/acpi_video.c

+++ b/drivers/acpi/acpi_video.c

@@ -63,7 +63,7 @@ MODULE_PARM_DESC(hw_changes_brightness,

  * Whether the struct acpi_video_device_attrib::device_id_scheme bit should be

  * assumed even if not actually set.

  */

-static bool device_id_scheme = false;

+static bool device_id_scheme;

 module_param(device_id_scheme, bool, 0444);

 static int only_lcd;

深度解读

1

变更摘要

移除 ACPI video 驱动中 device_id_scheme 布尔变量的冗余初始化(C 语言标准保证静态/BSS 变量自动初始化为 false)。

2

问题是怎么来的

device_id_scheme 是静态局部变量,C 语言标准保证未显式初始化的静态变量自动置零(对 bool 即 false)。显式赋值为 false 是不必要的冗余代码。

3

代码在改什么

在 drivers/acpi/video_detect.c 中删除 device_id_scheme 的 "= false" 初始化,仅保留变量声明。这是一个纯代码整洁性改进。

4

为什么要这样改

内核编码规范(checkpatch)建议避免对静态变量进行冗余初始化。移除此初始化使代码更简洁,符合内核代码风格,不影响任何运行时行为。

linux-pm-ribao · PM Daily

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 06:40:24 HTTP/2.0 GET : https://f.mffb.com.cn/a/497158.html
  2. 运行时间 : 0.114841s [ 吞吐率:8.71req/s ] 内存消耗:4,642.49kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=323341dcf335949680c67fcb7faa9bb4
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000656s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000777s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000328s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000288s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000477s ]
  6. SELECT * FROM `set` [ RunTime:0.000193s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000569s ]
  8. SELECT * FROM `article` WHERE `id` = 497158 LIMIT 1 [ RunTime:0.003905s ]
  9. UPDATE `article` SET `lasttime` = 1783032024 WHERE `id` = 497158 [ RunTime:0.018477s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 67 LIMIT 1 [ RunTime:0.004808s ]
  11. SELECT * FROM `article` WHERE `id` < 497158 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000642s ]
  12. SELECT * FROM `article` WHERE `id` > 497158 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000532s ]
  13. SELECT * FROM `article` WHERE `id` < 497158 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001420s ]
  14. SELECT * FROM `article` WHERE `id` < 497158 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001587s ]
  15. SELECT * FROM `article` WHERE `id` < 497158 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.009709s ]
0.116507s