]> source.dussan.org Git - tigervnc.git/commitdiff
Use fixed size character buffer
authorPierre Ossman <ossman@cendio.se>
Sun, 15 Jan 2023 13:41:47 +0000 (14:41 +0100)
committerPierre Ossman <ossman@cendio.se>
Sat, 4 Feb 2023 13:03:13 +0000 (14:03 +0100)
We know the needed space here, so let's keep it simple with a constant
size string buffer.

common/rfb/Logger_file.cxx
common/rfb/Logger_file.h
common/rfb/SSecurityPlain.cxx
common/rfb/SSecurityPlain.h
common/rfb/SSecurityRSAAES.cxx
common/rfb/SSecurityRSAAES.h
unix/vncpasswd/vncpasswd.cxx
vncviewer/DesktopWindow.cxx
win/rfb_win32/ComputerName.h
win/rfb_win32/ModuleFileName.h
win/vncconfig/Legacy.cxx

index 684614cc9ae4bb22a854a980cf92aa46481147d5..9859eb0415e76bc2ad9c5f79ed35a682e1379e5f 100644 (file)
 #include <config.h>
 #endif
 
+#include <limits.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include <os/Mutex.h>
 
-#include <rfb/util.h>
 #include <rfb/Logger_file.h>
 
 using namespace rfb;
 
 Logger_File::Logger_File(const char* loggerName)
-  : Logger(loggerName), indent(13), width(79), m_filename(0), m_file(0),
+  : Logger(loggerName), indent(13), width(79), m_file(0),
     m_lastLogTime(0)
 {
+  m_filename[0] = '\0';
   mutex = new os::Mutex();
 }
 
@@ -50,11 +51,16 @@ void Logger_File::write(int /*level*/, const char *logname, const char *message)
   os::AutoMutex a(mutex);
 
   if (!m_file) {
-    if (!m_filename) return;
-    CharArray bakFilename(strlen(m_filename) + 1 + 4);
-    sprintf(bakFilename.buf, "%s.bak", m_filename);
-    remove(bakFilename.buf);
-    rename(m_filename, bakFilename.buf);
+    if (m_filename[0] == '\0')
+      return;
+    char bakFilename[PATH_MAX];
+    if (snprintf(bakFilename, sizeof(bakFilename),
+                 "%s.bak", m_filename) >= (int)sizeof(bakFilename)) {
+      remove(m_filename);
+    } else {
+      remove(bakFilename);
+      rename(m_filename, bakFilename);
+    }
     m_file = fopen(m_filename, "w+");
     if (!m_file) return;
   }
@@ -93,7 +99,10 @@ void Logger_File::write(int /*level*/, const char *logname, const char *message)
 void Logger_File::setFilename(const char* filename)
 {
   closeFile();
-  m_filename = strDup(filename);
+  m_filename[0] = '\0';
+  if (strlen(filename) >= sizeof(filename))
+    return;
+  strcpy(m_filename, filename);
 }
 
 void Logger_File::setFile(FILE* file)
@@ -104,13 +113,9 @@ void Logger_File::setFile(FILE* file)
 
 void Logger_File::closeFile()
 {
-  if (m_filename) {
-    if (m_file) {
-      fclose(m_file);
-      m_file = 0;
-    }
-    strFree(m_filename);
-    m_filename = 0;
+  if (m_file) {
+    fclose(m_file);
+    m_file = 0;
   }
 }
 
index 5b5c34e1aadae56c681b70dd067d4780f96ef795..4542d23ceea6338c4876d0360274e2de03ae1273 100644 (file)
@@ -22,6 +22,8 @@
 #define __RFB_LOGGER_FILE_H__
 
 #include <time.h>
+#include <limits.h>
+
 #include <rfb/Logger.h>
 
 namespace os { class Mutex; }
@@ -42,7 +44,7 @@ namespace rfb {
 
   protected:
     void closeFile();
-    char* m_filename;
+    char m_filename[PATH_MAX];
     FILE* m_file;
     time_t m_lastLogTime;
     os::Mutex* mutex;
index 6f65e87a72b5b4d826ac5e36239dc5640e150762..ab3a23918f4475ebf1896e424e7fa006cf45e97e 100644 (file)
@@ -80,9 +80,7 @@ SSecurityPlain::SSecurityPlain(SConnection* sc) : SSecurity(sc)
 bool SSecurityPlain::processMsg()
 {
   rdr::InStream* is = sc->getInStream();
-  char* pw;
-  char *uname;
-  CharArray password;
+  char password[1024];
 
   if (!valid)
     throw AuthFailureException("No password validator configured");
@@ -92,11 +90,11 @@ bool SSecurityPlain::processMsg()
       return false;
 
     ulen = is->readU32();
-    if (ulen > MaxSaneUsernameLength)
+    if (ulen >= sizeof(username))
       throw AuthFailureException("Too long username");
 
     plen = is->readU32();
-    if (plen > MaxSanePasswordLength)
+    if (plen >= sizeof(password))
       throw AuthFailureException("Too long password");
 
     state = 1;
@@ -106,16 +104,12 @@ bool SSecurityPlain::processMsg()
     if (!is->hasData(ulen + plen))
       return false;
     state = 2;
-    pw = new char[plen + 1];
-    uname = new char[ulen + 1];
-    username.replaceBuf(uname);
-    password.replaceBuf(pw);
-    is->readBytes(uname, ulen);
-    is->readBytes(pw, plen);
-    pw[plen] = 0;
-    uname[ulen] = 0;
+    is->readBytes(username, ulen);
+    is->readBytes(password, plen);
+    password[plen] = 0;
+    username[ulen] = 0;
     plen = 0;
-    if (!valid->validate(sc, uname, pw))
+    if (!valid->validate(sc, username, password))
       throw AuthFailureException("invalid password or username");
   }
 
index 1a81addac78caeb9363332667cd0e45a88c510f4..4ca727815c1850850176b015fcd4e9a5fc1cba95 100644 (file)
@@ -23,7 +23,6 @@
 #include <rfb/SConnection.h>
 #include <rfb/SSecurity.h>
 #include <rfb/SSecurityVeNCrypt.h>
-#include <rfb/util.h>
 #include <rfb/Configuration.h>
 
 namespace rfb {
@@ -46,17 +45,14 @@ namespace rfb {
     SSecurityPlain(SConnection* sc);
     virtual bool processMsg();
     virtual int getType() const { return secTypePlain; };
-    virtual const char* getUserName() const { return username.buf; }
+    virtual const char* getUserName() const { return username; }
 
     virtual ~SSecurityPlain() { }
 
   private:
     PasswordValidator* valid;
     unsigned int ulen, plen, state;
-    CharArray username;
-
-    static const unsigned int MaxSaneUsernameLength = 1024;
-    static const unsigned int MaxSanePasswordLength = 1024;
+    char username[1024];
   };
 
 }
index d013717cdc542a31b5901fe1173172e544335afd..4cca7d6dd58361a2f37a75c693ee7e0cfc4cc115 100644 (file)
@@ -539,19 +539,13 @@ bool SSecurityRSAAES::readCredentials()
   uint8_t lenUsername = rais->readU8();
   if (!rais->hasDataOrRestore(lenUsername + 1))
     return false;
-  if (!username.buf) {
-    username.replaceBuf(new char[lenUsername + 1]);
-    rais->readBytes(username.buf, lenUsername);
-    username.buf[lenUsername] = 0;
-  } else {
-    rais->skip(lenUsername);
-  }
+  rais->readBytes(username, lenUsername);
+  username[lenUsername] = 0;
   uint8_t lenPassword = rais->readU8();
   if (!rais->hasDataOrRestore(lenPassword))
     return false;
-  password.replaceBuf(new char[lenPassword + 1]);
-  rais->readBytes(password.buf, lenPassword);
-  password.buf[lenPassword] = 0;
+  rais->readBytes(password, lenPassword);
+  password[lenPassword] = 0;
   rais->clearRestorePoint();
   return true;
 }
@@ -564,7 +558,7 @@ void SSecurityRSAAES::verifyUserPass()
 #elif !defined(__APPLE__)
   UnixPasswordValidator *valid = new UnixPasswordValidator();
 #endif
-  if (!valid->validate(sc, username.buf, password.buf)) {
+  if (!valid->validate(sc, username, password)) {
     delete valid;
     throw AuthFailureException("invalid password or username");
   }
@@ -583,12 +577,12 @@ void SSecurityRSAAES::verifyPass()
   if (!passwd.buf)
     throw AuthFailureException("No password configured for VNC Auth");
 
-  if (strcmp(password.buf, passwd.buf) == 0) {
+  if (strcmp(password, passwd.buf) == 0) {
     accessRights = SConnection::AccessDefault;
     return;
   }
 
-  if (passwdReadOnly.buf && strcmp(password.buf, passwdReadOnly.buf) == 0) {
+  if (passwdReadOnly.buf && strcmp(password, passwdReadOnly.buf) == 0) {
     accessRights = SConnection::AccessView;
     return;
   }
@@ -598,5 +592,5 @@ void SSecurityRSAAES::verifyPass()
 
 const char* SSecurityRSAAES::getUserName() const
 {
-  return username.buf;
+  return username;
 }
index 9ff7629684bffc82da8ef5ed49c1208285df41b0..eaeb13a17cfee54ed201446e64bebb89a5a577ee 100644 (file)
@@ -80,8 +80,8 @@ namespace rfb {
     uint8_t serverRandom[32];
     uint8_t clientRandom[32];
 
-    CharArray username;
-    CharArray password;
+    char username[256];
+    char password[256];
     SConnection::AccessRights accessRights;
 
     rdr::InStream* rais;
index 4d91fda7cfc848287e9dff0355ea32aa0a2482fe..0ad3a52b788d4b5f1c3d5fd3de4f9ac573fec100 100644 (file)
@@ -22,6 +22,7 @@
 #include <config.h>
 #endif
 
+#include <limits.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
@@ -30,7 +31,6 @@
 #include <unistd.h>
 #include <os/os.h>
 #include <rfb/Password.h>
-#include <rfb/util.h>
 
 #include <termios.h>
 
@@ -130,7 +130,9 @@ int main(int argc, char** argv)
 {
   prog = argv[0];
 
-  char* fname = 0;
+  char fname[PATH_MAX];
+
+  fname[0] = '\0';
 
   for (int i = 1; i < argc; i++) {
     if (strcmp(argv[i], "-q") == 0) { // allowed for backwards compatibility
@@ -138,22 +140,25 @@ int main(int argc, char** argv)
       return encrypt_pipe();
     } else if (argv[i][0] == '-') {
       usage();
-    } else if (!fname) {
-      fname = strDup(argv[i]);
+    } else if (fname[0] == '\0') {
+      if (strlen(argv[i]) >= sizeof(fname)) {
+        fprintf(stderr, "Too long filename specified\n");
+        return -1;
+      }
+      strcpy(fname, argv[i]);
     } else {
       usage();
     }
   }
 
-  if (!fname) {
+  if (fname[0] == '\0') {
     const char *homeDir = os::getvnchomedir();
     if (homeDir == NULL) {
       fprintf(stderr, "Can't obtain VNC home directory\n");
       exit(1);
     }
     mkdir(homeDir, 0777);
-    fname = new char[strlen(homeDir) + strlen("/passwd") + 1];
-    sprintf(fname, "%s/passwd", homeDir);
+    snprintf(fname, sizeof(fname), "%s/passwd", homeDir);
   }
 
   while (true) {
@@ -171,7 +176,6 @@ int main(int argc, char** argv)
     FILE* fp = fopen(fname,"w");
     if (!fp) {
       fprintf(stderr,"Couldn't open %s for writing\n",fname);
-      delete [] fname;
       delete obfuscated;
       delete obfuscatedReadOnly;
       exit(1);
@@ -180,7 +184,6 @@ int main(int argc, char** argv)
 
     if (fwrite(obfuscated->buf, obfuscated->length, 1, fp) != 1) {
       fprintf(stderr,"Writing to %s failed\n",fname);
-      delete [] fname;
       delete obfuscated;
       delete obfuscatedReadOnly;
       exit(1);
@@ -191,7 +194,6 @@ int main(int argc, char** argv)
     if (obfuscatedReadOnly) {
       if (fwrite(obfuscatedReadOnly->buf, obfuscatedReadOnly->length, 1, fp) != 1) {
         fprintf(stderr,"Writing to %s failed\n",fname);
-        delete [] fname;
         delete obfuscatedReadOnly;
         exit(1);
       }
@@ -199,7 +201,6 @@ int main(int argc, char** argv)
 
     fclose(fp);
 
-    delete [] fname;
     delete obfuscatedReadOnly;
 
     return 0;
index 4eccbf52c98a51f97e2e039c66561d8a6c6d98da..3584845e09e476ab0d5737a83913246ec9ebf7de 100644 (file)
@@ -281,12 +281,11 @@ const rfb::PixelFormat &DesktopWindow::getPreferredPF()
 
 void DesktopWindow::setName(const char *name)
 {
-  CharArray windowNameStr;
-  windowNameStr.replaceBuf(new char[256]);
+  char windowNameStr[256];
 
-  snprintf(windowNameStr.buf, 256, "%.240s - TigerVNC", name);
+  snprintf(windowNameStr, 256, "%.240s - TigerVNC", name);
 
-  copy_label(windowNameStr.buf);
+  copy_label(windowNameStr);
 }
 
 
index 345ff0d77f2b1ca09ea9b4081bdea8f3c22e6cb7..e7064d5b5c0d22feef9dbf6d905db09f9b6bc4ea 100644 (file)
 #define __RFB_WIN32_COMPUTERNAME_H__
 
 #include <windows.h>
-#include <rfb/util.h>
 
 namespace rfb {
   namespace win32 {
 
     // Get the computer name
-    struct ComputerName : CharArray {
-      ComputerName() : CharArray(MAX_COMPUTERNAME_LENGTH+1) {
+    struct ComputerName {
+      ComputerName() {
         ULONG namelength = MAX_COMPUTERNAME_LENGTH+1;
         if (!GetComputerName(buf, &namelength))
           strcpy(buf, "");
       }
+      char buf[MAX_COMPUTERNAME_LENGTH+1];
     };
 
   };
index 02a34f1afd21c90988087f8779f4c25355c6e12b..9a06f50dae84188a25a074b79cebec1f08e51ed2 100644 (file)
 
 #include <windows.h>
 
-#include <rfb/util.h>
-
 namespace rfb {
   namespace win32 {
 
-    struct ModuleFileName : public CharArray {
-      ModuleFileName(HMODULE module=0) : CharArray(MAX_PATH) {
+    struct ModuleFileName {
+      ModuleFileName(HMODULE module=0) {
         if (!module)
           module = GetModuleHandle(0);
         if (!GetModuleFileName(module, buf, MAX_PATH))
           buf[0] = 0;
       }
+      char buf[MAX_PATH];
     };
 
   };
index b428fd2a0fbb8db252ec32c118956dcd63e105d6..e5433691fd6a9974073aad0ba37e1b4c8b1d87d0 100644 (file)
@@ -78,9 +78,9 @@ void LegacyPage::LoadPrefs()
                 rfb::strSplit(tmp.buf, ':', &first.buf, &tmp.buf);
                 if (strlen(first.buf)) {
                   int bits = 0;
-                  CharArray pattern(1+4*4+4);
-                  pattern.buf[0] = first.buf[0];
-                  pattern.buf[1] = 0;
+                  char pattern[1+4*4+4];
+                  pattern[0] = first.buf[0];
+                  pattern[1] = 0;
 
                   // Split the pattern into IP address parts and process
                   rfb::CharArray address;
@@ -89,11 +89,11 @@ void LegacyPage::LoadPrefs()
                     rfb::CharArray part;
                     rfb::strSplit(address.buf, '.', &part.buf, &address.buf);
                     if (bits)
-                      strcat(pattern.buf, ".");
+                      strcat(pattern, ".");
                     if (strlen(part.buf) > 3)
                       throw rdr::Exception("Invalid IP address part");
                     if (strlen(part.buf) > 0) {
-                      strcat(pattern.buf, part.buf);
+                      strcat(pattern, part.buf);
                       bits += 8;
                     }
                   }
@@ -101,20 +101,20 @@ void LegacyPage::LoadPrefs()
                   // Pad out the address specification if required
                   int addrBits = bits;
                   while (addrBits < 32) {
-                    if (addrBits) strcat(pattern.buf, ".");
-                    strcat(pattern.buf, "0");
+                    if (addrBits) strcat(pattern, ".");
+                    strcat(pattern, "0");
                     addrBits += 8;
                   }
 
                   // Append the number of bits to match
                   char buf[4];
                   sprintf(buf, "/%d", bits);
-                  strcat(pattern.buf, buf);
+                  strcat(pattern, buf);
 
                   // Append this pattern to the Hosts value
-                  int length = strlen(newHosts.buf) + strlen(pattern.buf) + 2;
+                  int length = strlen(newHosts.buf) + strlen(pattern) + 2;
                   CharArray tmpHosts(length);
-                  strcpy(tmpHosts.buf, pattern.buf);
+                  strcpy(tmpHosts.buf, pattern);
                   if (strlen(newHosts.buf)) {
                     strcat(tmpHosts.buf, ",");
                     strcat(tmpHosts.buf, newHosts.buf);