]> source.dussan.org Git - tigervnc.git/commitdiff
Don't modify exception description dynamically
authorPierre Ossman <ossman@cendio.se>
Mon, 2 Sep 2024 14:37:36 +0000 (16:37 +0200)
committerPierre Ossman <ossman@cendio.se>
Wed, 6 Nov 2024 20:06:27 +0000 (21:06 +0100)
In preparation for using the built-in exception types, where the string
can only be set via the constructor.

common/rdr/Exception.cxx
common/rdr/Exception.h

index 277da53303b97f9235c33ad6b5966786b763b316..53637cac7b2c45baec589f4ffa5e360f7e67a394 100644 (file)
@@ -28,6 +28,8 @@
 
 #include <rdr/Exception.h>
 #include <rdr/TLSException.h>
+#include <rfb/util.h>
+
 #ifdef _WIN32
 #include <winsock2.h>
 #include <windows.h>
 
 #include <string.h>
 
-#ifdef HAVE_GNUTLS
-#include <gnutls/gnutls.h>
-#endif
-
 using namespace rdr;
 
 Exception::Exception(const char *message)
 {
-  snprintf(str_, len, "%s", message);
+  snprintf(str_, sizeof(str_), "%s", message);
 }
 
 Exception::Exception(const std::string& message)
 {
-  snprintf(str_, len, "%s", message.c_str());
+  snprintf(str_, sizeof(str_), "%s", message.c_str());
 }
 
 
 GAIException::GAIException(const char* s, int err_)
-  : Exception(s), err(err_)
+  : Exception(rfb::format("%s: %s (%d)", s, strerror(err_).c_str(), err_)),
+    err(err_)
+{
+}
+
+std::string GAIException::strerror(int err_) const
 {
-  strncat(str_, ": ", len-1-strlen(str_));
 #ifdef _WIN32
-  wchar_t *currStr = new wchar_t[len-strlen(str_)];
-  wcsncpy(currStr, gai_strerrorW(err), len-1-strlen(str_));
-  WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_),
-                      len-1-strlen(str_), nullptr, nullptr);
-  delete [] currStr;
+  char str[256];
+
+  WideCharToMultiByte(CP_UTF8, 0, gai_strerrorW(err_), -1, str,
+                      sizeof(str), nullptr, nullptr);
+
+  return str;
 #else
-  strncat(str_, gai_strerror(err), len-1-strlen(str_));
+  return gai_strerror(err_);
 #endif
-  strncat(str_, " (", len-1-strlen(str_));
-  char buf[20];
-#ifdef WIN32
-  if (err < 0)
-    sprintf(buf, "%x", err);
-  else
-#endif
-    sprintf(buf,"%d",err);
-  strncat(str_, buf, len-1-strlen(str_));
-  strncat(str_, ")", len-1-strlen(str_));
 }
 
 PosixException::PosixException(const char* s, int err_)
-  : Exception(s), err(err_)
+  : Exception(rfb::format("%s: %s (%d)", s, strerror(err_).c_str(), err_)),
+    err(err_)
+{
+}
+
+std::string PosixException::strerror(int err_) const
 {
-  strncat(str_, ": ", len-1-strlen(str_));
 #ifdef _WIN32
-  wchar_t *currStr = new wchar_t[len-strlen(str_)];
-  wcsncpy(currStr, _wcserror(err), len-1-strlen(str_));
-  WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_),
-                      len-1-strlen(str_), nullptr, nullptr);
-  delete [] currStr;
+  char str[256];
+
+  WideCharToMultiByte(CP_UTF8, 0, _wcserror(err_), -1, str,
+                      sizeof(str), nullptr, nullptr);
+
+  return str;
 #else
-  strncat(str_, strerror(err), len-1-strlen(str_));
+  return ::strerror(err_);
 #endif
-  strncat(str_, " (", len-1-strlen(str_));
-  char buf[20];
-    sprintf(buf,"%d",err);
-  strncat(str_, buf, len-1-strlen(str_));
-  strncat(str_, ")", len-1-strlen(str_));
 }
 
 #ifdef WIN32
 Win32Exception::Win32Exception(const char* s, unsigned err_)
-  : Exception(s), err(err_)
+  : Exception(rfb::format("%s: %s (%d)", s, strerror(err_).c_str(), err_)),
+    err(err_)
+{
+}
+
+std::string Win32Exception::strerror(unsigned err_) const
 {
-  strncat(str_, ": ", len-1-strlen(str_));
-  wchar_t *currStr = new wchar_t[len-strlen(str_)];
+  wchar_t wstr[256];
+  char str[256];
+
   FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-                 nullptr, err, 0, currStr, len-1-strlen(str_), nullptr);
-  WideCharToMultiByte(CP_UTF8, 0, currStr, -1, str_+strlen(str_),
-                      len-1-strlen(str_), nullptr, nullptr);
-  delete [] currStr;
-
-  int l = strlen(str_);
-  if ((l >= 2) && (str_[l-2] == '\r') && (str_[l-1] == '\n'))
-      str_[l-2] = 0;
-
-  strncat(str_, " (", len-1-strlen(str_));
-  char buf[20];
-  sprintf(buf,"%d",err);
-  strncat(str_, buf, len-1-strlen(str_));
-  strncat(str_, ")", len-1-strlen(str_));
+                 nullptr, err_, 0, wstr, sizeof(wstr), nullptr);
+  WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str,
+                      sizeof(str), nullptr, nullptr);
+
+  int l = strlen(str);
+  if ((l >= 2) && (str[l-2] == '\r') && (str[l-1] == '\n'))
+      str[l-2] = 0;
+
+  return str;
 }
 #endif
index 65d3d90af51af6bd40622f6fcb2f8586512977a9..c6be8fcc797339f85f11e08636b5811a67787c95 100644 (file)
 namespace rdr {
 
   struct Exception {
-    enum { len = 256 };
-    char str_[len];
     Exception(const char* message);
     Exception(const std::string& message);
     virtual ~Exception() {}
     virtual const char* str() const { return str_; }
+  private:
+    char str_[256];
   };
 
   struct PosixException : public Exception {
     int err;
     PosixException(const char* s, int err_);
+  private:
+    std::string strerror(int err_) const;
   };
 
 #ifdef WIN32
   struct Win32Exception : public Exception {
     unsigned err;
     Win32Exception(const char* s, unsigned err_);
+  private:
+    std::string strerror(unsigned err_) const;
   };
 #endif
 
@@ -59,6 +63,8 @@ namespace rdr {
   struct GAIException : public Exception {
     int err;
     GAIException(const char* s, int err_);
+  private:
+    std::string strerror(int err_) const;
   };
 
   struct EndOfStream : public Exception {