@@ -387,7 +387,7 @@ void posix_state_to_acl(struct posix_acl_state *state,
387
387
pace -> e_perm = state -> other .allow ;
388
388
}
389
389
390
- int init_acl_state (struct posix_acl_state * state , int cnt )
390
+ int init_acl_state (struct posix_acl_state * state , u16 cnt )
391
391
{
392
392
int alloc ;
393
393
@@ -426,7 +426,7 @@ static void parse_dacl(struct user_namespace *user_ns,
426
426
struct smb_fattr * fattr )
427
427
{
428
428
int i , ret ;
429
- int num_aces = 0 ;
429
+ u16 num_aces = 0 ;
430
430
unsigned int acl_size ;
431
431
char * acl_base ;
432
432
struct smb_ace * * ppace ;
@@ -447,16 +447,18 @@ static void parse_dacl(struct user_namespace *user_ns,
447
447
448
448
ksmbd_debug (SMB , "DACL revision %d size %d num aces %d\n" ,
449
449
le16_to_cpu (pdacl -> revision ), le16_to_cpu (pdacl -> size ),
450
- le32_to_cpu (pdacl -> num_aces ));
450
+ le16_to_cpu (pdacl -> num_aces ));
451
451
452
452
acl_base = (char * )pdacl ;
453
453
acl_size = sizeof (struct smb_acl );
454
454
455
- num_aces = le32_to_cpu (pdacl -> num_aces );
455
+ num_aces = le16_to_cpu (pdacl -> num_aces );
456
456
if (num_aces <= 0 )
457
457
return ;
458
458
459
- if (num_aces > ULONG_MAX / sizeof (struct smb_ace * ))
459
+ if (num_aces > (pdacl -> size - sizeof (struct smb_acl )) /
460
+ (offsetof(struct smb_ace , sid ) +
461
+ offsetof(struct smb_sid , sub_auth ) + sizeof (__le16 )))
460
462
return ;
461
463
462
464
ret = init_acl_state (& acl_state , num_aces );
@@ -490,6 +492,7 @@ static void parse_dacl(struct user_namespace *user_ns,
490
492
offsetof(struct smb_sid , sub_auth );
491
493
492
494
if (end_of_acl - acl_base < acl_size ||
495
+ ppace [i ]-> sid .num_subauth == 0 ||
493
496
ppace [i ]-> sid .num_subauth > SID_MAX_SUB_AUTHORITIES ||
494
497
(end_of_acl - acl_base <
495
498
acl_size + sizeof (__le32 ) * ppace [i ]-> sid .num_subauth ) ||
@@ -646,7 +649,7 @@ static void set_posix_acl_entries_dacl(struct mnt_idmap *idmap,
646
649
static void set_posix_acl_entries_dacl (struct user_namespace * user_ns ,
647
650
#endif
648
651
struct smb_ace * pndace ,
649
- struct smb_fattr * fattr , u32 * num_aces ,
652
+ struct smb_fattr * fattr , u16 * num_aces ,
650
653
u16 * size , u32 nt_aces_num )
651
654
{
652
655
struct posix_acl_entry * pace ;
@@ -787,7 +790,7 @@ static void set_ntacl_dacl(struct user_namespace *user_ns,
787
790
struct smb_fattr * fattr )
788
791
{
789
792
struct smb_ace * ntace , * pndace ;
790
- int nt_num_aces = le32_to_cpu (nt_dacl -> num_aces ), num_aces = 0 ;
793
+ u16 nt_num_aces = le16_to_cpu (nt_dacl -> num_aces ), num_aces = 0 ;
791
794
unsigned short size = 0 ;
792
795
int i ;
793
796
@@ -830,7 +833,7 @@ static void set_mode_dacl(struct user_namespace *user_ns,
830
833
struct smb_acl * pndacl , struct smb_fattr * fattr )
831
834
{
832
835
struct smb_ace * pace , * pndace ;
833
- u32 num_aces = 0 ;
836
+ u16 num_aces = 0 ;
834
837
u16 size = 0 , ace_size = 0 ;
835
838
uid_t uid ;
836
839
const struct smb_sid * sid ;
@@ -890,7 +893,7 @@ static void set_mode_dacl(struct user_namespace *user_ns,
890
893
fattr -> cf_mode , 0007 );
891
894
892
895
out :
893
- pndacl -> num_aces = cpu_to_le32 (num_aces );
896
+ pndacl -> num_aces = cpu_to_le16 (num_aces );
894
897
pndacl -> size = cpu_to_le16 (le16_to_cpu (pndacl -> size ) + size );
895
898
}
896
899
@@ -1137,7 +1140,8 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
1137
1140
struct user_namespace * user_ns = mnt_user_ns (path -> mnt );
1138
1141
#endif
1139
1142
int inherited_flags = 0 , flags = 0 , i , ace_cnt = 0 , nt_size = 0 , pdacl_size ;
1140
- int rc = 0 , num_aces , dacloffset , pntsd_type , pntsd_size , acl_len , aces_size ;
1143
+ int rc = 0 , dacloffset , pntsd_type , pntsd_size , acl_len , aces_size ;
1144
+ u16 num_aces ;
1141
1145
char * aces_base ;
1142
1146
bool is_dir = S_ISDIR (d_inode (path -> dentry )-> i_mode );
1143
1147
@@ -1157,7 +1161,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
1157
1161
1158
1162
parent_pdacl = (struct smb_acl * )((char * )parent_pntsd + dacloffset );
1159
1163
acl_len = pntsd_size - dacloffset ;
1160
- num_aces = le32_to_cpu (parent_pdacl -> num_aces );
1164
+ num_aces = le16_to_cpu (parent_pdacl -> num_aces );
1161
1165
pntsd_type = le16_to_cpu (parent_pntsd -> type );
1162
1166
pdacl_size = le16_to_cpu (parent_pdacl -> size );
1163
1167
@@ -1317,7 +1321,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
1317
1321
pdacl = (struct smb_acl * )((char * )pntsd + le32_to_cpu (pntsd -> dacloffset ));
1318
1322
pdacl -> revision = cpu_to_le16 (2 );
1319
1323
pdacl -> size = cpu_to_le16 (sizeof (struct smb_acl ) + nt_size );
1320
- pdacl -> num_aces = cpu_to_le32 (ace_cnt );
1324
+ pdacl -> num_aces = cpu_to_le16 (ace_cnt );
1321
1325
pace = (struct smb_ace * )((char * )pdacl + sizeof (struct smb_acl ));
1322
1326
memcpy (pace , aces_base , nt_size );
1323
1327
pntsd_size += sizeof (struct smb_acl ) + nt_size ;
@@ -1411,7 +1415,7 @@ int smb_check_perm_dacl(struct ksmbd_conn *conn, const struct path *path,
1411
1415
1412
1416
ace = (struct smb_ace * )((char * )pdacl + sizeof (struct smb_acl ));
1413
1417
aces_size = acl_size - sizeof (struct smb_acl );
1414
- for (i = 0 ; i < le32_to_cpu (pdacl -> num_aces ); i ++ ) {
1418
+ for (i = 0 ; i < le16_to_cpu (pdacl -> num_aces ); i ++ ) {
1415
1419
if (offsetof(struct smb_ace , access_req ) > aces_size )
1416
1420
break ;
1417
1421
ace_size = le16_to_cpu (ace -> size );
@@ -1432,7 +1436,7 @@ int smb_check_perm_dacl(struct ksmbd_conn *conn, const struct path *path,
1432
1436
1433
1437
ace = (struct smb_ace * )((char * )pdacl + sizeof (struct smb_acl ));
1434
1438
aces_size = acl_size - sizeof (struct smb_acl );
1435
- for (i = 0 ; i < le32_to_cpu (pdacl -> num_aces ); i ++ ) {
1439
+ for (i = 0 ; i < le16_to_cpu (pdacl -> num_aces ); i ++ ) {
1436
1440
if (offsetof(struct smb_ace , access_req ) > aces_size )
1437
1441
break ;
1438
1442
ace_size = le16_to_cpu (ace -> size );
0 commit comments