forked from 1b-agent/opencadstudio-upstream
Bound typed counts and values that could crash the editor
- ARRAYRECT, ARRAYPOLAR, ARRAYPATH, ARRAY3D and COPY Array reject item counts above 100,000 (checked as a product of every dimension) and keep the prompt open. Unbounded counts allocated one transform per item and aborted on allocation failure. Stored defaults are clamped as well. - EXPLODE leaves a MINSERT above the same limit intact instead of materializing every cell. - Typed lengths and angles reject non-finite values and magnitudes above 1e15; SCALE rejects a non-finite factor. - Zero-radius FILLET compares candidate intersections with total_cmp and rejects non-finite results; partial_cmp().unwrap() panicked on NaN. - SOLID falls back to a minimal kernel tolerance when its corners' extent overflows, since Tolerance::new panics on infinity. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
38aa2ee34d
commit
a3d65e2fc8
7 files changed
+223
-15
No files matched your search
@@ -88,6 +88,16 @@ pub fn explode_entity(entity: &EntityType, document: &CadDocument) -> Vec<Entity
|
||||
EntityType::Polyline2D(p) => explode_polyline2d(p),
|
||||
EntityType::Polyline(p) => explode_polyline(p),
|
||||
EntityType::Polyline3D(p) => explode_polyline3d(p),
|
||||
// A MINSERT expands to one copy of the block per cell; leave arrays
|
||||
// too large to materialize intact instead of exhausting memory.
|
||||
EntityType::Insert(ins)
|
||||
if !super::array::array_items_within_limit(&[
|
||||
ins.row_count as u64,
|
||||
ins.column_count as u64,
|
||||
]) =>
|
||||
{
|
||||
vec![]
|
||||
}
|
||||
EntityType::Insert(ins) => ins
|
||||
.explode_from_document(document)
|
||||
.into_iter()
|
||||
@@ -1478,6 +1488,18 @@ mod tests {
|
||||
use super::*;
|
||||
use acadrust::entities::DimensionLinear;
|
||||
|
||||
#[test]
|
||||
fn minsert_too_large_to_materialize_is_left_intact() {
|
||||
let mut doc = CadDocument::new();
|
||||
let mut block = acadrust::tables::BlockRecord::new("B1");
|
||||
block.handle = doc.allocate_handle();
|
||||
doc.block_records.add(block).unwrap();
|
||||
let mut insert = acadrust::entities::Insert::new("B1", Vector3::new(0.0, 0.0, 0.0));
|
||||
insert.row_count = u16::MAX;
|
||||
insert.column_count = u16::MAX;
|
||||
assert!(explode_entity(&EntityType::Insert(insert), &doc).is_empty());
|
||||
}
|
||||
|
||||
/// A dimension created without a geometry block gets a real `*D` block on
|
||||
/// bake, its `block_name` resolves to that block, and a second bake is a
|
||||
/// no-op (already has a valid block).
|
||||
|
||||
Reference in new issue
Block a user