diff options
| author | Joel Klinghed <the_jk@spawned.biz> | 2025-09-10 23:57:12 +0200 |
|---|---|---|
| committer | Joel Klinghed <the_jk@spawned.biz> | 2025-09-10 23:57:12 +0200 |
| commit | ac878281d42b9e5291f96204283c65229c8f392a (patch) | |
| tree | 9ec07abf89e176e675c04dca86bdcccec87c198f /src/buffer.cc | |
| parent | 32e14551a90e85000e41b3f0445d34d58a1431e4 (diff) | |
Fix issues in buffer
Diffstat (limited to 'src/buffer.cc')
| -rw-r--r-- | src/buffer.cc | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/src/buffer.cc b/src/buffer.cc index 65c6757..3073a45 100644 --- a/src/buffer.cc +++ b/src/buffer.cc @@ -20,7 +20,7 @@ class FixedBuffer : public Buffer { avail = 0; } else { avail = (data_.get() + size_) - rptr_; - if (avail < need) { + if (avail < need && rptr_ > data_.get()) { rotate(); return rptr(avail, need); } @@ -36,7 +36,7 @@ class FixedBuffer : public Buffer { if (rptr_ == wptr_) reset(); } else { - assert(rptr_ != wptr_ || !full_); + assert(rptr_ != wptr_ || full_); assert(std::cmp_greater_equal((data_.get() + size_) - rptr_, size)); rptr_ += size; if (rptr_ == data_.get() + size_) { @@ -59,7 +59,7 @@ class FixedBuffer : public Buffer { avail = 0; } else { avail = (data_.get() + size_) - wptr_; - if (avail < need) { + if (avail < need && rptr_ > data_.get()) { rotate(); return wptr(avail, need); } @@ -102,18 +102,24 @@ class FixedBuffer : public Buffer { } void rotate() { - size_t to_move = (data_.get() + size_) - rptr_; - if (wptr_ + to_move > rptr_) { - auto tmp = std::make_unique_for_overwrite<char[]>(to_move); - memcpy(tmp.get(), rptr_, to_move); - memmove(data_.get() + to_move, data_.get(), wptr_ - data_.get()); - memcpy(data_.get(), tmp.get(), to_move); + if (rptr_ < wptr_) { + size_t size = wptr_ - rptr_; + memmove(data_.get(), rptr_, size); + wptr_ = data_.get() + size; } else { - memmove(data_.get() + to_move, data_.get(), wptr_ - data_.get()); - memcpy(data_.get(), rptr_, to_move); + size_t to_move = (data_.get() + size_) - rptr_; + if (wptr_ + to_move > rptr_) { + auto tmp = std::make_unique_for_overwrite<char[]>(to_move); + memcpy(tmp.get(), rptr_, to_move); + memmove(data_.get() + to_move, data_.get(), wptr_ - data_.get()); + memcpy(data_.get(), tmp.get(), to_move); + } else { + memmove(data_.get() + to_move, data_.get(), wptr_ - data_.get()); + memcpy(data_.get(), rptr_, to_move); + } + wptr_ += to_move; } rptr_ = data_.get(); - wptr_ += to_move; } size_t const size_; |
