int ReplicatedPG::do_xattr_cmp_str(int op, string& v1s, bufferlist& xattr)
{
- const char *v1, *v2;
- v1 = v1s.data();
- string v2s;
- if (xattr.length()) {
- v2s = string(xattr.c_str(), xattr.length());
- v2 = v2s.c_str();
- } else
- v2 = "";
+ string v2s(xattr.c_str(), xattr.length());
- dout(20) << "do_xattr_cmp_str '" << v1s << "' vs '" << v2 << "' op " << op << dendl;
+ dout(20) << "do_xattr_cmp_str '" << v1s << "' vs '" << v2s << "' op " << op << dendl;
switch (op) {
case CEPH_OSD_CMPXATTR_OP_EQ:
- return (strcmp(v1, v2) == 0);
+ return (v1s.compare(v2s) == 0);
case CEPH_OSD_CMPXATTR_OP_NE:
- return (strcmp(v1, v2) != 0);
+ return (v1s.compare(v2s) != 0);
case CEPH_OSD_CMPXATTR_OP_GT:
- return (strcmp(v1, v2) > 0);
+ return (v1s.compare(v2s) > 0);
case CEPH_OSD_CMPXATTR_OP_GTE:
- return (strcmp(v1, v2) >= 0);
+ return (v1s.compare(v2s) >= 0);
case CEPH_OSD_CMPXATTR_OP_LT:
- return (strcmp(v1, v2) < 0);
+ return (v1s.compare(v2s) < 0);
case CEPH_OSD_CMPXATTR_OP_LTE:
- return (strcmp(v1, v2) <= 0);
+ return (v1s.compare(v2s) <= 0);
default:
return -EINVAL;
}
EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, sizeof(buf), LIBRADOS_CMPXATTR_OP_LT));
EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, sizeof(buf), LIBRADOS_CMPXATTR_OP_LTE));
- // it compares C strings, so NUL at the beginning is the same
- // regardless of the following data
- rados_setxattr(ioctx, obj, xattr, "\0\0", 1);
+ // check that null bytes are compared correctly
+ rados_setxattr(ioctx, obj, xattr, "\0\0", 2);
buf[0] = '\0';
- EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_EQ));
- EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_NE));
- EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_GT));
+ EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_EQ));
+ EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_NE));
+ EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_GT));
EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_GTE));
EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_LT));
- EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_LTE));
+ EXPECT_EQ(-ECANCELED, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_LTE));
buf[1] = '\0';
EXPECT_EQ(1, cmp_xattr(xattr, buf, 2, LIBRADOS_CMPXATTR_OP_EQ));