@@ -18,6 +18,7 @@ use pyth_sdk::{
18
18
} ;
19
19
use solana_program:: clock:: Clock ;
20
20
use solana_program:: pubkey:: Pubkey ;
21
+ use std:: cmp:: min;
21
22
use std:: mem:: size_of;
22
23
23
24
pub use pyth_sdk:: {
@@ -192,7 +193,10 @@ pub struct ProductAccount {
192
193
impl ProductAccount {
193
194
pub fn iter ( & self ) -> AttributeIter {
194
195
AttributeIter {
195
- attrs : & self . attr [ ..( self . size as usize - PROD_HDR_SIZE ) ] ,
196
+ attrs : & self . attr [ ..min (
197
+ ( self . size as usize ) . saturating_sub ( PROD_HDR_SIZE ) ,
198
+ PROD_ATTR_SIZE ,
199
+ ) ] ,
196
200
}
197
201
}
198
202
}
@@ -321,7 +325,8 @@ where
321
325
/// space for future derived values
322
326
pub drv2 : u8 ,
323
327
/// space for future derived values
324
- pub drv3 : u16 ,
328
+ pub drv31 : u8 ,
329
+ pub drv32 : u8 ,
325
330
/// space for future derived values
326
331
pub drv4 : u32 ,
327
332
/// product account key
@@ -366,7 +371,8 @@ where
366
371
timestamp : Default :: default ( ) ,
367
372
min_pub : Default :: default ( ) ,
368
373
drv2 : Default :: default ( ) ,
369
- drv3 : Default :: default ( ) ,
374
+ drv31 : Default :: default ( ) ,
375
+ drv32 : Default :: default ( ) ,
370
376
drv4 : Default :: default ( ) ,
371
377
prod : Default :: default ( ) ,
372
378
next : Default :: default ( ) ,
@@ -574,21 +580,21 @@ impl<'a> Iterator for AttributeIter<'a> {
574
580
if self . attrs . is_empty ( ) {
575
581
return None ;
576
582
}
577
- let ( key, data) = get_attr_str ( self . attrs ) ;
578
- let ( val, data) = get_attr_str ( data) ;
583
+ let ( key, data) = get_attr_str ( self . attrs ) ? ;
584
+ let ( val, data) = get_attr_str ( data) ? ;
579
585
self . attrs = data;
580
586
Some ( ( key, val) )
581
587
}
582
588
}
583
589
584
- fn get_attr_str ( buf : & [ u8 ] ) -> ( & str , & [ u8 ] ) {
590
+ fn get_attr_str ( buf : & [ u8 ] ) -> Option < ( & str , & [ u8 ] ) > {
585
591
if buf. is_empty ( ) {
586
- return ( "" , & [ ] ) ;
592
+ return Some ( ( "" , & [ ] ) ) ;
587
593
}
588
594
let len = buf[ 0 ] as usize ;
589
- let str = std:: str:: from_utf8 ( & buf[ 1 ..len + 1 ] ) . expect ( "attr should be ascii or utf-8" ) ;
590
- let remaining_buf = & buf[ len + 1 ..] ;
591
- ( str, remaining_buf)
595
+ let str = std:: str:: from_utf8 ( & buf[ 1 ..len + 1 ] ) . ok ( ) ? ;
596
+ let remaining_buf = & buf. get ( len + 1 ..) ? ;
597
+ Some ( ( str, remaining_buf) )
592
598
}
593
599
594
600
#[ cfg( test) ]
0 commit comments