Kaynağa Gözat

ceph: fix xattr rbtree search

Fix xattr name comparison in rbtree search for strings that share a prefix.
The *name argument is null terminated, but the xattr name is not, so we
need to use strncmp, but that means adjusting for the case where name is
a prefix of xattr->name.

The corresponding case in __set_xattr() already handles this properly
(although in that case *name is also not null terminated).

Reported-by: Sergiy Kibrik <sakib@meta.ua>
Signed-off-by: Sage Weil <sage@newdream.net>
Sage Weil 14 yıl önce
ebeveyn
işleme
17db143fc0
1 değiştirilmiş dosya ile 3 ekleme ve 0 silme
  1. 3 0
      fs/ceph/xattr.c

+ 3 - 0
fs/ceph/xattr.c

@@ -219,6 +219,7 @@ static struct ceph_inode_xattr *__get_xattr(struct ceph_inode_info *ci,
 	struct rb_node **p;
 	struct rb_node **p;
 	struct rb_node *parent = NULL;
 	struct rb_node *parent = NULL;
 	struct ceph_inode_xattr *xattr = NULL;
 	struct ceph_inode_xattr *xattr = NULL;
+	int name_len = strlen(name);
 	int c;
 	int c;
 
 
 	p = &ci->i_xattrs.index.rb_node;
 	p = &ci->i_xattrs.index.rb_node;
@@ -226,6 +227,8 @@ static struct ceph_inode_xattr *__get_xattr(struct ceph_inode_info *ci,
 		parent = *p;
 		parent = *p;
 		xattr = rb_entry(parent, struct ceph_inode_xattr, node);
 		xattr = rb_entry(parent, struct ceph_inode_xattr, node);
 		c = strncmp(name, xattr->name, xattr->name_len);
 		c = strncmp(name, xattr->name, xattr->name_len);
+		if (c == 0 && name_len > xattr->name_len)
+			c = 1;
 		if (c < 0)
 		if (c < 0)
 			p = &(*p)->rb_left;
 			p = &(*p)->rb_left;
 		else if (c > 0)
 		else if (c > 0)