]> source.dussan.org Git - tigervnc.git/commitdiff
Use specific class for protocol problems
authorPierre Ossman <ossman@cendio.se>
Tue, 3 Sep 2024 06:01:39 +0000 (08:01 +0200)
committerPierre Ossman <ossman@cendio.se>
Wed, 6 Nov 2024 20:06:27 +0000 (21:06 +0100)
Make it easier to identify communication issues.

19 files changed:
common/rfb/CConnection.cxx
common/rfb/CMsgReader.cxx
common/rfb/CSecurityDH.cxx
common/rfb/CSecurityRSAAES.cxx
common/rfb/CSecurityTLS.cxx
common/rfb/CSecurityVeNCrypt.cxx
common/rfb/DecodeManager.cxx
common/rfb/Exception.h
common/rfb/HextileDecoder.cxx
common/rfb/JpegDecompressor.cxx
common/rfb/PixelFormat.cxx
common/rfb/RREDecoder.cxx
common/rfb/SConnection.cxx
common/rfb/SMsgReader.cxx
common/rfb/SSecurityRSAAES.cxx
common/rfb/SSecurityVeNCrypt.cxx
common/rfb/TightDecoder.cxx
common/rfb/VNCSConnectionST.cxx
common/rfb/ZRLEDecoder.cxx

index 244c88622c2aa19575e32c0b64a13b3c6965f327..8a718b5f2d3b63c2fcd91e515dd73050329d96ab 100644 (file)
@@ -172,7 +172,7 @@ bool CConnection::processVersionMsg()
   if (sscanf(verStr, "RFB %03d.%03d\n",
              &majorVersion, &minorVersion) != 2) {
     state_ = RFBSTATE_INVALID;
-    throw Exception("reading version failed: not an RFB server?");
+    throw ProtocolException("reading version failed: not an RFB server?");
   }
 
   server.setVersion(majorVersion, minorVersion);
@@ -185,8 +185,10 @@ bool CConnection::processVersionMsg()
     vlog.error("Server gave unsupported RFB protocol version %d.%d",
                server.majorVersion, server.minorVersion);
     state_ = RFBSTATE_INVALID;
-    throw Exception(format("Server gave unsupported RFB protocol version %d.%d",
-                           server.majorVersion, server.minorVersion));
+    throw ProtocolException(format("Server gave unsupported RFB "
+                                   "protocol version %d.%d",
+                                   server.majorVersion,
+                                   server.minorVersion));
   } else if (server.beforeVersion(3,7)) {
     server.setVersion(3,3);
   } else if (server.afterVersion(3,8)) {
@@ -233,7 +235,7 @@ bool CConnection::processSecurityTypesMsg()
         secType = secTypeInvalid;
     } else {
       vlog.error("Unknown 3.3 security type %d", secType);
-      throw Exception("Unknown 3.3 security type");
+      throw ProtocolException("Unknown 3.3 security type");
     }
 
   } else {
@@ -283,7 +285,7 @@ bool CConnection::processSecurityTypesMsg()
   if (secType == secTypeInvalid) {
     state_ = RFBSTATE_INVALID;
     vlog.error("No matching security types");
-    throw Exception("No matching security types");
+    throw ProtocolException("No matching security types");
   }
 
   state_ = RFBSTATE_SECURITY;
@@ -327,7 +329,7 @@ bool CConnection::processSecurityResultMsg()
     vlog.debug("auth failed - too many tries");
     break;
   default:
-    throw Exception("Unknown security result from server");
+    throw ProtocolException("Unknown security result from server");
   }
 
   if (server.beforeVersion(3,8)) {
index c94ecfd8c421af8a33b8fcdf9b7d8b07a25e6bb7..17c92227a68018271da6669ce3082c4b2d8e20f5 100644 (file)
@@ -119,7 +119,7 @@ bool CMsgReader::readMsg()
       ret = readEndOfContinuousUpdates();
       break;
     default:
-      throw Exception(format("Unknown message type %d", currentMsgType));
+      throw ProtocolException(format("Unknown message type %d", currentMsgType));
     }
 
     if (ret)
@@ -301,7 +301,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
     return false;
 
   if (len < 4)
-    throw Exception("Invalid extended clipboard message");
+    throw ProtocolException("Invalid extended clipboard message");
   if (len > maxCutText) {
     vlog.error("Extended clipboard message too long (%d bytes) - ignoring", len);
     is->skip(len);
@@ -323,7 +323,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
     }
 
     if (len < (int32_t)(4 + 4*num))
-      throw Exception("Invalid extended clipboard message");
+      throw ProtocolException("Invalid extended clipboard message");
 
     num = 0;
     for (i = 0;i < 16;i++) {
@@ -348,7 +348,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
         continue;
 
       if (!zis.hasData(4))
-        throw Exception("Extended clipboard decode error");
+        throw ProtocolException("Extended clipboard decode error");
 
       lengths[num] = zis.readU32();
 
@@ -361,7 +361,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
           size_t chunk;
 
           if (!zis.hasData(1))
-            throw Exception("Extended clipboard decode error");
+            throw ProtocolException("Extended clipboard decode error");
 
           chunk = zis.avail();
           if (chunk > lengths[num])
@@ -377,7 +377,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
       }
 
       if (!zis.hasData(lengths[num]))
-        throw Exception("Extended clipboard decode error");
+        throw ProtocolException("Extended clipboard decode error");
 
       buffers[num] = new uint8_t[lengths[num]];
       zis.readBytes(buffers[num], lengths[num]);
@@ -407,7 +407,7 @@ bool CMsgReader::readExtendedClipboard(int32_t len)
       handler->handleClipboardNotify(flags);
       break;
     default:
-      throw Exception("Invalid extended clipboard action");
+      throw ProtocolException("Invalid extended clipboard action");
     }
   }
 
@@ -473,7 +473,7 @@ bool CMsgReader::readRect(const Rect& r, int encoding)
     vlog.error("Rect too big: %dx%d at %d,%d exceeds %dx%d",
            r.width(), r.height(), r.tl.x, r.tl.y,
             handler->server.width(), handler->server.height());
-    throw Exception("Rect too big");
+    throw ProtocolException("Rect too big");
   }
 
   if (r.is_empty())
@@ -485,7 +485,7 @@ bool CMsgReader::readRect(const Rect& r, int encoding)
 bool CMsgReader::readSetXCursor(int width, int height, const Point& hotspot)
 {
   if (width > maxCursorSize || height > maxCursorSize)
-    throw Exception("Too big cursor");
+    throw ProtocolException("Too big cursor");
 
   std::vector<uint8_t> rgba(width*height*4);
 
@@ -549,7 +549,7 @@ bool CMsgReader::readSetXCursor(int width, int height, const Point& hotspot)
 bool CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
 {
   if (width > maxCursorSize || height > maxCursorSize)
-    throw Exception("Too big cursor");
+    throw ProtocolException("Too big cursor");
 
   int data_len = width * height * (handler->server.pf().bpp/8);
   int mask_len = ((width+7)/8) * height;
@@ -595,7 +595,7 @@ bool CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
 bool CMsgReader::readSetCursorWithAlpha(int width, int height, const Point& hotspot)
 {
   if (width > maxCursorSize || height > maxCursorSize)
-    throw Exception("Too big cursor");
+    throw ProtocolException("Too big cursor");
 
   const PixelFormat rgbaPF(32, 32, false, true, 255, 255, 255, 16, 8, 0);
   ManagedPixelBuffer pb(rgbaPF, width, height);
@@ -656,7 +656,7 @@ bool CMsgReader::readSetCursorWithAlpha(int width, int height, const Point& hots
 bool CMsgReader::readSetVMwareCursor(int width, int height, const Point& hotspot)
 {
   if (width > maxCursorSize || height > maxCursorSize)
-    throw Exception("Too big cursor");
+    throw ProtocolException("Too big cursor");
 
   uint8_t type;
 
@@ -750,7 +750,7 @@ bool CMsgReader::readSetVMwareCursor(int width, int height, const Point& hotspot
 
     handler->setCursor(width, height, hotspot, data.data());
   } else {
-    throw Exception("Unknown cursor type");
+    throw ProtocolException("Unknown cursor type");
   }
 
   return true;
index e37a3a3391b5ec3a69cdd2a52940c420d32bfc1c..ca110cb2c237aa2cbbf2b0544dafd6c874662866 100644 (file)
@@ -86,9 +86,9 @@ bool CSecurityDH::readKey()
   uint16_t gen = is->readU16();
   keyLength = is->readU16();
   if (keyLength < MinKeyLength)
-    throw Exception("DH key is too short");
+    throw ProtocolException("DH key is too short");
   if (keyLength > MaxKeyLength)
-    throw Exception("DH key is too long");
+    throw ProtocolException("DH key is too long");
   if (!is->hasDataOrRestore(keyLength * 2))
     return false;
   is->clearRestorePoint();
index 37b595321e004bccdf2a5cf011ac497334911beb..11c392d5b1765e25cf462a40b39d1fcfceb5176e 100644 (file)
@@ -174,9 +174,9 @@ bool CSecurityRSAAES::readPublicKey()
   is->setRestorePoint();
   serverKeyLength = is->readU32();
   if (serverKeyLength < MinKeyLength)
-    throw Exception("server key is too short");
+    throw ProtocolException("server key is too short");
   if (serverKeyLength > MaxKeyLength)
-    throw Exception("server key is too long");
+    throw ProtocolException("server key is too long");
   size_t size = (serverKeyLength + 7) / 8;
   if (!is->hasDataOrRestore(size * 2))
     return false;
@@ -189,7 +189,7 @@ bool CSecurityRSAAES::readPublicKey()
   nettle_mpz_set_str_256_u(serverKey.n, size, serverKeyN);
   nettle_mpz_set_str_256_u(serverKey.e, size, serverKeyE);
   if (!rsa_public_key_prepare(&serverKey))
-    throw Exception("server key is invalid");
+    throw ProtocolException("server key is invalid");
   return true;
 }
 
@@ -255,7 +255,7 @@ bool CSecurityRSAAES::readRandom()
   is->setRestorePoint();
   size_t size = is->readU16();
   if (size != clientKey.size)
-    throw Exception("client key length doesn't match");
+    throw ProtocolException("client key length doesn't match");
   if (!is->hasDataOrRestore(size))
     return false;
   is->clearRestorePoint();
@@ -268,7 +268,7 @@ bool CSecurityRSAAES::readRandom()
   if (!rsa_decrypt(&clientKey, &randomSize, serverRandom, x) ||
       randomSize != (size_t)keySize / 8) {
     mpz_clear(x);
-    throw Exception("failed to decrypt server random");
+    throw ProtocolException("failed to decrypt server random");
   }
   mpz_clear(x);
   return true;
@@ -397,7 +397,7 @@ bool CSecurityRSAAES::readHash()
     sha256_digest(&ctx, hashSize, realHash);
   }
   if (memcmp(hash, realHash, hashSize) != 0)
-    throw Exception("hash doesn't match");
+    throw ProtocolException("hash doesn't match");
   return true;
 }
 
@@ -427,7 +427,7 @@ bool CSecurityRSAAES::readSubtype()
     return false;
   subtype = rais->readU8();
   if (subtype != secTypeRA2UserPass && subtype != secTypeRA2Pass)
-    throw Exception("unknown RSA-AES subtype");
+    throw ProtocolException("unknown RSA-AES subtype");
   return true;
 }
 
index ae916139edf5681553b96eba14f4843b6e280887..fc1cde8e2b59f260d559ca2a0f2fd4f616d9a3cc 100644 (file)
@@ -146,7 +146,7 @@ bool CSecurityTLS::processMsg()
       return false;
 
     if (is->readU8() == 0)
-      throw Exception("Server failed to initialize TLS session");
+      throw ProtocolException("Server failed to initialize TLS session");
 
     ret = gnutls_init(&session, GNUTLS_CLIENT);
     if (ret != GNUTLS_E_SUCCESS)
@@ -312,7 +312,7 @@ void CSecurityTLS::checkSession()
     return;
 
   if (gnutls_certificate_type_get(session) != GNUTLS_CRT_X509)
-    throw Exception("unsupported certificate type");
+    throw ProtocolException("unsupported certificate type");
 
   err = gnutls_certificate_verify_peers2(session, &status);
   if (err != 0) {
@@ -340,8 +340,8 @@ void CSecurityTLS::checkSession()
 
       gnutls_free(status_str.data);
 
-      throw Exception(format("Invalid server certificate: %s",
-                             error.c_str()));
+      throw ProtocolException(format("Invalid server certificate: %s",
+                                     error.c_str()));
     }
 
     err = gnutls_certificate_verification_status_print(status,
@@ -360,7 +360,7 @@ void CSecurityTLS::checkSession()
 
   cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
   if (!cert_list_size)
-    throw Exception("empty certificate chain");
+    throw ProtocolException("empty certificate chain");
 
   /* Process only server's certificate, not issuer's certificate */
   gnutls_x509_crt_t crt;
index 3ebb38552c2f3a45404dec8da85e8466788300a3..606fd96f6069933d4615c5b3e9f345b4db1f27a3 100644 (file)
@@ -105,7 +105,7 @@ bool CSecurityVeNCrypt::processMsg()
       os->writeU8(0);
       os->writeU8(0);
       os->flush();
-      throw Exception("The server reported an unsupported VeNCrypt version");
+      throw ProtocolException("The server reported an unsupported VeNCrypt version");
      }
 
      haveSentVersion = true;
@@ -117,8 +117,8 @@ bool CSecurityVeNCrypt::processMsg()
       return false;
 
     if (is->readU8())
-      throw Exception("The server reported it could not support the "
-                      "VeNCrypt version");
+      throw ProtocolException("The server reported it could not "
+                              "support the VeNCrypt version");
 
     haveAgreedVersion = true;
   }
@@ -131,7 +131,7 @@ bool CSecurityVeNCrypt::processMsg()
     nAvailableTypes = is->readU8();
 
     if (!nAvailableTypes)
-      throw Exception("The server reported no VeNCrypt sub-types");
+      throw ProtocolException("The server reported no VeNCrypt sub-types");
 
     availableTypes = new uint32_t[nAvailableTypes];
     haveNumberOfTypes = true;
@@ -172,7 +172,7 @@ bool CSecurityVeNCrypt::processMsg()
 
       /* Set up the stack according to the chosen type: */
       if (chosenType == secTypeInvalid || chosenType == secTypeVeNCrypt)
-        throw Exception("No valid VeNCrypt sub-type");
+        throw ProtocolException("No valid VeNCrypt sub-type");
 
       vlog.info("Choosing security type %s (%d)", secTypeName(chosenType),
                 chosenType);
@@ -191,7 +191,7 @@ bool CSecurityVeNCrypt::processMsg()
      * happen, since if the server supports 0 sub-types, it doesn't support
      * this security type
      */
-    throw Exception("The server reported 0 VeNCrypt sub-types");
+    throw ProtocolException("The server reported 0 VeNCrypt sub-types");
   }
 
   return csecurity->processMsg();
index 2b121ebe81af4f4fe300055563a166d97ba8ff9b..0475d62d087505e573953e0b88f06cecfc16edde 100644 (file)
@@ -114,14 +114,14 @@ bool DecodeManager::decodeRect(const Rect& r, int encoding,
 
   if (!Decoder::supported(encoding)) {
     vlog.error("Unknown encoding %d", encoding);
-    throw rdr::Exception("Unknown encoding");
+    throw ProtocolException("Unknown encoding");
   }
 
   if (!decoders[encoding]) {
     decoders[encoding] = Decoder::createDecoder(encoding);
     if (!decoders[encoding]) {
       vlog.error("Unknown encoding %d", encoding);
-      throw rdr::Exception("Unknown encoding");
+      throw ProtocolException("Unknown encoding");
     }
   }
 
index 3c8a461c02f60bbc399f5d5d7c419cd13b5b9674..b11609d01e9166fb625571335b2444ef3f848b38 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
+ * Copyright 2014-2024 Pierre Ossman for Cendio AB
  * 
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 namespace rfb {
   typedef rdr::Exception Exception;
+
+  class ProtocolException : public Exception {
+  public:
+    ProtocolException(const char* what_arg) : Exception(what_arg) {}
+    ProtocolException(const std::string& what_arg) : Exception(what_arg) {}
+  };
+
   struct AuthFailureException : public Exception {
     AuthFailureException(const char* reason)
       : Exception(reason) {}
index dc9b9be72f32730313ca72b8eb1abf5cc2f18215..d440b1af2ec52d7a8ecde5149326c3b935143dd9 100644 (file)
@@ -189,7 +189,7 @@ void HextileDecoder::hextileDecode(const Rect& r, rdr::InStream* is,
           int w = ((wh >> 4) & 15) + 1;
           int h = (wh & 15) + 1;
           if (x + w > 16 || y + h > 16) {
-            throw rfb::Exception("HEXTILE_DECODE: Hextile out of bounds");
+            throw ProtocolException("HEXTILE_DECODE: Hextile out of bounds");
           }
           ptr = buf + y * t.width() + x;
           int rowAdd = t.width() - w;
index 9406b43d5e4c4057e71152686d525deb93327318..60c215fc78c66999da5126dc0c6c320742d719e1 100644 (file)
@@ -24,7 +24,7 @@
 #endif
 
 #include <rfb/JpegDecompressor.h>
-#include <rdr/Exception.h>
+#include <rfb/Exception.h>
 #include <rfb/Rect.h>
 #include <rfb/PixelFormat.h>
 
@@ -217,7 +217,7 @@ void JpegDecompressor::decompress(const uint8_t *jpegBuf,
     jpeg_abort_decompress(dinfo);
     if (dstBufIsTemp && dstBuf) delete[] dstBuf;
     if (rowPointer) delete[] rowPointer;
-    throw rdr::Exception("Tight Decoding: Wrong JPEG data received.\n");
+    throw ProtocolException("Tight Decoding: Wrong JPEG data received.\n");
   }
 
   while (dinfo->output_scanline < dinfo->output_height) {
index f883cbf5513e63ad726581c643987113edd7719c..a538deb72041780c701d243243ad7f1619ab034e 100644 (file)
@@ -180,7 +180,7 @@ void PixelFormat::read(rdr::InStream* is)
   }
 
   if (!isSane())
-    throw Exception("invalid pixel format");
+    throw ProtocolException("invalid pixel format");
 
   updateState();
 }
index 41bf501a241e1cf8ca05c9f9496e0642ab6c4244..4f2db0710c0e9767040a387fc87715cf5dc051be 100644 (file)
@@ -107,7 +107,7 @@ void RREDecoder::rreDecode(const Rect& r, rdr::InStream* is,
     int h = is->readU16();
 
     if (((x+w) > r.width()) || ((y+h) > r.height()))
-      throw Exception ("RRE decode error");
+      throw ProtocolException("RRE decode error");
 
     pb->fillRect(pf, Rect(r.tl.x+x, r.tl.y+y, r.tl.x+x+w, r.tl.y+y+h), &pix);
   }
index cf9dde056b99f0519902fc7b91b975f1d14d8a19..6e58b3b463e8e1c49e8ee3f21a302b2b1e5c67a3 100644 (file)
@@ -123,7 +123,7 @@ bool SConnection::processVersionMsg()
   if (sscanf(verStr, "RFB %03d.%03d\n",
              &majorVersion, &minorVersion) != 2) {
     state_ = RFBSTATE_INVALID;
-    throw Exception("reading version failed: not an RFB client?");
+    throw ProtocolException("reading version failed: not an RFB client?");
   }
 
   client.setVersion(majorVersion, minorVersion);
@@ -215,7 +215,7 @@ void SConnection::processSecurityType(int secType)
   secTypes = security.GetEnabledSecTypes();
   if (std::find(secTypes.begin(), secTypes.end(),
                 secType) == secTypes.end())
-    throw Exception("Requested security type not available");
+    throw ProtocolException("Requested security type not available");
 
   vlog.info("Client requests security type %s(%d)",
             secTypeName(secType),secType);
@@ -320,7 +320,7 @@ void SConnection::failConnection(const char* message)
   }
 
   state_ = RFBSTATE_INVALID;
-  throw Exception(message);
+  throw ProtocolException(message);
 }
 
 void SConnection::failConnection(const std::string& message)
index 5b1b0eaa04c42f9dc69fb9d90fe1ce162c2fc4da..ee37370efa049b2f497aaa519ffcefe54b3cfdcc 100644 (file)
@@ -107,7 +107,7 @@ bool SMsgReader::readMsg()
     break;
   default:
     vlog.error("unknown message type %d", currentMsgType);
-    throw Exception("unknown message type");
+    throw ProtocolException("unknown message type");
   }
 
   if (ret)
@@ -334,7 +334,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
     return false;
 
   if (len < 4)
-    throw Exception("Invalid extended clipboard message");
+    throw ProtocolException("Invalid extended clipboard message");
   if (len > maxCutText) {
     vlog.error("Extended clipboard message too long (%d bytes) - ignoring", len);
     is->skip(len);
@@ -356,7 +356,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
     }
 
     if (len < (int32_t)(4 + 4*num))
-      throw Exception("Invalid extended clipboard message");
+      throw ProtocolException("Invalid extended clipboard message");
 
     num = 0;
     for (i = 0;i < 16;i++) {
@@ -381,7 +381,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
         continue;
 
       if (!zis.hasData(4))
-        throw Exception("Extended clipboard decode error");
+        throw ProtocolException("Extended clipboard decode error");
 
       lengths[num] = zis.readU32();
 
@@ -394,7 +394,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
           size_t chunk;
 
           if (!zis.hasData(1))
-            throw Exception("Extended clipboard decode error");
+            throw ProtocolException("Extended clipboard decode error");
 
           chunk = zis.avail();
           if (chunk > lengths[num])
@@ -410,7 +410,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
       }
 
       if (!zis.hasData(lengths[num]))
-        throw Exception("Extended clipboard decode error");
+        throw ProtocolException("Extended clipboard decode error");
 
       buffers[num] = new uint8_t[lengths[num]];
       zis.readBytes(buffers[num], lengths[num]);
@@ -440,7 +440,7 @@ bool SMsgReader::readExtendedClipboard(int32_t len)
       handler->handleClipboardNotify(flags);
       break;
     default:
-      throw Exception("Invalid extended clipboard action");
+      throw ProtocolException("Invalid extended clipboard action");
     }
   }
 
@@ -464,7 +464,7 @@ bool SMsgReader::readQEMUMessage()
     ret = readQEMUKeyEvent();
     break;
   default:
-    throw Exception(format("unknown QEMU submessage type %d", subType));
+    throw ProtocolException(format("unknown QEMU submessage type %d", subType));
   }
 
   if (!ret) {
index 10e901fbb240f0ac8ab078287ffe917471773196..c2fb0f6f36cf758c0da6defbb0ae047f096ed912 100644 (file)
@@ -36,6 +36,7 @@
 #include <nettle/sha2.h>
 #include <nettle/base64.h>
 #include <nettle/asn1.h>
+
 #include <rfb/SSecurityRSAAES.h>
 #include <rfb/SConnection.h>
 #include <rfb/LogWriter.h>
@@ -296,9 +297,9 @@ bool SSecurityRSAAES::readPublicKey()
   is->setRestorePoint();
   clientKeyLength = is->readU32();
   if (clientKeyLength < MinKeyLength)
-    throw Exception("client key is too short");
+    throw ProtocolException("client key is too short");
   if (clientKeyLength > MaxKeyLength)
-    throw Exception("client key is too long");
+    throw ProtocolException("client key is too long");
   size_t size = (clientKeyLength + 7) / 8;
   if (!is->hasDataOrRestore(size * 2))
     return false;
@@ -311,7 +312,7 @@ bool SSecurityRSAAES::readPublicKey()
   nettle_mpz_set_str_256_u(clientKey.n, size, clientKeyN);
   nettle_mpz_set_str_256_u(clientKey.e, size, clientKeyE);
   if (!rsa_public_key_prepare(&clientKey))
-    throw Exception("client key is invalid");
+    throw ProtocolException("client key is invalid");
   return true;
 }
 
@@ -360,7 +361,7 @@ bool SSecurityRSAAES::readRandom()
   is->setRestorePoint();
   size_t size = is->readU16();
   if (size != serverKey.size)
-    throw Exception("server key length doesn't match");
+    throw ProtocolException("server key length doesn't match");
   if (!is->hasDataOrRestore(size))
     return false;
   is->clearRestorePoint();
@@ -373,7 +374,7 @@ bool SSecurityRSAAES::readRandom()
   if (!rsa_decrypt(&serverKey, &randomSize, clientRandom, x) ||
     randomSize != (size_t)keySize / 8) {
     mpz_clear(x);
-    throw Exception("failed to decrypt client random");
+    throw ProtocolException("failed to decrypt client random");
   }
   mpz_clear(x);
   return true;
@@ -502,7 +503,7 @@ bool SSecurityRSAAES::readHash()
     sha256_digest(&ctx, hashSize, realHash);
   }
   if (memcmp(hash, realHash, hashSize) != 0)
-    throw Exception("hash doesn't match");
+    throw ProtocolException("hash doesn't match");
   return true;
 }
 
index 164ea927b990534d4b47e94892037b92809927b0..e4347fb6b8c7b47f92860809a5f39a9af5661c10 100644 (file)
@@ -99,8 +99,8 @@ bool SSecurityVeNCrypt::processMsg()
     case 0x0001: /* 0.1 Legacy VeNCrypt, not supported */
       os->writeU8(0xFF); /* This is not OK */
       os->flush();
-      throw Exception("The client cannot support the server's "
-                       "VeNCrypt version");
+      throw ProtocolException("The client cannot support the server's "
+                              "VeNCrypt version");
 
     case 0x0002: /* 0.2 */
       os->writeU8(0); /* OK */
@@ -109,7 +109,7 @@ bool SSecurityVeNCrypt::processMsg()
     default:
       os->writeU8(0xFF); /* Not OK */
       os->flush();
-      throw Exception("The client returned an unsupported VeNCrypt version");
+      throw ProtocolException("The client returned an unsupported VeNCrypt version");
     }
   }
 
@@ -138,7 +138,7 @@ bool SSecurityVeNCrypt::processMsg()
       os->flush(); 
       haveSentTypes = true;
     } else
-      throw Exception("There are no VeNCrypt sub-types to send to the client");
+      throw ProtocolException("There are no VeNCrypt sub-types to send to the client");
   }
 
   /* get type back from client (must be one of the ones we sent) */
@@ -163,7 +163,7 @@ bool SSecurityVeNCrypt::processMsg()
 
     /* Set up the stack according to the chosen type */
     if (chosenType == secTypeInvalid || chosenType == secTypeVeNCrypt)
-      throw Exception("No valid VeNCrypt sub-type");
+      throw ProtocolException("No valid VeNCrypt sub-type");
 
     ssecurity = security->GetSSecurity(sc, chosenType);
   }
index 89d2e839681c9f9961c99e827e37a17c56f4470a..ff05b279f18c090de3e58652e50f17cdebe156bf 100644 (file)
@@ -104,14 +104,14 @@ bool TightDecoder::readRect(const Rect& r, rdr::InStream* is,
 
   // Quit on unsupported compression type.
   if (comp_ctl > tightMaxSubencoding)
-    throw Exception("TightDecoder: bad subencoding value received");
+    throw ProtocolException("TightDecoder: bad subencoding value received");
 
   // "Basic" compression type.
 
   int palSize = 0;
 
   if (r.width() > TIGHT_MAX_WIDTH)
-    throw Exception(format("TightDecoder: too large rectangle (%d pixels)", r.width()));
+    throw ProtocolException(format("TightDecoder: too large rectangle (%d pixels)", r.width()));
 
   // Possible palette
   if ((comp_ctl & tightExplicitFilter) != 0) {
@@ -143,12 +143,12 @@ bool TightDecoder::readRect(const Rect& r, rdr::InStream* is,
       break;
     case tightFilterGradient:
       if (server.pf().bpp == 8)
-        throw Exception("TightDecoder: invalid BPP for gradient filter");
+        throw ProtocolException("TightDecoder: invalid BPP for gradient filter");
       break;
     case tightFilterCopy:
       break;
     default:
-      throw Exception("TightDecoder: unknown filter code received");
+      throw ProtocolException("TightDecoder: unknown filter code received");
     }
   }
 
@@ -384,7 +384,7 @@ void TightDecoder::decodeRect(const Rect& r, const uint8_t* buffer,
     netbuf = new uint8_t[dataSize];
 
     if (!zis[streamId].hasData(dataSize))
-      throw Exception("Tight decode error");
+      throw ProtocolException("Tight decode error");
     zis[streamId].readBytes(netbuf, dataSize);
 
     zis[streamId].flushUnderlying();
index 9cdf289d715eec25e717258a3e755acb888e9f91..7fa8f626c3ec7a20cc58ce7e65c012b6fba17ca4 100644 (file)
@@ -728,7 +728,7 @@ void VNCSConnectionST::enableContinuousUpdates(bool enable,
   Rect rect;
 
   if (!client.supportsFence() || !client.supportsContinuousUpdates())
-    throw Exception("Client tried to enable continuous updates when not allowed");
+    throw ProtocolException("Client tried to enable continuous updates when not allowed");
 
   continuousUpdates = enable;
 
index e274a697ac48574afbc8189f7b298b1c5ba1f38c..eab16bafa7093c6c52786ae1769c4988361bb37e 100644 (file)
@@ -64,7 +64,7 @@ static inline T readPixel(rdr::ZlibInStream* zis)
 static inline void zlibHasData(rdr::ZlibInStream* zis, size_t length)
 {
   if (!zis->hasData(length))
-    throw Exception("ZRLE decode error");
+    throw ProtocolException("ZRLE decode error");
 }
 
 ZRLEDecoder::ZRLEDecoder() : Decoder(DecoderOrdered)
@@ -242,7 +242,7 @@ void ZRLEDecoder::zrleDecode(const Rect& r, rdr::InStream* is,
             } while (b == 255);
 
             if (end - ptr < len) {
-              throw Exception ("ZRLE decode error");
+              throw ProtocolException("ZRLE decode error");
             }
 
             while (len-- > 0) *ptr++ = pix;
@@ -267,7 +267,7 @@ void ZRLEDecoder::zrleDecode(const Rect& r, rdr::InStream* is,
               } while (b == 255);
 
               if (end - ptr < len) {
-                throw Exception ("ZRLE decode error");
+                throw ProtocolException("ZRLE decode error");
               }
             }