Skip to content

[fit] Critical: Parameter-Applier count mismatch in HttpInvocationHandler causes potential ArrayIndexOutOfBoundsException #328

@CodeCasterX

Description

@CodeCasterX

Bug 概述

HttpInvocationHandler 中参数数量与应用器数量不匹配,导致潜在的数组越界风险

问题描述

发现过程

在PR #325 实现 HTTP 客户端认证功能时,发现了一个潜在的架构问题:

  • HttpInvocationHandler.invoke() 方法期望参数数量与应用器数量严格一一对应
  • 新增的静态鉴权应用器破坏了这个对应关系
  • 理论上应该触发 ArrayIndexOutOfBoundsException,但测试暂时没有失败

问题位置

1. HttpInvocationHandler.java 第69-71行

if (args.length != appliers.size()) {
    throw new HttpClientException("Args length not equals to appliers size.");
}

2. HttpInvocationHandler.java 第81-83行

for (int i = 0; i < appliers.size(); i++) {
    appliers.get(i).apply(requestBuilder, args[i]); // 潜在数组越界
}

3. AnnotationParser.java 添加额外应用器

  • 第110-112行:添加类级别鉴权应用器
  • 第125-126行:添加方法级别鉴权应用器

具体分析

问题场景1:无参数方法

@RequestAuth(type = AuthType.API_KEY, name = "X-Service-Key", value = "service-key") // 类级别
public interface TestClient {
    @RequestAuth(type = AuthType.BEARER, value = "bearer-token") // 方法级别
    @GetMapping("/test")
    String test(); // 0个参数
}

应用器分析:

  • 类级别鉴权应用器:1个
  • 方法级别鉴权应用器:1个
  • 参数应用器:0个
  • 总计:2个应用器,但参数数量为0

预期行为:

  1. 第69行检查:0 != 2 → 应该抛出 HttpClientException
  2. 如果通过检查,第82行:args[0] → 应该抛出 ArrayIndexOutOfBoundsException

问题场景2:有参数方法

@RequestAuth(type = AuthType.API_KEY, name = "X-Service-Key", value = "service-key") // 类级别
public interface TestClient {
    @GetMapping("/test")
    String test(@RequestAuth(type = AuthType.BEARER) String token); // 1个参数,带鉴权注解
}

应用器分析:

  • 类级别鉴权应用器:1个
  • 方法级别鉴权应用器:0个
  • 参数应用器:1个(包含@requestauth的参数)
  • 总计:2个应用器,但参数数量为1

预期行为:

  1. 第69行检查:1 != 2 → 应该抛出 HttpClientException
  2. 如果通过检查,第82行当i=1时:args[1] → 应该抛出 ArrayIndexOutOfBoundsException

当前状态

  • 新功能的测试用例包含了上述场景
  • 测试执行时没有报错
  • 功能表现正常

重现步骤

  1. 检出分支 fit-enhancement-http-client2
  2. 运行测试:
    cd examples/fit-example/07-http-client-proxy
    mvn test
  3. 或启动服务器并运行测试脚本:
    mvn spring-boot:run -pl plugin-http-server &
    ./run_tests.sh

预期行为

根据 HttpInvocationHandler 的设计,应该在参数数量与应用器数量不匹配时抛出异常。

实际行为

测试正常执行,没有抛出预期的异常。

影响分析

潜在风险

  1. 数组越界风险:如果问题未被检测到,可能在特定条件下触发运行时异常
  2. 架构不一致:破坏了参数-应用器一一对应的设计原则
  3. 维护困难:未来添加新功能时可能遇到同样的问题
  4. 测试盲区:当前测试可能没有覆盖到真实的执行路径

紧急程度

  • 优先级:高
  • 原因:涉及核心架构的一致性和运行时稳定性

需要调查的问题

  1. 根因分析:为什么测试没有触发预期的异常?

    • 是否存在其他代码路径绕过了检查?
    • 是否有异常被捕获并忽略?
    • 是否存在JVM级别的保护机制?
  2. 影响范围:这个问题是否影响其他现有功能?

  3. 修复策略:如何在不破坏现有功能的前提下修复这个问题?

环境信息

  • 分支:fit-enhancement-http-client2
  • 相关文件
    • HttpInvocationHandler.java
    • AnnotationParser.java
    • StaticAuthApplier.java
  • 测试用例TestAuthClient.java

标签建议

  • type: bug
  • in: fit
  • priority: high
  • theme: architecture

Metadata

Metadata

Assignees

Labels

in: fitIssues in FIT modulestype: bugA general bug

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions