Skip to content

Commit f68813f

Browse files
author
menghuiyu
committed
Fix inputstream cannot guarantee reading all bytes, resulting in mixed data and segmentation errors
1 parent 99625bd commit f68813f

1 file changed

Lines changed: 10 additions & 9 deletions

File tree

JavaCSV-Reloaded/src/com/csvreader/CsvReader.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ public CsvReader(Reader inputStream, char delimiter) {
205205
*
206206
* @param inputStream
207207
* The stream to use as the data source.
208-
* @param delimiter
208+
* @param delimiters
209209
* The character to use as the column delimiter.
210210
*/
211211
public CsvReader(Reader inputStream, List<String> delimiters) {
@@ -1317,9 +1317,8 @@ private void checkDataLength() throws IOException {
13171317
}
13181318

13191319
try {
1320-
// 读 1024 个字节到 dataBuffer 中
1321-
dataBuffer.Count = inputStream.read(dataBuffer.Buffer, 0,
1322-
dataBuffer.Buffer.length);
1320+
// Note: inputStream.read cannot guarantee reading the length byte of dataBuffer.Buffer.length
1321+
dataBuffer.Count = inputStream.read(dataBuffer.Buffer, 0, dataBuffer.Buffer.length);
13231322
} catch (IOException ex) {
13241323
close();
13251324

@@ -1715,16 +1714,18 @@ public int findDelimiterLen(char currentLetter, List<String> delimiters) throws
17151714
// Using pre ReadBuffer to read pre-read characters instead of expanding
17161715
// the dataBuffer length may result in OOM
17171716
char[] preReadBuffer = new char[0];
1718-
if (dataBuffer.Position + delimiterLen > dataBuffer.Buffer.length) {
1719-
skipLenInNextRead = dataBuffer.Position + delimiterLen - dataBuffer.Buffer.length;
1717+
if (dataBuffer.Position + delimiterLen > dataBuffer.Count) {
1718+
skipLenInNextRead = dataBuffer.Position + delimiterLen - dataBuffer.Count;
17201719
preReadBuffer = new char[skipLenInNextRead];
17211720
inputStream.mark(skipLenInNextRead);
1722-
inputStream.read(preReadBuffer, 0, skipLenInNextRead);
1721+
int count = inputStream.read(preReadBuffer, 0, skipLenInNextRead);
17231722
inputStream.reset();
1723+
// First, copy the bytes from the previous dataBuffer into the buffer
17241724
System.arraycopy(dataBuffer.Buffer, dataBuffer.Position, buffer, 0,
1725-
dataBuffer.Buffer.length - dataBuffer.Position);
1725+
dataBuffer.Count - dataBuffer.Position);
1726+
// Copy the remaining bytes from the preReadBuffer into the buffer
17261727
System.arraycopy(preReadBuffer, 0, buffer,
1727-
dataBuffer.Buffer.length - dataBuffer.Position, skipLenInNextRead);
1728+
dataBuffer.Count - dataBuffer.Position, skipLenInNextRead);
17281729
} else {
17291730
System.arraycopy(dataBuffer.Buffer, dataBuffer.Position, buffer, 0, delimiterLen);
17301731
}

0 commit comments

Comments
 (0)