Skip to content

Commit b6f5f45

Browse files
authored
Merge pull request ceph#57433 from idryomov/wip-65813
librbd: don't crash on a zero-length read if buffer is NULL Reviewed-by: Ramana Raja <[email protected]>
2 parents f319358 + e6773a9 commit b6f5f45

File tree

3 files changed

+42
-23
lines changed

3 files changed

+42
-23
lines changed

src/osdc/Striper.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,13 +485,14 @@ void Striper::StripedReadResult::assemble_result(CephContext *cct,
485485

486486
void Striper::StripedReadResult::assemble_result(CephContext *cct, char *buffer, size_t length)
487487
{
488-
489-
ceph_assert(buffer && length == total_intended_len);
488+
ceph_assert(length == total_intended_len);
490489

491490
map<uint64_t,pair<bufferlist,uint64_t> >::reverse_iterator p = partial.rbegin();
492491
if (p == partial.rend())
493492
return;
494493

494+
ceph_assert(buffer);
495+
495496
uint64_t curr = length;
496497
uint64_t end = p->first + p->second.second;
497498
while (p != partial.rend()) {

src/test/librbd/fsx.cc

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,6 +2853,7 @@ check_clone(int clonenum, bool replay_image)
28532853
struct rbd_ctx cur_ctx = RBD_CTX_INIT;
28542854
struct stat file_info;
28552855
char *good_buf, *temp_buf;
2856+
uint64_t size;
28562857

28572858
if (replay_image) {
28582859
replay_imagename(imagename, sizeof(imagename), clonenum);
@@ -2864,40 +2865,51 @@ check_clone(int clonenum, bool replay_image)
28642865
prterrcode("check_clone: ops->open", ret);
28652866
exit(167);
28662867
}
2868+
if ((ret = ops->get_size(&cur_ctx, &size)) < 0) {
2869+
prterrcode("check_clone: ops->get_size", ret);
2870+
exit(167);
2871+
}
28672872

28682873
clone_filename(filename, sizeof(filename), clonenum + 1);
28692874
if ((fd = open(filename, O_RDONLY | O_BINARY)) < 0) {
2870-
simple_err("check_clone: open", -errno);
2875+
prterrcode("check_clone: open", -errno);
28712876
exit(168);
28722877
}
2878+
if (fstat(fd, &file_info) < 0) {
2879+
prterrcode("check_clone: fstat", -errno);
2880+
exit(169);
2881+
}
28732882

28742883
prt("checking clone #%d, image %s against file %s\n",
28752884
clonenum, imagename, filename);
2876-
if ((ret = fstat(fd, &file_info)) < 0) {
2877-
simple_err("check_clone: fstat", -errno);
2878-
exit(169);
2885+
if (size != (uint64_t)file_info.st_size) {
2886+
prt("check_clone: image size 0x%llx != file size 0x%llx\n",
2887+
(unsigned long long)size,
2888+
(unsigned long long)file_info.st_size);
2889+
exit(175);
28792890
}
28802891

28812892
good_buf = NULL;
2882-
ret = posix_memalign((void **)&good_buf,
2883-
std::max(writebdy, (int)sizeof(void *)),
2884-
file_info.st_size);
2885-
if (ret > 0) {
2886-
prterrcode("check_clone: posix_memalign(good_buf)", -ret);
2887-
exit(96);
2888-
}
2889-
28902893
temp_buf = NULL;
2891-
ret = posix_memalign((void **)&temp_buf,
2892-
std::max(readbdy, (int)sizeof(void *)),
2893-
file_info.st_size);
2894-
if (ret > 0) {
2895-
prterrcode("check_clone: posix_memalign(temp_buf)", -ret);
2896-
exit(97);
2894+
if (file_info.st_size > 0) {
2895+
ret = posix_memalign((void **)&good_buf,
2896+
std::max(writebdy, (int)sizeof(void *)),
2897+
file_info.st_size);
2898+
if (ret > 0) {
2899+
prterrcode("check_clone: posix_memalign(good_buf)", -ret);
2900+
exit(96);
2901+
}
2902+
ret = posix_memalign((void **)&temp_buf,
2903+
std::max(readbdy, (int)sizeof(void *)),
2904+
file_info.st_size);
2905+
if (ret > 0) {
2906+
prterrcode("check_clone: posix_memalign(temp_buf)", -ret);
2907+
exit(97);
2908+
}
28972909
}
28982910

2899-
if ((ret = pread(fd, good_buf, file_info.st_size, 0)) < 0) {
2900-
simple_err("check_clone: pread", -errno);
2911+
if (pread(fd, good_buf, file_info.st_size, 0) < 0) {
2912+
prterrcode("check_clone: pread", -errno);
29012913
exit(170);
29022914
}
29032915
if ((ret = ops->read(&cur_ctx, 0, file_info.st_size, temp_buf)) < 0) {

src/test/librbd/test_librbd.cc

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8748,8 +8748,12 @@ TEST_F(TestLibRBD, ZeroLengthWrite)
87488748
ASSERT_EQ(0, create_image(ioctx, name.c_str(), size, &order));
87498749
ASSERT_EQ(0, rbd_open(ioctx, name.c_str(), &image, NULL));
87508750

8751-
char read_data[1];
8751+
const char data[] = "blah";
8752+
ASSERT_EQ(0, rbd_write(image, 0, 0, data));
8753+
ASSERT_EQ(0, rbd_write(image, 0, 0, (char*)0x123));
87528754
ASSERT_EQ(0, rbd_write(image, 0, 0, NULL));
8755+
8756+
char read_data[1];
87538757
ASSERT_EQ(1, rbd_read(image, 0, 1, read_data));
87548758
ASSERT_EQ('\0', read_data[0]);
87558759

@@ -8801,6 +8805,8 @@ TEST_F(TestLibRBD, ZeroLengthRead)
88018805

88028806
char read_data[1];
88038807
ASSERT_EQ(0, rbd_read(image, 0, 0, read_data));
8808+
ASSERT_EQ(0, rbd_read(image, 0, 0, (char*)0x123));
8809+
ASSERT_EQ(0, rbd_read(image, 0, 0, NULL));
88048810

88058811
ASSERT_EQ(0, rbd_close(image));
88068812

0 commit comments

Comments
 (0)