@@ -795,7 +795,7 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
795
795
size_t buf_size )
796
796
{
797
797
struct jfs_ea_list * ealist ;
798
- struct jfs_ea * ea ;
798
+ struct jfs_ea * ea , * ealist_end ;
799
799
struct ea_buffer ea_buf ;
800
800
int xattr_size ;
801
801
ssize_t size ;
@@ -815,9 +815,16 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
815
815
goto not_found ;
816
816
817
817
ealist = (struct jfs_ea_list * ) ea_buf .xattr ;
818
+ ealist_end = END_EALIST (ealist );
818
819
819
820
/* Find the named attribute */
820
- for (ea = FIRST_EA (ealist ); ea < END_EALIST (ealist ); ea = NEXT_EA (ea ))
821
+ for (ea = FIRST_EA (ealist ); ea < ealist_end ; ea = NEXT_EA (ea )) {
822
+ if (unlikely (ea + 1 > ealist_end ) ||
823
+ unlikely (NEXT_EA (ea ) > ealist_end )) {
824
+ size = - EUCLEAN ;
825
+ goto release ;
826
+ }
827
+
821
828
if ((namelen == ea -> namelen ) &&
822
829
memcmp (name , ea -> name , namelen ) == 0 ) {
823
830
/* Found it */
@@ -832,6 +839,7 @@ ssize_t __jfs_getxattr(struct inode *inode, const char *name, void *data,
832
839
memcpy (data , value , size );
833
840
goto release ;
834
841
}
842
+ }
835
843
not_found :
836
844
size = - ENODATA ;
837
845
release :
@@ -859,7 +867,7 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
859
867
ssize_t size = 0 ;
860
868
int xattr_size ;
861
869
struct jfs_ea_list * ealist ;
862
- struct jfs_ea * ea ;
870
+ struct jfs_ea * ea , * ealist_end ;
863
871
struct ea_buffer ea_buf ;
864
872
865
873
down_read (& JFS_IP (inode )-> xattr_sem );
@@ -874,9 +882,16 @@ ssize_t jfs_listxattr(struct dentry * dentry, char *data, size_t buf_size)
874
882
goto release ;
875
883
876
884
ealist = (struct jfs_ea_list * ) ea_buf .xattr ;
885
+ ealist_end = END_EALIST (ealist );
877
886
878
887
/* compute required size of list */
879
- for (ea = FIRST_EA (ealist ); ea < END_EALIST (ealist ); ea = NEXT_EA (ea )) {
888
+ for (ea = FIRST_EA (ealist ); ea < ealist_end ; ea = NEXT_EA (ea )) {
889
+ if (unlikely (ea + 1 > ealist_end ) ||
890
+ unlikely (NEXT_EA (ea ) > ealist_end )) {
891
+ size = - EUCLEAN ;
892
+ goto release ;
893
+ }
894
+
880
895
if (can_list (ea ))
881
896
size += name_size (ea ) + 1 ;
882
897
}
0 commit comments