Loading fs/smb/client/cifsacl.c +16 −1 Original line number Diff line number Diff line Loading @@ -811,7 +811,23 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, return; for (i = 0; i < num_aces; ++i) { if (end_of_acl - acl_base < acl_size) break; ppace[i] = (struct smb_ace *) (acl_base + acl_size); acl_base = (char *)ppace[i]; acl_size = offsetof(struct smb_ace, sid) + offsetof(struct smb_sid, sub_auth); if (end_of_acl - acl_base < acl_size || ppace[i]->sid.num_subauth == 0 || ppace[i]->sid.num_subauth > SID_MAX_SUB_AUTHORITIES || (end_of_acl - acl_base < acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth) || (le16_to_cpu(ppace[i]->size) < acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth)) break; #ifdef CONFIG_CIFS_DEBUG2 dump_ace(ppace[i], end_of_acl); #endif Loading Loading @@ -855,7 +871,6 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, (void *)ppace[i], sizeof(struct smb_ace)); */ acl_base = (char *)ppace[i]; acl_size = le16_to_cpu(ppace[i]->size); } Loading Loading
fs/smb/client/cifsacl.c +16 −1 Original line number Diff line number Diff line Loading @@ -811,7 +811,23 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, return; for (i = 0; i < num_aces; ++i) { if (end_of_acl - acl_base < acl_size) break; ppace[i] = (struct smb_ace *) (acl_base + acl_size); acl_base = (char *)ppace[i]; acl_size = offsetof(struct smb_ace, sid) + offsetof(struct smb_sid, sub_auth); if (end_of_acl - acl_base < acl_size || ppace[i]->sid.num_subauth == 0 || ppace[i]->sid.num_subauth > SID_MAX_SUB_AUTHORITIES || (end_of_acl - acl_base < acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth) || (le16_to_cpu(ppace[i]->size) < acl_size + sizeof(__le32) * ppace[i]->sid.num_subauth)) break; #ifdef CONFIG_CIFS_DEBUG2 dump_ace(ppace[i], end_of_acl); #endif Loading Loading @@ -855,7 +871,6 @@ static void parse_dacl(struct smb_acl *pdacl, char *end_of_acl, (void *)ppace[i], sizeof(struct smb_ace)); */ acl_base = (char *)ppace[i]; acl_size = le16_to_cpu(ppace[i]->size); } Loading