]> granicus.if.org Git - pdns/commitdiff
dnsdist: Add checks for invalid position / buffer size on try*
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 24 Jun 2019 12:31:01 +0000 (14:31 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 24 Jun 2019 12:31:01 +0000 (14:31 +0200)
pdns/tcpiohandler.hh

index 33fc402a7ff74611eabf3941c422113571d11bb6..bc4a85f4101292027d738bf57b05ed05d2d73775 100644 (file)
@@ -200,8 +200,8 @@ public:
   */
   IOState tryRead(std::vector<uint8_t>& buffer, size_t& pos, size_t toRead)
   {
-    if (buffer.size() < (pos + toRead)) {
-      throw std::out_of_range("Calling tryRead() with a too small buffer (" + std::to_string(buffer.size()) + ") for a read of " + std::to_string(toRead) + " bytes starting at " + std::to_string(pos));
+    if (buffer.size() < toRead || pos >= toRead) {
+      throw std::out_of_range("Calling tryRead() with a too small buffer (" + std::to_string(buffer.size()) + ") for a read of " + std::to_string(toRead - pos) + " bytes starting at " + std::to_string(pos));
     }
 
     if (d_conn) {
@@ -237,6 +237,9 @@ public:
   */
   IOState tryWrite(std::vector<uint8_t>& buffer, size_t& pos, size_t toWrite)
   {
+    if (buffer.size() < toWrite || pos >= toWrite) {
+      throw std::out_of_range("Calling tryWrite() with a too small buffer (" + std::to_string(buffer.size()) + ") for a write of " + std::to_string(toWrite - pos) + " bytes starting at " + std::to_string(pos));
+    }
     if (d_conn) {
       return d_conn->tryWrite(buffer, pos, toWrite);
     }