@@ -178,28 +178,33 @@ long NodeBIO::Ctrl(BIO* bio, int cmd, long num, void* ptr) {
178178size_t NodeBIO::Read (char * out, size_t size) {
179179 size_t bytes_read = 0 ;
180180 size_t expected = Length () > size ? size : Length ();
181+ size_t offset = 0 ;
182+ size_t left = size;
181183
182184 while (bytes_read < expected) {
183185 assert (read_head_->read_pos_ <= read_head_->write_pos_ );
184186 size_t avail = read_head_->write_pos_ - read_head_->read_pos_ ;
185- if (avail > size )
186- avail = size ;
187+ if (avail > left )
188+ avail = left ;
187189
188190 // Copy data
189191 if (out != NULL )
190- memcpy (out, read_head_->data_ + read_head_->read_pos_ , avail);
192+ memcpy (out + offset , read_head_->data_ + read_head_->read_pos_ , avail);
191193 read_head_->read_pos_ += avail;
192194
193195 // Move pointers
194196 bytes_read += avail;
195- out += avail;
196- size -= avail;
197+ offset += avail;
198+ left -= avail;
197199
198200 // Move to next buffer
199201 if (read_head_->read_pos_ == read_head_->write_pos_ ) {
200202 read_head_->read_pos_ = 0 ;
201203 read_head_->write_pos_ = 0 ;
202- read_head_ = read_head_->next_ ;
204+
205+ // But not get beyond write_head_
206+ if (bytes_read != expected)
207+ read_head_ = read_head_->next_ ;
203208 }
204209 }
205210 assert (expected == bytes_read);
@@ -212,13 +217,14 @@ size_t NodeBIO::Read(char* out, size_t size) {
212217size_t NodeBIO::IndexOf (char delim, size_t limit) {
213218 size_t bytes_read = 0 ;
214219 size_t max = Length () > limit ? limit : Length ();
220+ size_t left = limit;
215221 Buffer* current = read_head_;
216222
217223 while (bytes_read < max) {
218224 assert (current->read_pos_ <= current->write_pos_ );
219225 size_t avail = current->write_pos_ - current->read_pos_ ;
220- if (avail > limit )
221- avail = limit ;
226+ if (avail > left )
227+ avail = left ;
222228
223229 // Walk through data
224230 char * tmp = current->data_ + current->read_pos_ ;
@@ -230,7 +236,7 @@ size_t NodeBIO::IndexOf(char delim, size_t limit) {
230236
231237 // Move pointers
232238 bytes_read += off;
233- limit -= off;
239+ left -= off;
234240
235241 // Found `delim`
236242 if (off != avail) {
@@ -248,38 +254,40 @@ size_t NodeBIO::IndexOf(char delim, size_t limit) {
248254}
249255
250256
251- void NodeBIO::Write (const char * data, size_t len) {
252- while (len > 0 ) {
253- size_t to_write = len;
257+ void NodeBIO::Write (const char * data, size_t size) {
258+ size_t offset = 0 ;
259+ size_t left = size;
260+ while (left > 0 ) {
261+ size_t to_write = left;
254262 assert (write_head_->write_pos_ <= kBufferLength );
255263 size_t avail = kBufferLength - write_head_->write_pos_ ;
256264
257265 if (to_write > avail)
258266 to_write = avail;
259267
260268 // Copy data
261- memcpy (write_head_->data_ + write_head_->write_pos_ , data, to_write);
262- write_head_-> write_pos_ += to_write;
263- assert (write_head_-> write_pos_ <= kBufferLength );
269+ memcpy (write_head_->data_ + write_head_->write_pos_ ,
270+ data + offset,
271+ to_write );
264272
265273 // Move pointers
266- len -= to_write;
267- data += to_write;
274+ left -= to_write;
275+ offset += to_write;
268276 length_ += to_write;
277+ write_head_->write_pos_ += to_write;
278+ assert (write_head_->write_pos_ <= kBufferLength );
269279
270- // Still have some bytes left:
271- // 1. Go to next buffer
272- // 2. Allocate new if next is already full or is partially read
273- // (is read head)
274- if (write_head_->next_ ->write_pos_ == kBufferLength ||
275- write_head_->next_ ->read_pos_ != 0 ) {
276- Buffer* next = new Buffer ();
277- next->next_ = write_head_->next_ ;
278- write_head_->next_ = next;
280+ // Go to next buffer if there still are some bytes to write
281+ if (left != 0 ) {
282+ if (write_head_->next_ ->write_pos_ == kBufferLength ) {
283+ Buffer* next = new Buffer ();
284+ next->next_ = write_head_->next_ ;
285+ write_head_->next_ = next;
286+ }
287+ write_head_ = write_head_->next_ ;
279288 }
280- write_head_ = write_head_->next_ ;
281289 }
282- assert (len == 0 );
290+ assert (left == 0 );
283291}
284292
285293
0 commit comments