Skip to content

Commit

Permalink
cifs: fix name parsing in CIFSSMBQAllEAs
Browse files Browse the repository at this point in the history
The code that matches EA names in CIFSSMBQAllEAs is incorrect. It
uses strncmp to do the comparison with the length limited to the
name_len sent in the response.

Problem: Suppose we're looking for an attribute named "foobar" and
have an attribute before it in the EA list named "foo". The
comparison will succeed since we're only looking at the first 3
characters. Fix this by also comparing the length of the provided
ea_name with the name_len in the response. If they're not equal then
it shouldn't match.

Reported-by: Jian Li <jiali@redhat.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: Pavel Shilovsky <piastryyy@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
  • Loading branch information
Jeff Layton authored and Steve French committed Jul 31, 2011
1 parent 998d6fc commit 91d065c
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion fs/cifs/cifssmb.c
Original file line number Diff line number Diff line change
Expand Up @@ -5720,6 +5720,7 @@ CIFSSMBQAllEAs(const int xid, struct cifs_tcon *tcon,
char *temp_ptr;
char *end_of_smb;
__u16 params, byte_count, data_offset;
unsigned int ea_name_len;

cFYI(1, "In Query All EAs path %s", searchName);
QAllEAsRetry:
Expand Down Expand Up @@ -5814,6 +5815,10 @@ CIFSSMBQAllEAs(const int xid, struct cifs_tcon *tcon,
list_len -= 4;
temp_fea = ea_response_data->list;
temp_ptr = (char *)temp_fea;

if (ea_name)
ea_name_len = strlen(ea_name);

while (list_len > 0) {
unsigned int name_len;
__u16 value_len;
Expand All @@ -5837,7 +5842,8 @@ CIFSSMBQAllEAs(const int xid, struct cifs_tcon *tcon,
}

if (ea_name) {
if (strncmp(ea_name, temp_ptr, name_len) == 0) {
if (ea_name_len == name_len &&
strncmp(ea_name, temp_ptr, name_len) == 0) {
temp_ptr += name_len + 1;
rc = value_len;
if (buf_size == 0)
Expand Down

0 comments on commit 91d065c

Please sign in to comment.