]> source.dussan.org Git - tigervnc.git/commitdiff
Return std::vector instead of dynamic allocation
authorPierre Ossman <ossman@cendio.se>
Sun, 15 Jan 2023 15:55:34 +0000 (16:55 +0100)
committerPierre Ossman <ossman@cendio.se>
Sat, 4 Feb 2023 13:03:13 +0000 (14:03 +0100)
This makes memory management more clear and robust when using these
helper functions.

common/rfb/Configuration.cxx
common/rfb/Configuration.h
common/rfb/SSecurityVncAuth.cxx
common/rfb/util.cxx
common/rfb/util.h
win/rfb_win32/Registry.cxx
win/rfb_win32/Registry.h
win/vncconfig/Legacy.cxx

index 629214e4dc872a57a32c22d2fb9456aec99d01f8..1d4c7a45e3f5c1b4dc3efa03f65336446c6788e2 100644 (file)
@@ -435,11 +435,10 @@ BinaryParameter::~BinaryParameter() {
 
 bool BinaryParameter::setParam(const char* v) {
   if (immutable) return true;
-  uint8_t *newValue = hexToBin(v, strlen(v));
-  if (newValue == NULL)
+  std::vector<uint8_t> newValue = hexToBin(v, strlen(v));
+  if (newValue.empty() && strlen(v) > 0)
     return false;
-  setParam(newValue, strlen(v)/2);
-  delete [] newValue;
+  setParam(newValue.data(), newValue.size());
   return true;
 }
 
@@ -467,11 +466,9 @@ char* BinaryParameter::getValueStr() const {
   return binToHex(value, length);
 }
 
-void BinaryParameter::getData(uint8_t** data_, size_t* length_) const {
+std::vector<uint8_t> BinaryParameter::getData() const {
   LOCK_CONFIG;
-  if (length_) *length_ = length;
-  if (data_) {
-    *data_ = new uint8_t[length];
-    memcpy(*data_, value, length);
-  }
+  std::vector<uint8_t> out(length);
+  memcpy(out.data(), value, length);
+  return out;
 }
index 9e86dcc95308b5cec61a646297b487afddd1ea15..318b6b8d14175374b75540bbf82ab0b3b99c3954 100644 (file)
@@ -44,6 +44,8 @@
 #ifndef __RFB_CONFIGURATION_H__
 #define __RFB_CONFIGURATION_H__
 
+#include <vector>
+
 #include <rfb/util.h>
 
 namespace os { class Mutex; }
@@ -266,9 +268,7 @@ namespace rfb {
     virtual char* getDefaultStr() const;
     virtual char* getValueStr() const;
 
-    // getData() will return length zero if there is no data
-    // NB: data may be set to zero, OR set to a zero-length buffer
-    void getData(uint8_t** data, size_t* length) const;
+    std::vector<uint8_t> getData() const;
 
   protected:
     uint8_t* value;
index b70f06681c6cbe2805a7c217bd7bd4ea0de3dd26..d035f97f962117f3eff45484988c158cb1e8588f 100644 (file)
@@ -123,7 +123,12 @@ VncAuthPasswdParameter::VncAuthPasswdParameter(const char* name,
 
 void VncAuthPasswdParameter::getVncAuthPasswd(PlainPasswd *password, PlainPasswd *readOnlyPassword) {
   ObfuscatedPasswd obfuscated, obfuscatedReadOnly;
-  getData((uint8_t**)&obfuscated.buf, &obfuscated.length);
+  std::vector<uint8_t> data = getData();
+  obfuscated.length = data.size();
+  if (!data.empty()) {
+    obfuscated.buf = new char[data.size()];
+    memcpy(obfuscated.buf, data.data(), data.size());
+  }
 
   if (obfuscated.length == 0) {
     if (passwdFile) {
index 32be6fdd8cadeef3d5e883264e459e81a30a2912..cfc694e3d36e465963090f8b991fae217753e5e7 100644 (file)
@@ -178,12 +178,10 @@ namespace rfb {
     return true;
   }
 
-  uint8_t* hexToBin(const char* in, size_t inlen) {
-    uint8_t* out = new uint8_t[inlen/2];
-    if (!hexToBin(in, inlen, out, inlen/2)) {
-      delete [] out;
-      return NULL;
-    }
+  std::vector<uint8_t> hexToBin(const char* in, size_t inlen) {
+    std::vector<uint8_t> out(inlen/2);
+    if (!hexToBin(in, inlen, out.data(), inlen/2))
+      return std::vector<uint8_t>();
     return out;
   }
 
index bac30f3f73999e816ddbc20fd30b7a7d75b3fd96..7f65fa87b52abc950c40491b2ebf604fdcccdfda 100644 (file)
@@ -28,6 +28,8 @@
 #include <string.h>
 #include <stdint.h>
 
+#include <vector>
+
 struct timeval;
 
 namespace rfb {
@@ -79,7 +81,7 @@ namespace rfb {
   void binToHex(const uint8_t* in, size_t inlen, char* out, size_t outlen);
   char* binToHex(const uint8_t* in, size_t inlen);
   bool hexToBin(const char* in, size_t inlen, uint8_t* out, size_t outlen);
-  uint8_t* hexToBin(const char* in, size_t inlen);
+  std::vector<uint8_t> hexToBin(const char* in, size_t inlen);
 
   // Makes sure line endings are in a certain format
 
index cb4e6688735ec2529bd904422ad19b18306892af..78879c3b0f284b474c0baa07b98ac049a2b969f7 100644 (file)
@@ -173,23 +173,17 @@ TCHAR* RegKey::getString(const TCHAR* valname, const TCHAR* def) const {
   }
 }
 
-void RegKey::getBinary(const TCHAR* valname, void** data, size_t* length) const {
+std::vector<uint8_t> RegKey::getBinary(const TCHAR* valname) const {
   TCharArray hex(getRepresentation(valname));
-  *data = hexToBin(CStr(hex.buf), strlen(CStr(hex.buf)));
-  *length = strlen(CStr(hex.buf))/2;
-  if (*data == NULL)
-    throw rdr::Exception("getBinary failed");
+  return hexToBin(CStr(hex.buf), strlen(CStr(hex.buf)));
 }
-void RegKey::getBinary(const TCHAR* valname, void** data, size_t* length, void* def, size_t deflen) const {
+std::vector<uint8_t> RegKey::getBinary(const TCHAR* valname, const uint8_t* def, size_t deflen) const {
   try {
-    getBinary(valname, data, length);
+    return getBinary(valname);
   } catch(rdr::Exception&) {
-    if (deflen) {
-      *data = new char[deflen];
-      memcpy(*data, def, deflen);
-    } else
-      *data = 0;
-    *length = deflen;
+    std::vector<uint8_t> out(deflen);
+    memcpy(out.data(), def, deflen);
+    return out;
   }
 }
 
index 2bb16911d594ded8c55a4724a9493f0547d1aa37..3b87983b299c083ff9e3824940f25c23be348ec9 100644 (file)
@@ -78,8 +78,8 @@ namespace rfb {
       TCHAR* getString(const TCHAR* valname) const;
       TCHAR* getString(const TCHAR* valname, const TCHAR* def) const;
 
-      void getBinary(const TCHAR* valname, void** data, size_t* length) const;
-      void getBinary(const TCHAR* valname, void** data, size_t* length, void* def, size_t deflength) const;
+      std::vector<uint8_t> getBinary(const TCHAR* valname) const;
+      std::vector<uint8_t> getBinary(const TCHAR* valname, const uint8_t* def, size_t deflength) const;
 
       int getInt(const TCHAR* valname) const;
       int getInt(const TCHAR* valname, int def) const;
index deba0ff3ff54b2d8e8cd3de46d62d2429c7a4c5f..3edfd4f7f3fd3006c38e3a449d1a1afc022b20a1 100644 (file)
@@ -19,7 +19,6 @@
 #include <vncconfig/Legacy.h>
 
 #include <rfb/LogWriter.h>
-#include <rfb/Password.h>
 #include <rfb_win32/CurrentUser.h>
 
 using namespace rfb;
@@ -212,9 +211,9 @@ void LegacyPage::LoadPrefs()
         }
         regKey.setInt(_T("QueryTimeout"), key.getInt(_T("QueryTimeout"), 10));
 
-        ObfuscatedPasswd passwd;
-        key.getBinary(_T("Password"), (void**)&passwd.buf, &passwd.length, 0, 0);
-        regKey.setBinary(_T("Password"), passwd.buf, passwd.length);
+        std::vector<uint8_t> passwd;
+        passwd = key.getBinary(_T("Password"));
+        regKey.setBinary(_T("Password"), passwd.data(), passwd.size());
 
         bool enableInputs = key.getBool(_T("InputsEnabled"), true);
         regKey.setBool(_T("AcceptKeyEvents"), enableInputs);