]> source.dussan.org Git - tigervnc.git/commitdiff
Return static char buffer from some methods
authorPierre Ossman <ossman@cendio.se>
Fri, 13 Jan 2023 10:14:21 +0000 (11:14 +0100)
committerPierre Ossman <ossman@cendio.se>
Sat, 4 Feb 2023 13:03:13 +0000 (14:03 +0100)
This mimics how some system functions (like inet_ntop()) work, and
avoids complexity around ownership of the returned string buffer.

The downside is that the string must be consumed directly as it will be
overwritten on the next call, but that is not an issue with the current
usage.

24 files changed:
common/network/Socket.h
common/network/TcpSocket.cxx
common/network/TcpSocket.h
common/network/UnixSocket.cxx
common/network/UnixSocket.h
common/os/os.cxx
common/os/os.h
common/rfb/CSecurityTLS.cxx
common/rfb/VNCSConnectionST.cxx
common/rfb/VNCServerST.cxx
unix/vncpasswd/vncpasswd.cxx
unix/x0vncserver/XDesktop.cxx
unix/xserver/hw/vnc/XserverDesktop.cc
vncviewer/CConn.cxx
vncviewer/ServerDialog.cxx
vncviewer/parameters.cxx
vncviewer/vncviewer.cxx
win/rfb_win32/Dialog.cxx
win/rfb_win32/Dialog.h
win/rfb_win32/Service.cxx
win/rfb_win32/Service.h
win/vncconfig/Connections.h
win/vncconfig/PasswordDialog.cxx
win/winvnc/QueryConnectDialog.cxx

index 901bab1331ebd04ea24c7f487fea4fa828150c17..117851c19179ec919f94f0167a42fc8ead7e3c7c 100644 (file)
@@ -49,8 +49,8 @@ namespace network {
     void cork(bool enable) { outstream->cork(enable); }
 
     // information about the remote end of the socket
-    virtual char* getPeerAddress() = 0; // a string e.g. "192.168.0.1"
-    virtual char* getPeerEndpoint() = 0; // <address>::<port>
+    virtual const char* getPeerAddress() = 0; // a string e.g. "192.168.0.1"
+    virtual const char* getPeerEndpoint() = 0; // <address>::<port>
 
     // Was there a "?" in the ConnectionFilter used to accept this Socket?
     void setRequiresQuery();
index cc82faefae42b23eec7f764934749df00de61cc1..5241d94ab44f68c0a9fce0ad404b25da9d246f25 100644 (file)
@@ -211,17 +211,17 @@ TcpSocket::TcpSocket(const char *host, int port)
   enableNagles(false);
 }
 
-char* TcpSocket::getPeerAddress() {
+const char* TcpSocket::getPeerAddress() {
   vnc_sockaddr_t sa;
   socklen_t sa_size = sizeof(sa);
 
   if (getpeername(getFd(), &sa.u.sa, &sa_size) != 0) {
     vlog.error("unable to get peer name for socket");
-    return rfb::strDup("");
+    return "";
   }
 
   if (sa.u.sa.sa_family == AF_INET6) {
-    char buffer[INET6_ADDRSTRLEN + 2];
+    static char buffer[INET6_ADDRSTRLEN + 2];
     int ret;
 
     buffer[0] = '[';
@@ -231,12 +231,12 @@ char* TcpSocket::getPeerAddress() {
                       NI_NUMERICHOST);
     if (ret != 0) {
       vlog.error("unable to convert peer name to a string");
-      return rfb::strDup("");
+      return "";
     }
 
     strcat(buffer, "]");
 
-    return rfb::strDup(buffer);
+    return buffer;
   }
 
   if (sa.u.sa.sa_family == AF_INET) {
@@ -245,18 +245,18 @@ char* TcpSocket::getPeerAddress() {
     name = inet_ntoa(sa.u.sin.sin_addr);
     if (name == NULL) {
       vlog.error("unable to convert peer name to a string");
-      return rfb::strDup("");
+      return "";
     }
 
-    return rfb::strDup(name);
+    return name;
   }
 
   vlog.error("unknown address family for socket");
-  return rfb::strDup("");
+  return "";
 }
 
-char* TcpSocket::getPeerEndpoint() {
-  rfb::CharArray address; address.buf = getPeerAddress();
+const char* TcpSocket::getPeerEndpoint() {
+  static char buffer[INET6_ADDRSTRLEN + 2 + 32];
   vnc_sockaddr_t sa;
   socklen_t sa_size = sizeof(sa);
   int port;
@@ -270,9 +270,8 @@ char* TcpSocket::getPeerEndpoint() {
   else
     port = 0;
 
-  int buflen = strlen(address.buf) + 32;
-  char* buffer = new char[buflen];
-  sprintf(buffer, "%s::%d", address.buf, port);
+  sprintf(buffer, "%s::%d", getPeerAddress(), port);
+
   return buffer;
 }
 
@@ -569,33 +568,31 @@ patternMatchIP(const TcpFilter::Pattern& pattern, vnc_sockaddr_t *sa) {
 
 bool
 TcpFilter::verifyConnection(Socket* s) {
-  rfb::CharArray name;
   vnc_sockaddr_t sa;
   socklen_t sa_size = sizeof(sa);
 
   if (getpeername(s->getFd(), &sa.u.sa, &sa_size) != 0)
     return false;
 
-  name.buf = s->getPeerAddress();
   std::list<TcpFilter::Pattern>::iterator i;
   for (i=filter.begin(); i!=filter.end(); i++) {
     if (patternMatchIP(*i, &sa)) {
       switch ((*i).action) {
       case Accept:
-        vlog.debug("ACCEPT %s", name.buf);
+        vlog.debug("ACCEPT %s", s->getPeerAddress());
         return true;
       case Query:
-        vlog.debug("QUERY %s", name.buf);
+        vlog.debug("QUERY %s", s->getPeerAddress());
         s->setRequiresQuery();
         return true;
       case Reject:
-        vlog.debug("REJECT %s", name.buf);
+        vlog.debug("REJECT %s", s->getPeerAddress());
         return false;
       }
     }
   }
 
-  vlog.debug("[REJECT] %s", name.buf);
+  vlog.debug("[REJECT] %s", s->getPeerAddress());
   return false;
 }
 
index 787de6292fe7b0e3c0d60278531119bd3cce6e97..d008f194c7cdd27555e715a8b75c7adf76159826 100644 (file)
@@ -55,8 +55,8 @@ namespace network {
     TcpSocket(int sock);
     TcpSocket(const char *name, int port);
 
-    virtual char* getPeerAddress();
-    virtual char* getPeerEndpoint();
+    virtual const char* getPeerAddress();
+    virtual const char* getPeerEndpoint();
 
   protected:
     bool enableNagles(bool enable);
index 3c1443f89d2190d9c8b5d87aace126a5196e2edd..e7793849682ba00ce449faef83ee2cb92d90888f 100644 (file)
@@ -74,8 +74,8 @@ UnixSocket::UnixSocket(const char *path)
   setFd(sock);
 }
 
-char* UnixSocket::getPeerAddress() {
-  struct sockaddr_un addr;
+const char* UnixSocket::getPeerAddress() {
+  static struct sockaddr_un addr;
   socklen_t salen;
 
   // AF_UNIX only has a single address (the server side).
@@ -85,27 +85,27 @@ char* UnixSocket::getPeerAddress() {
   salen = sizeof(addr);
   if (getpeername(getFd(), (struct sockaddr *)&addr, &salen) != 0) {
     vlog.error("unable to get peer name for socket");
-    return rfb::strDup("");
+    return "";
   }
 
   if (salen > offsetof(struct sockaddr_un, sun_path))
-    return rfb::strDup(addr.sun_path);
+    return addr.sun_path;
 
   salen = sizeof(addr);
   if (getsockname(getFd(), (struct sockaddr *)&addr, &salen) != 0) {
     vlog.error("unable to get local name for socket");
-    return rfb::strDup("");
+    return "";
   }
 
   if (salen > offsetof(struct sockaddr_un, sun_path))
-    return rfb::strDup(addr.sun_path);
+    return addr.sun_path;
 
   // socketpair() will create unnamed sockets
 
-  return rfb::strDup("(unnamed UNIX socket)");
+  return "(unnamed UNIX socket)";
 }
 
-char* UnixSocket::getPeerEndpoint() {
+const char* UnixSocket::getPeerEndpoint() {
   return getPeerAddress();
 }
 
index d7c70005ff7770e22e0f8b5fba401b8d9fce7cc0..e66afcd1fcad26fb97f85bdc39dc716cbf3fa504 100644 (file)
@@ -38,8 +38,8 @@ namespace network {
     UnixSocket(int sock);
     UnixSocket(const char *name);
 
-    virtual char* getPeerAddress();
-    virtual char* getPeerEndpoint();
+    virtual const char* getPeerAddress();
+    virtual const char* getPeerEndpoint();
   };
 
   class UnixListener : public SocketListener {
index c6c8b2bfe7664ac2cb7a629f23c03a1dcb177e8b..1e00b92fe4d967ef379bfb88c673e41c8fdaf6d2 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2010 TightVNC Team.  All Rights Reserved.
+ * Copyright 2021-2023 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
@@ -26,6 +27,8 @@
 
 #ifndef WIN32
 #include <pwd.h>
+#include <limits.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/types.h>
 #include <shlobj.h>
 #endif
 
-static int gethomedir(char **dirp, bool userDir)
+static const char* gethomedir(bool userDir)
 {
+  static char dir[PATH_MAX];
+
 #ifndef WIN32
-  char *homedir, *dir;
-  size_t len;
+  char *homedir;
   uid_t uid;
   struct passwd *passwd;
 #else
-  char *dir;
   BOOL ret;
 #endif
 
-  assert(dirp != NULL && *dirp == NULL);
-
 #ifndef WIN32
   homedir = getenv("HOME");
   if (homedir == NULL) {
@@ -57,51 +58,45 @@ static int gethomedir(char **dirp, bool userDir)
     passwd = getpwuid(uid);
     if (passwd == NULL) {
       /* Do we want emit error msg here? */
-      return -1;
+      return NULL;
     }
     homedir = passwd->pw_dir;
   }
 
-  len = strlen(homedir);
-  dir = new char[len+7];
-  if (dir == NULL)
-    return -1;
-
-  memcpy(dir, homedir, len);
   if (userDir)
-    dir[len]='\0';
-  else
-    memcpy(dir + len, "/.vnc/\0", 7);
-#else
-  dir = new char[MAX_PATH];
-  if (dir == NULL)
-    return -1;
+    return homedir;
+
+  snprintf(dir, sizeof(dir), "%s/.vnc/", homedir);
 
+  return dir;
+#else
   if (userDir)
     ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_PROFILE, FALSE);
   else
     ret = SHGetSpecialFolderPath(NULL, dir, CSIDL_APPDATA, FALSE);
 
-  if (ret == FALSE) {
-    delete [] dir;
-    return -1;
-  }
+  if (ret == FALSE)
+    return NULL;
+
   if (userDir)
-    dir[strlen(dir)+1] = '\0';
-  else
-    memcpy(dir+strlen(dir), "\\vnc\\\0", 6);
+    return dir;
+
+  if (strlen(dir) + strlen("\\vnc\\") >= sizeof(dir))
+    return NULL;
+
+  strcat(dir, "\\vnc\\");
+
+  return dir;
 #endif
-  *dirp = dir;
-  return 0;
 }
 
-int getvnchomedir(char **dirp)
+const char* getvnchomedir()
 {
-  return gethomedir(dirp, false);
+  return gethomedir(false);
 }
 
-int getuserhomedir(char **dirp)
+const char* getuserhomedir()
 {
-  return gethomedir(dirp, true);
+  return gethomedir(true);
 }
 
index 62acf829e4c55bca0a256f51862f678f3995b07d..ff6dcd011515a8026541ce65faa80931fb36a984 100644 (file)
@@ -1,4 +1,5 @@
 /* Copyright (C) 2010 TightVNC Team.  All Rights Reserved.
+ * Copyright 2021-2023 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
  * If HOME environment variable is set then it is used.
  * Otherwise home directory is obtained via getpwuid function.
  *
- * Returns:
- * 0 - Success
- * -1 - Failure
+ * Returns NULL on failure.
  */
-int getvnchomedir(char **dirp);
+const char* getvnchomedir();
 
 /*
  * Get user home directory.
  * If HOME environment variable is set then it is used.
  * Otherwise home directory is obtained via getpwuid function.
  *
- * Returns:
- * 0 - Success
- * -1 - Failure
+ * Returns NULL on failure.
  */
-int getuserhomedir(char **dirp);
+const char* getuserhomedir();
 
 #endif /* OS_OS_H */
index aaf792d34359dcd8f17c6df43da8a81b3a858dc4..dd4a5282d55476011521bf3b55f098ee69603858 100644 (file)
@@ -76,15 +76,14 @@ static LogWriter vlog("TLS");
 static const char* homedirfn(const char* fn)
 {
   static char full_path[PATH_MAX];
-  char* homedir = NULL;
+  const char* homedir;
 
-  if (getvnchomedir(&homedir) == -1)
+  homedir = getvnchomedir();
+  if (homedir == NULL)
     return "";
 
   snprintf(full_path, sizeof(full_path), "%s%s", homedir, fn);
 
-  delete [] homedir;
-
   return full_path;
 }
 
@@ -310,7 +309,7 @@ void CSecurityTLS::checkSession()
   unsigned int cert_list_size = 0;
   int err;
 
-  char *homeDir;
+  const char *homeDir;
   gnutls_datum_t info;
   size_t len;
 
@@ -390,15 +389,14 @@ void CSecurityTLS::checkSession()
 
   /* Certificate is fine, except we don't know the issuer, so TOFU time */
 
-  homeDir = NULL;
-  if (getvnchomedir(&homeDir) == -1) {
+  homeDir = getvnchomedir();
+  if (homeDir == NULL) {
     throw AuthFailureException("Could not obtain VNC home directory "
                                "path for known hosts storage");
   }
 
   CharArray dbPath(strlen(homeDir) + 16 + 1);
   sprintf(dbPath.buf, "%sx509_known_hosts", homeDir);
-  delete [] homeDir;
 
   err = gnutls_verify_stored_pubkey(dbPath.buf, NULL,
                                     client->getServerName(), NULL,
index 564dd3194081710cf23cb007f5192708d317c036..f27264c365170325b6ee757bd116ced20ce1385f 100644 (file)
@@ -59,7 +59,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
     pointerEventTime(0), clientHasCursor(false)
 {
   setStreams(&sock->inStream(), &sock->outStream());
-  peerEndpoint.buf = sock->getPeerEndpoint();
+  peerEndpoint.buf = strDup(sock->getPeerEndpoint());
 
   // Kick off the idle timer
   if (rfb::Server::idleTimeout) {
index a02366e10c1ac63b07ee33c2ca5f94332c05fe44..aaa59eaa7fed4cef9fe69ba2eeef2c159649117c 100644 (file)
@@ -131,9 +131,9 @@ void VNCServerST::addSocket(network::Socket* sock, bool outgoing)
 {
   // - Check the connection isn't black-marked
   // *** do this in getSecurity instead?
-  CharArray address(sock->getPeerAddress());
-  if (blHosts->isBlackmarked(address.buf)) {
-    connectionsLog.error("blacklisted: %s", address.buf);
+  const char *address = sock->getPeerAddress();
+  if (blHosts->isBlackmarked(address)) {
+    connectionsLog.error("blacklisted: %s", address);
     try {
       rdr::OutStream& os = sock->outStream();
 
@@ -151,9 +151,7 @@ void VNCServerST::addSocket(network::Socket* sock, bool outgoing)
     return;
   }
 
-  CharArray name;
-  name.buf = sock->getPeerEndpoint();
-  connectionsLog.status("accepted: %s", name.buf);
+  connectionsLog.status("accepted: %s", sock->getPeerEndpoint());
 
   // Adjust the exit timers
   if (rfb::Server::maxConnectionTime && clients.empty())
@@ -651,9 +649,7 @@ void VNCServerST::queryConnection(VNCSConnectionST* client,
                                   const char* userName)
 {
   // - Authentication succeeded - clear from blacklist
-  CharArray name;
-  name.buf = client->getSock()->getPeerAddress();
-  blHosts->clearBlackmark(name.buf);
+  blHosts->clearBlackmark(client->getSock()->getPeerAddress());
 
   // - Prepare the desktop for that the client will start requiring
   // resources after this
index 189577b86203c597cd45229e7834d60ed2ee2a1a..c7af25888e5e17a710c36a35207a7182f314c0f1 100644 (file)
@@ -146,15 +146,14 @@ int main(int argc, char** argv)
   }
 
   if (!fname) {
-    char *homeDir = NULL;
-    if (getvnchomedir(&homeDir) == -1) {
+    const char *homeDir = getvnchomedir();
+    if (homeDir == NULL) {
       fprintf(stderr, "Can't obtain VNC home directory\n");
       exit(1);
     }
     mkdir(homeDir, 0777);
     fname = new char[strlen(homeDir) + 7];
     sprintf(fname, "%spasswd", homeDir);
-    delete [] homeDir;
   }
 
   while (true) {
index 0b6d7ef134b86b8e6c22e87550e4fca079f6220f..12169c76714f197d6977eb2e0d5c0c587ec2874a 100644 (file)
@@ -327,9 +327,9 @@ void XDesktop::queryConnection(network::Socket* sock,
 
   queryConnectSock = sock;
 
-  CharArray address(sock->getPeerAddress());
   delete queryConnectDialog;
-  queryConnectDialog = new QueryConnectDialog(dpy, address.buf,
+  queryConnectDialog = new QueryConnectDialog(dpy,
+                                              sock->getPeerAddress(),
                                               userName,
                                               queryConnectTimeout,
                                               this);
index 3b4eee6ab6224c0b1afbb49ebbf2233f07fd114b..14b111ae41c9c32b904436b0b23e4aece2e029d2 100644 (file)
@@ -172,7 +172,7 @@ void XserverDesktop::queryConnection(network::Socket* sock,
     return;
   }
 
-  queryConnectAddress.replaceBuf(sock->getPeerAddress());
+  queryConnectAddress.replaceBuf(strDup(sock->getPeerAddress()));
   if (!userName)
     userName = "(anonymous)";
   queryConnectUsername.replaceBuf(strDup(userName));
index 9ab5a696cc309dc1320a84ee66b2192433989dbe..ef4252a7d9409bc8cb3a3840ff086ca5e2c6a88c 100644 (file)
@@ -32,7 +32,6 @@
 #include <rfb/Hostname.h>
 #include <rfb/LogWriter.h>
 #include <rfb/Security.h>
-#include <rfb/util.h>
 #include <rfb/screenTypes.h>
 #include <rfb/fenceTypes.h>
 #include <rfb/Timer.h>
@@ -99,7 +98,7 @@ CConn::CConn(const char* vncServerName, network::Socket* socket=NULL)
 #ifndef WIN32
       if (strchr(vncServerName, '/') != NULL) {
         sock = new network::UnixSocket(vncServerName);
-        serverHost = sock->getPeerAddress();
+        serverHost = strDup(sock->getPeerAddress());
         vlog.info(_("Connected to socket %s"), serverHost);
       } else
 #endif
index 6a4dcfc9c9ff833fa994de2df6ff36de7d14c007..3e3ddead0d6d2b7c6e370182a0ffa827cd975dca 100644 (file)
@@ -168,7 +168,7 @@ void ServerDialog::handleLoad(Fl_Widget* /*widget*/, void* data)
   ServerDialog *dialog = (ServerDialog*)data;
 
   if (!dialog->usedDir)
-    getuserhomedir(&(dialog->usedDir));
+    dialog->usedDir = strDup(getuserhomedir());
 
   Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir, _("TigerVNC configuration (*.tigervnc)"), 
                                                       0, _("Select a TigerVNC configuration file"));
@@ -207,7 +207,7 @@ void ServerDialog::handleSaveAs(Fl_Widget* /*widget*/, void* data)
   const char* servername = dialog->serverName->value();
   const char* filename;
   if (!dialog->usedDir)
-    getuserhomedir(&dialog->usedDir);
+    dialog->usedDir = strDup(getuserhomedir());
   
   Fl_File_Chooser* file_chooser = new Fl_File_Chooser(dialog->usedDir, _("TigerVNC configuration (*.tigervnc)"), 
                                                       2, _("Save the TigerVNC configuration to file"));
@@ -315,13 +315,12 @@ void ServerDialog::loadServerHistory()
   return;
 #endif
 
-  char* homeDir = NULL;
-  if (getvnchomedir(&homeDir) == -1)
+  const char* homeDir = getvnchomedir();
+  if (homeDir == NULL)
     throw Exception(_("Could not obtain the home directory path"));
 
   char filepath[PATH_MAX];
   snprintf(filepath, sizeof(filepath), "%s%s", homeDir, SERVER_HISTORY);
-  delete[] homeDir;
 
   /* Read server history from file */
   FILE* f = fopen(filepath, "r");
@@ -382,13 +381,12 @@ void ServerDialog::saveServerHistory()
   return;
 #endif
 
-  char* homeDir = NULL;
-  if (getvnchomedir(&homeDir) == -1)
+  const char* homeDir = getvnchomedir();
+  if (homeDir == NULL)
     throw Exception(_("Could not obtain the home directory path"));
 
   char filepath[PATH_MAX];
   snprintf(filepath, sizeof(filepath), "%s%s", homeDir, SERVER_HISTORY);
-  delete[] homeDir;
 
   /* Write server history to file */
   FILE* f = fopen(filepath, "w+");
index d3b115324d71564bc017bea15ba766ff5256c6f5..8d0616d36942b69960af52847c2f477979e04edc 100644 (file)
@@ -629,12 +629,11 @@ void saveViewerParameters(const char *filename, const char *servername) {
     return;
 #endif
     
-    char* homeDir = NULL;
-    if (getvnchomedir(&homeDir) == -1)
+    const char* homeDir = getvnchomedir();
+    if (homeDir == NULL)
       throw Exception(_("Could not obtain the home directory path"));
 
     snprintf(filepath, sizeof(filepath), "%sdefault.tigervnc", homeDir);
-    delete[] homeDir;
   } else {
     snprintf(filepath, sizeof(filepath), "%s", filename);
   }
@@ -734,12 +733,11 @@ char* loadViewerParameters(const char *filename) {
     return loadFromReg();
 #endif
 
-    char* homeDir = NULL;
-    if (getvnchomedir(&homeDir) == -1)
+    const char* homeDir = getvnchomedir();
+    if (homeDir == NULL)
       throw Exception(_("Could not obtain the home directory path"));
 
     snprintf(filepath, sizeof(filepath), "%sdefault.tigervnc", homeDir);
-    delete[] homeDir;
   } else {
     snprintf(filepath, sizeof(filepath), "%s", filename);
   }
index 549a9bedf7e645b07a1fb1c70128d761b7a49868..7d87ab447f9f8293392b546634b0e97b53db785d 100644 (file)
@@ -433,15 +433,13 @@ static void init_fltk()
 static void mkvnchomedir()
 {
   // Create .vnc in the user's home directory if it doesn't already exist
-  char* homeDir = NULL;
-
-  if (getvnchomedir(&homeDir) == -1) {
+  const char* homeDir = getvnchomedir();
+  if (homeDir == NULL) {
     vlog.error(_("Could not obtain the home directory path"));
   } else {
     int result = mkdir(homeDir, 0755);
     if (result == -1 && errno != EEXIST)
       vlog.error(_("Could not create VNC home directory: %s"), strerror(errno));
-    delete [] homeDir;
   }
 }
 
index ecba9747f1084ff407c16c5a4a07eeb652ba74fa..6fee7fd7e5dfeba21ab5b26c665e23b0c4b047b4 100644 (file)
@@ -81,11 +81,11 @@ int Dialog::getItemInt(int id) {
     throw rdr::Exception("unable to read dialog Int");
   return result;
 }
-char* Dialog::getItemString(int id) {
-  CharArray tmp(256);
-  if (!GetDlgItemText(handle, id, tmp.buf, 256))
-    tmp.buf[0] = 0;
-  return tmp.takeBuf();
+const char* Dialog::getItemString(int id) {
+  static char tmp[256];
+  if (!GetDlgItemText(handle, id, tmp, 256))
+    return "";
+  return tmp;
 }
 
 void Dialog::setItemChecked(int id, bool state) {
index 582aa0d924626ab4d3c7db42945de86a61506468..f2d718ced0415eede71c85b8b5c4416c61e29450 100644 (file)
@@ -77,7 +77,7 @@ namespace rfb {
       // Read the states of items
       bool isItemChecked(int id);
       int getItemInt(int id);
-      char* getItemString(int id); // Recipient owns string storage
+      const char *getItemString(int id);
       
       // Set the states of items
       void setItemChecked(int id, bool state);
index 40d4ae87f39528d4b1f113a453d6fbfb514eb5c5..fe85e6c62e093754da1dd85beb8601beae5f2686 100644 (file)
@@ -462,15 +462,15 @@ DWORD rfb::win32::getServiceState(const char* name) {
   return status.dwCurrentState;
 }
 
-char* rfb::win32::serviceStateName(DWORD state) {
+const char* rfb::win32::serviceStateName(DWORD state) {
   switch (state) {
-  case SERVICE_RUNNING: return strDup("Running");
-  case SERVICE_STOPPED: return strDup("Stopped");
-  case SERVICE_STOP_PENDING: return strDup("Stopping");
+  case SERVICE_RUNNING: return "Running";
+  case SERVICE_STOPPED: return "Stopped";
+  case SERVICE_STOP_PENDING: return "Stopping";
   };
-  CharArray tmp(32);
-  sprintf(tmp.buf, "Unknown (%lu)", state);
-  return tmp.takeBuf();
+  static char tmp[32];
+  sprintf(tmp, "Unknown (%lu)", state);
+  return tmp;
 }
 
 
index 6fcd6f25255a872cd2258b885488b86f7cb58499..9d21c3023458028c640c47c3c869926cf9503c90 100644 (file)
@@ -110,8 +110,7 @@ namespace rfb {
     DWORD getServiceState(const char* name);
 
     // -=- Convert a supplied service state value to a printable string e.g. Running, Stopped...
-    //     The caller must delete the returned string buffer
-    char* serviceStateName(DWORD state);
+    const char* serviceStateName(DWORD state);
 
     // -=- Routine to determine whether the host process is running a service
     bool isServiceProcess();
index d3e4dacee02d29cd023a5c23e4c5736d3d20a6e4..fbf46ec162c4ecc6e101bed8a1d83fbbaffa520b 100644 (file)
@@ -60,7 +60,7 @@ namespace rfb {
         pattern.replaceBuf(0);
       }
       bool onOk() {
-        CharArray host(getItemString(IDC_HOST_PATTERN));
+        CharArray host(strDup(getItemString(IDC_HOST_PATTERN)));
         CharArray newPat(strlen(host.buf)+2);
         if (isItemChecked(IDC_ALLOW))
           newPat.buf[0] = '+';
index 0483e496770c862a272be8dd2d5a21cf093f81fb..0df970015d90e2b21622160bcbaf854e63e6f21d 100644 (file)
@@ -33,8 +33,8 @@ bool PasswordDialog::showDialog(HWND owner) {
 }
 
 bool PasswordDialog::onOk() {
-  PlainPasswd password1(getItemString(IDC_PASSWORD1));
-  PlainPasswd password2(getItemString(IDC_PASSWORD2));
+  PlainPasswd password1(strDup(getItemString(IDC_PASSWORD1)));
+  PlainPasswd password2(strDup(getItemString(IDC_PASSWORD2)));
   if (strcmp(password1.buf, password2.buf) != 0) {
     MsgBox(0, "The supplied passwords do not match",
            MB_ICONEXCLAMATION | MB_OK);
index 295f26c2a4538b340a1b21a703eb30a81cdabcc9..76568c8712aecdf88250884cb90b89efd38e02f7 100644 (file)
@@ -46,7 +46,7 @@ QueryConnectDialog::QueryConnectDialog(network::Socket* sock_,
                                        VNCServerWin32* s)
 : Dialog(GetModuleHandle(0)),
   sock(sock_), approve(false), server(s) {
-  peerIp.buf = sock->getPeerAddress();
+  peerIp.buf = strDup(sock->getPeerAddress());
   userName.buf = strDup(userName_);
 }