@@ -56,11 +56,27 @@ function packAxis(view: DataView, offset: number, axis: SizingAxis): number {
5656 return o ;
5757}
5858
59- function packString ( view : DataView , bytes : Uint8Array , o : number ) : number {
59+ function packString (
60+ view : DataView ,
61+ bytes : Uint8Array ,
62+ o : number ,
63+ end : number ,
64+ context : string ,
65+ ) : number {
66+ let paddedLength = Math . ceil ( bytes . length / 4 ) * 4 ;
67+ let next = o + 4 + paddedLength ;
68+ if ( next > end ) {
69+ throw new RangeError (
70+ `clayterm transfer buffer capacity exceeded while packing ${ context } ` +
71+ `(${ next } byte offset, ${ end } byte limit). ` +
72+ `Render a smaller visible slice or reduce frame content.` ,
73+ ) ;
74+ }
75+
6076 view . setUint32 ( o , bytes . length , true ) ;
6177 o += 4 ;
6278 new Uint8Array ( view . buffer ) . set ( bytes , o ) ;
63- o += Math . ceil ( bytes . length / 4 ) * 4 ;
79+ o += paddedLength ;
6480 return o ;
6581}
6682
@@ -86,7 +102,7 @@ export function pack(
86102 o += 4 ;
87103
88104 let bytes = encoder . encode ( op . id ) ;
89- o = packString ( view , bytes , o ) ;
105+ o = packString ( view , bytes , o , end , "element id" ) ;
90106
91107 let mask = 0 ;
92108 if ( op . layout ) mask |= PROP_LAYOUT ;
@@ -224,7 +240,7 @@ export function pack(
224240 o += 4 ;
225241
226242 let str = encoder . encode ( op . content ) ;
227- o = packString ( view , str , o ) ;
243+ o = packString ( view , str , o , end , "text content" ) ;
228244 break ;
229245 }
230246 }
0 commit comments