Skip to content

Commit 62e7dd0

Browse files
namjaejeonSteve French
authored andcommitted
smb: common: change the data type of num_aces to le16
2.4.5 in [MS-DTYP].pdf describe the data type of num_aces as le16. AceCount (2 bytes): An unsigned 16-bit integer that specifies the count of the number of ACE records in the ACL. Change it to le16 and add reserved field to smb_acl struct. Reported-by: Igor Leite Ladessa <[email protected]> Tested-by: Igor Leite Ladessa <[email protected]> Signed-off-by: Namjae Jeon <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent e26e2d2 commit 62e7dd0

File tree

4 files changed

+32
-30
lines changed

4 files changed

+32
-30
lines changed

fs/smb/client/cifsacl.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,
763763
struct cifs_fattr *fattr, bool mode_from_special_sid)
764764
{
765765
int i;
766-
int num_aces = 0;
766+
u16 num_aces = 0;
767767
int acl_size;
768768
char *acl_base;
769769
struct smb_ace **ppace;
@@ -785,7 +785,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,
785785

786786
cifs_dbg(NOISY, "DACL revision %d size %d num aces %d\n",
787787
le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size),
788-
le32_to_cpu(pdacl->num_aces));
788+
le16_to_cpu(pdacl->num_aces));
789789

790790
/* reset rwx permissions for user/group/other.
791791
Also, if num_aces is 0 i.e. DACL has no ACEs,
@@ -795,7 +795,7 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl,
795795
acl_base = (char *)pdacl;
796796
acl_size = sizeof(struct smb_acl);
797797

798-
num_aces = le32_to_cpu(pdacl->num_aces);
798+
num_aces = le16_to_cpu(pdacl->num_aces);
799799
if (num_aces > 0) {
800800
umode_t denied_mode = 0;
801801

@@ -937,12 +937,12 @@ unsigned int setup_special_user_owner_ACE(struct smb_ace *pntace)
937937
static void populate_new_aces(char *nacl_base,
938938
struct smb_sid *pownersid,
939939
struct smb_sid *pgrpsid,
940-
__u64 *pnmode, u32 *pnum_aces, u16 *pnsize,
940+
__u64 *pnmode, u16 *pnum_aces, u16 *pnsize,
941941
bool modefromsid,
942942
bool posix)
943943
{
944944
__u64 nmode;
945-
u32 num_aces = 0;
945+
u16 num_aces = 0;
946946
u16 nsize = 0;
947947
__u64 user_mode;
948948
__u64 group_mode;
@@ -1050,15 +1050,15 @@ static __u16 replace_sids_and_copy_aces(struct smb_acl *pdacl, struct smb_acl *p
10501050
u16 size = 0;
10511051
struct smb_ace *pntace = NULL;
10521052
char *acl_base = NULL;
1053-
u32 src_num_aces = 0;
1053+
u16 src_num_aces = 0;
10541054
u16 nsize = 0;
10551055
struct smb_ace *pnntace = NULL;
10561056
char *nacl_base = NULL;
10571057
u16 ace_size = 0;
10581058

10591059
acl_base = (char *)pdacl;
10601060
size = sizeof(struct smb_acl);
1061-
src_num_aces = le32_to_cpu(pdacl->num_aces);
1061+
src_num_aces = le16_to_cpu(pdacl->num_aces);
10621062

10631063
nacl_base = (char *)pndacl;
10641064
nsize = sizeof(struct smb_acl);
@@ -1090,11 +1090,11 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,
10901090
u16 size = 0;
10911091
struct smb_ace *pntace = NULL;
10921092
char *acl_base = NULL;
1093-
u32 src_num_aces = 0;
1093+
u16 src_num_aces = 0;
10941094
u16 nsize = 0;
10951095
struct smb_ace *pnntace = NULL;
10961096
char *nacl_base = NULL;
1097-
u32 num_aces = 0;
1097+
u16 num_aces = 0;
10981098
bool new_aces_set = false;
10991099

11001100
/* Assuming that pndacl and pnmode are never NULL */
@@ -1112,7 +1112,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,
11121112

11131113
acl_base = (char *)pdacl;
11141114
size = sizeof(struct smb_acl);
1115-
src_num_aces = le32_to_cpu(pdacl->num_aces);
1115+
src_num_aces = le16_to_cpu(pdacl->num_aces);
11161116

11171117
/* Retain old ACEs which we can retain */
11181118
for (i = 0; i < src_num_aces; ++i) {
@@ -1158,7 +1158,7 @@ static int set_chmod_dacl(struct smb_acl *pdacl, struct smb_acl *pndacl,
11581158
}
11591159

11601160
finalize_dacl:
1161-
pndacl->num_aces = cpu_to_le32(num_aces);
1161+
pndacl->num_aces = cpu_to_le16(num_aces);
11621162
pndacl->size = cpu_to_le16(nsize);
11631163

11641164
return 0;
@@ -1293,7 +1293,7 @@ static int build_sec_desc(struct smb_ntsd *pntsd, struct smb_ntsd *pnntsd,
12931293
dacloffset ? dacl_ptr->revision : cpu_to_le16(ACL_REVISION);
12941294

12951295
ndacl_ptr->size = cpu_to_le16(0);
1296-
ndacl_ptr->num_aces = cpu_to_le32(0);
1296+
ndacl_ptr->num_aces = cpu_to_le16(0);
12971297

12981298
rc = set_chmod_dacl(dacl_ptr, ndacl_ptr, owner_sid_ptr, group_sid_ptr,
12991299
pnmode, mode_from_sid, posix);
@@ -1653,7 +1653,7 @@ id_mode_to_cifs_acl(struct inode *inode, const char *path, __u64 *pnmode,
16531653
dacl_ptr = (struct smb_acl *)((char *)pntsd + dacloffset);
16541654
if (mode_from_sid)
16551655
nsecdesclen +=
1656-
le32_to_cpu(dacl_ptr->num_aces) * sizeof(struct smb_ace);
1656+
le16_to_cpu(dacl_ptr->num_aces) * sizeof(struct smb_ace);
16571657
else /* cifsacl */
16581658
nsecdesclen += le16_to_cpu(dacl_ptr->size);
16591659
}

fs/smb/common/smbacl.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ struct smb_sid {
107107
struct smb_acl {
108108
__le16 revision; /* revision level */
109109
__le16 size;
110-
__le32 num_aces;
110+
__le16 num_aces;
111+
__le16 reserved;
111112
} __attribute__((packed));
112113

113114
struct smb_ace {

fs/smb/server/smbacl.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ void posix_state_to_acl(struct posix_acl_state *state,
333333
pace->e_perm = state->other.allow;
334334
}
335335

336-
int init_acl_state(struct posix_acl_state *state, int cnt)
336+
int init_acl_state(struct posix_acl_state *state, u16 cnt)
337337
{
338338
int alloc;
339339

@@ -368,7 +368,7 @@ static void parse_dacl(struct mnt_idmap *idmap,
368368
struct smb_fattr *fattr)
369369
{
370370
int i, ret;
371-
int num_aces = 0;
371+
u16 num_aces = 0;
372372
unsigned int acl_size;
373373
char *acl_base;
374374
struct smb_ace **ppace;
@@ -389,12 +389,12 @@ static void parse_dacl(struct mnt_idmap *idmap,
389389

390390
ksmbd_debug(SMB, "DACL revision %d size %d num aces %d\n",
391391
le16_to_cpu(pdacl->revision), le16_to_cpu(pdacl->size),
392-
le32_to_cpu(pdacl->num_aces));
392+
le16_to_cpu(pdacl->num_aces));
393393

394394
acl_base = (char *)pdacl;
395395
acl_size = sizeof(struct smb_acl);
396396

397-
num_aces = le32_to_cpu(pdacl->num_aces);
397+
num_aces = le16_to_cpu(pdacl->num_aces);
398398
if (num_aces <= 0)
399399
return;
400400

@@ -580,7 +580,7 @@ static void parse_dacl(struct mnt_idmap *idmap,
580580

581581
static void set_posix_acl_entries_dacl(struct mnt_idmap *idmap,
582582
struct smb_ace *pndace,
583-
struct smb_fattr *fattr, u32 *num_aces,
583+
struct smb_fattr *fattr, u16 *num_aces,
584584
u16 *size, u32 nt_aces_num)
585585
{
586586
struct posix_acl_entry *pace;
@@ -701,7 +701,7 @@ static void set_ntacl_dacl(struct mnt_idmap *idmap,
701701
struct smb_fattr *fattr)
702702
{
703703
struct smb_ace *ntace, *pndace;
704-
int nt_num_aces = le32_to_cpu(nt_dacl->num_aces), num_aces = 0;
704+
u16 nt_num_aces = le16_to_cpu(nt_dacl->num_aces), num_aces = 0;
705705
unsigned short size = 0;
706706
int i;
707707

@@ -728,15 +728,15 @@ static void set_ntacl_dacl(struct mnt_idmap *idmap,
728728

729729
set_posix_acl_entries_dacl(idmap, pndace, fattr,
730730
&num_aces, &size, nt_num_aces);
731-
pndacl->num_aces = cpu_to_le32(num_aces);
731+
pndacl->num_aces = cpu_to_le16(num_aces);
732732
pndacl->size = cpu_to_le16(le16_to_cpu(pndacl->size) + size);
733733
}
734734

735735
static void set_mode_dacl(struct mnt_idmap *idmap,
736736
struct smb_acl *pndacl, struct smb_fattr *fattr)
737737
{
738738
struct smb_ace *pace, *pndace;
739-
u32 num_aces = 0;
739+
u16 num_aces = 0;
740740
u16 size = 0, ace_size = 0;
741741
uid_t uid;
742742
const struct smb_sid *sid;
@@ -792,7 +792,7 @@ static void set_mode_dacl(struct mnt_idmap *idmap,
792792
fattr->cf_mode, 0007);
793793

794794
out:
795-
pndacl->num_aces = cpu_to_le32(num_aces);
795+
pndacl->num_aces = cpu_to_le16(num_aces);
796796
pndacl->size = cpu_to_le16(le16_to_cpu(pndacl->size) + size);
797797
}
798798

@@ -1022,8 +1022,9 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
10221022
struct smb_sid owner_sid, group_sid;
10231023
struct dentry *parent = path->dentry->d_parent;
10241024
struct mnt_idmap *idmap = mnt_idmap(path->mnt);
1025-
int inherited_flags = 0, flags = 0, i, ace_cnt = 0, nt_size = 0, pdacl_size;
1026-
int rc = 0, num_aces, dacloffset, pntsd_type, pntsd_size, acl_len, aces_size;
1025+
int inherited_flags = 0, flags = 0, i, nt_size = 0, pdacl_size;
1026+
int rc = 0, dacloffset, pntsd_type, pntsd_size, acl_len, aces_size;
1027+
u16 num_aces, ace_cnt = 0;
10271028
char *aces_base;
10281029
bool is_dir = S_ISDIR(d_inode(path->dentry)->i_mode);
10291030

@@ -1039,7 +1040,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
10391040

10401041
parent_pdacl = (struct smb_acl *)((char *)parent_pntsd + dacloffset);
10411042
acl_len = pntsd_size - dacloffset;
1042-
num_aces = le32_to_cpu(parent_pdacl->num_aces);
1043+
num_aces = le16_to_cpu(parent_pdacl->num_aces);
10431044
pntsd_type = le16_to_cpu(parent_pntsd->type);
10441045
pdacl_size = le16_to_cpu(parent_pdacl->size);
10451046

@@ -1199,7 +1200,7 @@ int smb_inherit_dacl(struct ksmbd_conn *conn,
11991200
pdacl = (struct smb_acl *)((char *)pntsd + le32_to_cpu(pntsd->dacloffset));
12001201
pdacl->revision = cpu_to_le16(2);
12011202
pdacl->size = cpu_to_le16(sizeof(struct smb_acl) + nt_size);
1202-
pdacl->num_aces = cpu_to_le32(ace_cnt);
1203+
pdacl->num_aces = cpu_to_le16(ace_cnt);
12031204
pace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
12041205
memcpy(pace, aces_base, nt_size);
12051206
pntsd_size += sizeof(struct smb_acl) + nt_size;
@@ -1280,7 +1281,7 @@ int smb_check_perm_dacl(struct ksmbd_conn *conn, const struct path *path,
12801281

12811282
ace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
12821283
aces_size = acl_size - sizeof(struct smb_acl);
1283-
for (i = 0; i < le32_to_cpu(pdacl->num_aces); i++) {
1284+
for (i = 0; i < le16_to_cpu(pdacl->num_aces); i++) {
12841285
if (offsetof(struct smb_ace, access_req) > aces_size)
12851286
break;
12861287
ace_size = le16_to_cpu(ace->size);
@@ -1301,7 +1302,7 @@ int smb_check_perm_dacl(struct ksmbd_conn *conn, const struct path *path,
13011302

13021303
ace = (struct smb_ace *)((char *)pdacl + sizeof(struct smb_acl));
13031304
aces_size = acl_size - sizeof(struct smb_acl);
1304-
for (i = 0; i < le32_to_cpu(pdacl->num_aces); i++) {
1305+
for (i = 0; i < le16_to_cpu(pdacl->num_aces); i++) {
13051306
if (offsetof(struct smb_ace, access_req) > aces_size)
13061307
break;
13071308
ace_size = le16_to_cpu(ace->size);

fs/smb/server/smbacl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ int parse_sec_desc(struct mnt_idmap *idmap, struct smb_ntsd *pntsd,
8686
int build_sec_desc(struct mnt_idmap *idmap, struct smb_ntsd *pntsd,
8787
struct smb_ntsd *ppntsd, int ppntsd_size, int addition_info,
8888
__u32 *secdesclen, struct smb_fattr *fattr);
89-
int init_acl_state(struct posix_acl_state *state, int cnt);
89+
int init_acl_state(struct posix_acl_state *state, u16 cnt);
9090
void free_acl_state(struct posix_acl_state *state);
9191
void posix_state_to_acl(struct posix_acl_state *state,
9292
struct posix_acl_entry *pace);

0 commit comments

Comments
 (0)