@@ -295,7 +295,13 @@ const ACCOUNTTYPE_ACCOUNT: u8 = AccountType::Account as u8;
295
295
impl GenericTokenAccount for Account {
296
296
fn valid_account_data ( account_data : & [ u8 ] ) -> bool {
297
297
spl_token:: state:: Account :: valid_account_data ( account_data)
298
- || ACCOUNTTYPE_ACCOUNT == * account_data. get ( Account :: LEN ) . unwrap_or ( & 0 )
298
+ || ( account_data. len ( ) >= Account :: LEN
299
+ && account_data. len ( ) != Multisig :: LEN
300
+ && ACCOUNTTYPE_ACCOUNT
301
+ == * account_data
302
+ . get ( spl_token:: state:: Account :: get_packed_len ( ) )
303
+ . unwrap_or ( & ( AccountType :: Uninitialized as u8 ) )
304
+ && spl_token:: state:: is_initialized_account ( account_data) )
299
305
}
300
306
}
301
307
@@ -420,23 +426,45 @@ pub(crate) mod test {
420
426
let result = Account :: unpack_account_owner ( & src) ;
421
427
assert_eq ! ( result, Option :: None ) ;
422
428
423
- // The right account data size, unpack will return some key
424
- let src: [ u8 ; Account :: LEN ] = [ 0 ; Account :: LEN ] ;
429
+ // The right account data size and initialized, unpack will return some key
430
+ let mut src: [ u8 ; Account :: LEN ] = [ 0 ; Account :: LEN ] ;
431
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
432
+ let result = Account :: unpack_account_owner ( & src) ;
433
+ assert ! ( result. is_some( ) ) ;
434
+
435
+ // The right account data size and frozen, unpack will return some key
436
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Frozen as u8 ;
425
437
let result = Account :: unpack_account_owner ( & src) ;
426
438
assert ! ( result. is_some( ) ) ;
427
439
428
440
// Account data length > account data size, but not a valid extension,
429
441
// unpack will not return a key
430
- let src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
442
+ let mut src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
443
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
431
444
let result = Account :: unpack_account_owner ( & src) ;
432
445
assert_eq ! ( result, Option :: None ) ;
433
446
434
- // Account data length > account data size with a valid extension,
447
+ // Account data length > account data size with a valid extension and initialized ,
435
448
// expect some key returned
436
449
let mut src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
437
- src[ Account :: LEN ] = 2 ;
450
+ src[ Account :: LEN ] = AccountType :: Account as u8 ;
451
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
438
452
let result = Account :: unpack_account_owner ( & src) ;
439
453
assert ! ( result. is_some( ) ) ;
454
+
455
+ // Account data length > account data size with a valid extension but uninitialized,
456
+ // expect None
457
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Uninitialized as u8 ;
458
+ let result = Account :: unpack_account_owner ( & src) ;
459
+ assert ! ( result. is_none( ) ) ;
460
+
461
+ // Account data length is multi-sig data size with a valid extension and initalized,
462
+ // expect none
463
+ let mut src: [ u8 ; Multisig :: LEN ] = [ 0 ; Multisig :: LEN ] ;
464
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
465
+ src[ Account :: LEN ] = AccountType :: Account as u8 ;
466
+ let result = Account :: unpack_account_owner ( & src) ;
467
+ assert ! ( result. is_none( ) ) ;
440
468
}
441
469
442
470
#[ test]
@@ -446,22 +474,44 @@ pub(crate) mod test {
446
474
let result = Account :: unpack_account_mint ( & src) ;
447
475
assert_eq ! ( result, Option :: None ) ;
448
476
449
- // The right account data size, unpack will return some key
450
- let src: [ u8 ; Account :: LEN ] = [ 0 ; Account :: LEN ] ;
477
+ // The right account data size and initialized, unpack will return some key
478
+ let mut src: [ u8 ; Account :: LEN ] = [ 0 ; Account :: LEN ] ;
479
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
480
+ let result = Account :: unpack_account_mint ( & src) ;
481
+ assert ! ( result. is_some( ) ) ;
482
+
483
+ // The right account data size and frozen, unpack will return some key
484
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Frozen as u8 ;
451
485
let result = Account :: unpack_account_mint ( & src) ;
452
486
assert ! ( result. is_some( ) ) ;
453
487
454
488
// Account data length > account data size, but not a valid extension,
455
489
// unpack will not return a key
456
- let src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
490
+ let mut src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
491
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
457
492
let result = Account :: unpack_account_mint ( & src) ;
458
493
assert_eq ! ( result, Option :: None ) ;
459
494
460
- // Account data length > account data size with a valid extension,
495
+ // Account data length > account data size with a valid extension and initalized ,
461
496
// expect some key returned
462
497
let mut src: [ u8 ; Account :: LEN + 5 ] = [ 0 ; Account :: LEN + 5 ] ;
463
- src[ Account :: LEN ] = 2 ;
498
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
499
+ src[ Account :: LEN ] = AccountType :: Account as u8 ;
464
500
let result = Account :: unpack_account_mint ( & src) ;
465
501
assert ! ( result. is_some( ) ) ;
502
+
503
+ // Account data length > account data size with a valid extension but uninitalized,
504
+ // expect none
505
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Uninitialized as u8 ;
506
+ let result = Account :: unpack_account_mint ( & src) ;
507
+ assert ! ( result. is_none( ) ) ;
508
+
509
+ // Account data length is multi-sig data size with a valid extension and initalized,
510
+ // expect none
511
+ let mut src: [ u8 ; Multisig :: LEN ] = [ 0 ; Multisig :: LEN ] ;
512
+ src[ spl_token:: state:: ACCOUNT_INITIALIZED_INDEX ] = AccountState :: Initialized as u8 ;
513
+ src[ Account :: LEN ] = AccountType :: Account as u8 ;
514
+ let result = Account :: unpack_account_mint ( & src) ;
515
+ assert ! ( result. is_none( ) ) ;
466
516
}
467
517
}
0 commit comments