Skip to content

Commit

Permalink
cifs: fix return value for cifs_listxattr
Browse files Browse the repository at this point in the history
If the application buffer was too small to fit all the names
we would still count the number of bytes and return this for
listxattr. This would then trigger a BUG in usercopy.c

Fix the computation of the size so that we return -ERANGE
correctly when the buffer is too small.

This fixes the kernel BUG for xfstest generic/377

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Aurelien Aptel <aaptel@suse.com>
  • Loading branch information
Ronnie Sahlberg authored and Steve French committed Nov 2, 2018
1 parent 5f21585 commit 0c5d6cb
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions fs/cifs/smb2ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -747,6 +747,7 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size,
int rc = 0;
unsigned int ea_name_len = ea_name ? strlen(ea_name) : 0;
char *name, *value;
size_t buf_size = dst_size;
size_t name_len, value_len, user_name_len;

while (src_size > 0) {
Expand Down Expand Up @@ -782,18 +783,18 @@ move_smb2_ea_to_cifs(char *dst, size_t dst_size,
/* 'user.' plus a terminating null */
user_name_len = 5 + 1 + name_len;

rc += user_name_len;

if (dst_size >= user_name_len) {
if (buf_size == 0) {
/* skip copy - calc size only */
rc += user_name_len;
} else if (dst_size >= user_name_len) {
dst_size -= user_name_len;
memcpy(dst, "user.", 5);
dst += 5;
memcpy(dst, src->ea_data, name_len);
dst += name_len;
*dst = 0;
++dst;
} else if (dst_size == 0) {
/* skip copy - calc size only */
rc += user_name_len;
} else {
/* stop before overrun buffer */
rc = -ERANGE;
Expand Down

0 comments on commit 0c5d6cb

Please sign in to comment.