Skip to content

Commit 66eb606

Browse files
authored
Merge pull request Tencent#1425 from ylavic/filereadstream_peek4
Fix off by one in FileReadStream::Peek4()
2 parents b4b0e13 + 38d25d7 commit 66eb606

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

bin/data/abcde.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
abcde

include/rapidjson/filereadstream.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class FileReadStream {
5959

6060
// For encoding detection only.
6161
const Ch* Peek4() const {
62-
return (current_ + 4 <= bufferLast_) ? current_ : 0;
62+
return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;
6363
}
6464

6565
private:

test/unittest/filestreamtest.cpp

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ using namespace rapidjson;
2121

2222
class FileStreamTest : public ::testing::Test {
2323
public:
24-
FileStreamTest() : filename_(), json_(), length_() {}
24+
FileStreamTest() : filename_(), json_(), length_(), abcde_() {}
2525
virtual ~FileStreamTest();
2626

2727
virtual void SetUp() {
@@ -49,6 +49,24 @@ class FileStreamTest : public ::testing::Test {
4949
size_t readLength = fread(json_, 1, length_, fp);
5050
json_[readLength] = '\0';
5151
fclose(fp);
52+
53+
const char *abcde_paths[] = {
54+
"data/abcde.txt",
55+
"bin/data/abcde.txt",
56+
"../bin/data/abcde.txt",
57+
"../../bin/data/abcde.txt",
58+
"../../../bin/data/abcde.txt"
59+
};
60+
fp = 0;
61+
for (size_t i = 0; i < sizeof(abcde_paths) / sizeof(abcde_paths[0]); i++) {
62+
fp = fopen(abcde_paths[i], "rb");
63+
if (fp) {
64+
abcde_ = abcde_paths[i];
65+
break;
66+
}
67+
}
68+
ASSERT_TRUE(fp != 0);
69+
fclose(fp);
5270
}
5371

5472
virtual void TearDown() {
@@ -64,6 +82,7 @@ class FileStreamTest : public ::testing::Test {
6482
const char* filename_;
6583
char *json_;
6684
size_t length_;
85+
const char* abcde_;
6786
};
6887

6988
FileStreamTest::~FileStreamTest() {}
@@ -86,6 +105,30 @@ TEST_F(FileStreamTest, FileReadStream) {
86105
fclose(fp);
87106
}
88107

108+
TEST_F(FileStreamTest, FileReadStream_Peek4) {
109+
FILE *fp = fopen(abcde_, "rb");
110+
ASSERT_TRUE(fp != 0);
111+
char buffer[4];
112+
FileReadStream s(fp, buffer, sizeof(buffer));
113+
114+
const char* c = s.Peek4();
115+
for (int i = 0; i < 4; i++)
116+
EXPECT_EQ('a' + i, c[i]);
117+
EXPECT_EQ(0u, s.Tell());
118+
119+
for (int i = 0; i < 5; i++) {
120+
EXPECT_EQ(static_cast<size_t>(i), s.Tell());
121+
EXPECT_EQ('a' + i, s.Peek());
122+
EXPECT_EQ('a' + i, s.Peek());
123+
EXPECT_EQ('a' + i, s.Take());
124+
}
125+
EXPECT_EQ(5u, s.Tell());
126+
EXPECT_EQ(0, s.Peek());
127+
EXPECT_EQ(0, s.Take());
128+
129+
fclose(fp);
130+
}
131+
89132
TEST_F(FileStreamTest, FileWriteStream) {
90133
char filename[L_tmpnam];
91134
FILE* fp = TempFile(filename);

0 commit comments

Comments
 (0)