生成图片的 gridX/gridY 解析不再把超大整数截断成合法网格

- generate_image_grid_axis 原来用 `value as u32`,u64 直接截断:4294967297(2^32+1)会变成 1,随后 1..=32 的区间校验把这个巨大输入当成合法网格静默接受
- 改成 u32::try_from,超出 u32 的值直接落到 GridAxisNotInteger 拒绝分支,不再依赖截断后的值
- 补一条回归测试:gridX=4294967297 必须被拒绝,gridX=4/gridY=4 仍通过

验证:cargo test --bin genarrative-ai-game-creator-shell -- agent::direct_tool_bridge::tests::generate_image_grid_axis_rejects_values_beyond_u32 通过
This commit is contained in:
2026-10-01 14:00:03 +08:00
parent 28f6ddc7dc
commit 822e89bdc0
@@ -2850,7 +2850,8 @@ fn generate_image_grid_axis(
};
value
.as_u64()
.map(|value| Some(value as u32))
.and_then(|value| u32::try_from(value).ok())
.map(Some)
.ok_or(GenerateImageError::GridAxisNotInteger { axis })
}
@@ -4772,6 +4773,30 @@ mod tests {
.is_err());
}
#[test]
fn generate_image_grid_axis_rejects_values_beyond_u32() {
let error = match generate_image_input(&json!({
"prompt": "像素风图标集",
"kind": "icon-spritesheet",
"sliceMode": "grid",
"gridX": 4_294_967_297_u64,
"gridY": 1
})) {
Ok(_) => panic!("gridX 超过 u32 时不得截断成合法网格"),
Err(error) => error,
}
.to_user_msg();
assert!(error.contains("gridX"), "{error}");
assert!(generate_image_input(&json!({
"prompt": "像素风图标集",
"kind": "icon-spritesheet",
"sliceMode": "grid",
"gridX": 4,
"gridY": 4
}))
.is_ok());
}
#[test]
fn large_mcp_images_are_reduced_to_bounded_jpeg_previews() {
let image = image::RgbaImage::from_fn(1600, 1200, |x, y| {