diff --git a/common/rfb/Blacklist.cxx b/common/rfb/Blacklist.cxx
index 1db2995..4590bef 100644
--- a/common/rfb/Blacklist.cxx
+++ b/common/rfb/Blacklist.cxx
@@ -17,7 +17,6 @@
  */
 #include <rfb/Blacklist.h>
 #include <rfb/Configuration.h>
-#include <stdlib.h>
 
 using namespace rfb;
 
@@ -38,7 +37,7 @@
   // Free the map keys
   BlacklistMap::iterator i;
   for (i=blm.begin(); i!=blm.end(); i++) {
-    free((void *)(*i).first);
+    strFree((char*)(*i).first);
   }
 }
 
@@ -52,7 +51,7 @@
     bi.marks = 1;
     bi.blockUntil = 0;
     bi.blockTimeout = initialTimeout;
-    blm[safe_strdup(name)] = bi;
+    blm[strDup(name)] = bi;
     i = blm.find(name);
   }
 
@@ -81,7 +80,7 @@
 void Blacklist::clearBlackmark(const char* name) {
   BlacklistMap::iterator i = blm.find(name);
   if (i != blm.end()) {
-    free((void *)(*i).first);
+    strFree((char*)(*i).first);
     blm.erase(i);
   }
 }
diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx
index 5995569..36778f0 100644
--- a/common/rfb/CConnection.cxx
+++ b/common/rfb/CConnection.cxx
@@ -234,7 +234,7 @@
   }
   CharArray reason;
   if (cp.beforeVersion(3,8))
-    reason.buf = safe_strdup("Authentication failure");
+    reason.buf = strDup("Authentication failure");
   else
     reason.buf = is->readString();
   state_ = RFBSTATE_INVALID;
diff --git a/common/rfb/CConnection.h b/common/rfb/CConnection.h
index b3fd093..79110eb 100644
--- a/common/rfb/CConnection.h
+++ b/common/rfb/CConnection.h
@@ -47,7 +47,7 @@
     // which we are connected.  This might be the result of getPeerEndpoint on
     // a TcpSocket, for example, or a host specified by DNS name & port.
     // The serverName is used when verifying the Identity of a host (see RA2).
-    void setServerName(const char* name_) { serverName.replaceBuf(safe_strdup(name_)); }
+    void setServerName(const char* name_) { serverName.replaceBuf(strDup(name_)); }
 
     // setStreams() sets the streams to be used for the connection.  These must
     // be set before initialiseProtocol() and processMsg() are called.  The
diff --git a/common/rfb/Configuration.cxx b/common/rfb/Configuration.cxx
index fd4c23a..9ebc20a 100644
--- a/common/rfb/Configuration.cxx
+++ b/common/rfb/Configuration.cxx
@@ -67,7 +67,7 @@
 // -=- Configuration implementation
 
 Configuration::Configuration(const char* name_, Configuration* attachToGroup) 
-: name(safe_strdup(name_)), head(0), _next(0) {
+: name(strDup(name_)), head(0), _next(0) {
   if (attachToGroup) {
     _next = attachToGroup->_next;
     attachToGroup->_next = this;
@@ -182,7 +182,7 @@
       if (column + (int)strlen(def_str) + 11 > width)
         fprintf(stderr,"\n%*s",nameWidth+4,"");
       fprintf(stderr," (default=%s)\n",def_str);
-      free(def_str);
+      strFree(def_str);
     } else {
       fprintf(stderr,"\n");
     }
@@ -315,11 +315,11 @@
 
 char*
 BoolParameter::getDefaultStr() const {
-  return safe_strdup(def_value ? "1" : "0");
+  return strDup(def_value ? "1" : "0");
 }
 
 char* BoolParameter::getValueStr() const {
-  return safe_strdup(value ? "1" : "0");
+  return strDup(value ? "1" : "0");
 }
 
 bool BoolParameter::isBool() const {
@@ -381,7 +381,7 @@
 
 StringParameter::StringParameter(const char* name_, const char* desc_,
                                  const char* v, Configuration* conf)
-  : VoidParameter(name_, desc_, conf), value(safe_strdup(v)), def_value(v)
+  : VoidParameter(name_, desc_, conf), value(strDup(v)), def_value(v)
 {
   if (!v) {
     fprintf(stderr,"Default value <null> for %s not allowed\n",name_);
@@ -390,7 +390,7 @@
 }
 
 StringParameter::~StringParameter() {
-  free(value);
+  strFree(value);
 }
 
 bool StringParameter::setParam(const char* v) {
@@ -400,17 +400,17 @@
     throw rfb::Exception("setParam(<null>) not allowed");
   vlog.debug("set %s(String) to %s", getName(), v);
   CharArray oldValue(value);
-  value = safe_strdup(v);
+  value = strDup(v);
   return value != 0;
 }
 
 char* StringParameter::getDefaultStr() const {
-  return safe_strdup(def_value);
+  return strDup(def_value);
 }
 
 char* StringParameter::getValueStr() const {
   LOCK_CONFIG;
-  return safe_strdup(value);
+  return strDup(value);
 }
 
 // -=- BinaryParameter
diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx
index 4bbd2cb..7b27a73 100644
--- a/common/rfb/ConnParams.cxx
+++ b/common/rfb/ConnParams.cxx
@@ -82,7 +82,7 @@
 void ConnParams::setName(const char* name)
 {
   delete [] name_;
-  name_ = safe_strdup(name);
+  name_ = strDup(name);
 }
 
 void ConnParams::setEncodings(int nEncodings, const rdr::U32* encodings)
diff --git a/common/rfb/HTTPServer.cxx b/common/rfb/HTTPServer.cxx
index 934ca74..94f0609 100644
--- a/common/rfb/HTTPServer.cxx
+++ b/common/rfb/HTTPServer.cxx
@@ -240,7 +240,7 @@
           return writeResponse(501);
 
         // Store the URI to the "document"
-        uri.buf = safe_strdup(path);
+        uri.buf = strDup(path);
       }
 
       // Move on to reading the request headers
diff --git a/common/rfb/Hostname.h b/common/rfb/Hostname.h
index d7ff664..ebdf816 100644
--- a/common/rfb/Hostname.h
+++ b/common/rfb/Hostname.h
@@ -32,7 +32,7 @@
       if (!strSplit(&hi[1], ']', &hostBuf.buf, &portBuf.buf))
         throw rdr::Exception("unmatched [ in host");
     } else {
-      portBuf.buf = safe_strdup(hi);
+      portBuf.buf = strDup(hi);
     }
     if (strSplit(portBuf.buf, ':', hostBuf.buf ? 0 : &hostBuf.buf, &portBuf.buf)) {
       if (portBuf.buf[0] == ':') {
@@ -45,7 +45,7 @@
       *port = basePort;
     }
     if (strlen(hostBuf.buf) == 0)
-      *host = safe_strdup("localhost");
+      *host = strDup("localhost");
     else
       *host = hostBuf.takeBuf();
   }
diff --git a/common/rfb/ListConnInfo.h b/common/rfb/ListConnInfo.h
index 6e4eacc..cabcbc7 100644
--- a/common/rfb/ListConnInfo.h
+++ b/common/rfb/ListConnInfo.h
@@ -52,8 +52,8 @@
 
     void addInfo(void* Conn, char* IP, char* Time, int Status) {
       conn.push_back(Conn);
-      IP_address.push_back(safe_strdup(IP));
-      time_conn.push_back(safe_strdup(Time));
+      IP_address.push_back(strDup(IP));
+      time_conn.push_back(strDup(Time));
       status.push_back(Status);
     }
 
@@ -62,16 +62,16 @@
       buf[1] = *ti;
       switch (*si) {
       case 0:
-        buf[2] = safe_strdup("Full control");
+        buf[2] = strDup("Full control");
         break;
       case 1:
-        buf[2] = safe_strdup("View only");
+        buf[2] = strDup("View only");
         break;
       case 2:
-        buf[2] = safe_strdup("Stop updating");
+        buf[2] = strDup("Stop updating");
         break;
       default:
-        buf[2] = safe_strdup("Unknown");
+        buf[2] = strDup("Unknown");
       }
     }
 
diff --git a/common/rfb/Logger_file.cxx b/common/rfb/Logger_file.cxx
index cf195c0..8a109e4 100644
--- a/common/rfb/Logger_file.cxx
+++ b/common/rfb/Logger_file.cxx
@@ -97,7 +97,7 @@
 void Logger_File::setFilename(const char* filename)
 {
   closeFile();
-  m_filename = safe_strdup(filename);
+  m_filename = strDup(filename);
 }
 
 void Logger_File::setFile(FILE* file)
@@ -113,7 +113,7 @@
       fclose(m_file);
       m_file = 0;
     }
-    free(m_filename);
+    strFree(m_filename);
     m_filename = 0;
   }
 }
diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx
index 0006ff2..e286cf3 100644
--- a/common/rfb/VNCSConnectionST.cxx
+++ b/common/rfb/VNCSConnectionST.cxx
@@ -89,7 +89,7 @@
 {
   // Log the reason for the close
   if (!closeReason.buf)
-    closeReason.buf = safe_strdup(reason);
+    closeReason.buf = strDup(reason);
   else
     vlog.debug("second close: %s (%s)", peerEndpoint.buf, reason);
 
diff --git a/common/rfb/VNCServerST.cxx b/common/rfb/VNCServerST.cxx
index 5be6396..a21526a 100644
--- a/common/rfb/VNCServerST.cxx
+++ b/common/rfb/VNCServerST.cxx
@@ -74,7 +74,7 @@
 VNCServerST::VNCServerST(const char* name_, SDesktop* desktop_,
                          SSecurityFactory* sf)
   : blHosts(&blacklist), desktop(desktop_), desktopStarted(false), pb(0),
-    name(safe_strdup(name_)), pointerClient(0), comparer(0),
+    name(strDup(name_)), pointerClient(0), comparer(0),
     renderedCursorInvalid(false),
     securityFactory(sf ? sf : &defaultSecurityFactory),
     queryConnectionHandler(0), keyRemapper(&KeyRemapper::defInstance),
@@ -363,7 +363,7 @@
 
 void VNCServerST::setName(const char* name_)
 {
-  name.replaceBuf(safe_strdup(name_));
+  name.replaceBuf(strDup(name_));
   std::list<VNCSConnectionST*>::iterator ci, ci_next;
   for (ci = clients.begin(); ci != clients.end(); ci = ci_next) {
     ci_next = ci; ci_next++;
diff --git a/common/rfb/secTypes.cxx b/common/rfb/secTypes.cxx
index 9ea6a00..830d844 100644
--- a/common/rfb/secTypes.cxx
+++ b/common/rfb/secTypes.cxx
@@ -62,7 +62,7 @@
 std::list<int> rfb::parseSecTypes(const char* types_)
 {
   std::list<int> result;
-  CharArray types(safe_strdup(types_)), type;
+  CharArray types(strDup(types_)), type;
   while (types.buf) {
     strSplit(types.buf, ',', &type.buf, &types.buf);
     int typeNum = secTypeNum(type.buf);
diff --git a/common/rfb/util.cxx b/common/rfb/util.cxx
index 7935a3a..a50ea58 100644
--- a/common/rfb/util.cxx
+++ b/common/rfb/util.cxx
@@ -35,19 +35,6 @@
 #endif
 
 #include <rfb/util.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-char* safe_strdup(const char* s) {
-  char *tmp;
-
-  tmp = strdup(s);
-  if (tmp == NULL) {
-    perror("safe_strdup failed");
-    exit(1);
-  }
-};
 
 // Provide strcasecmp() and/or strncasecmp() if absent on this system.
 
@@ -142,6 +129,19 @@
 
 namespace rfb {
 
+  char* strDup(const char* s) {
+    if (!s) return 0;
+    int l = strlen(s);
+    char* r = new char[l+1];
+    memcpy(r, s, l+1);
+    return r;
+  };
+
+  void strFree(char* s) {
+    delete [] s;
+  }
+
+
   bool strSplit(const char* src, const char limiter, char** out1, char** out2, bool fromEnd) {
     CharArray out1old, out2old;
     if (out1) out1old.buf = *out1;
@@ -167,7 +167,7 @@
       }
       i+=increment;
     }
-    if (out1) *out1 = safe_strdup(src);
+    if (out1) *out1 = strDup(src);
     if (out2) *out2 = 0;
     return false;
   }
diff --git a/common/rfb/util.h b/common/rfb/util.h
index 8bf5484..933df52 100644
--- a/common/rfb/util.h
+++ b/common/rfb/util.h
@@ -30,8 +30,6 @@
 #include <limits.h>
 #include <string.h>
 
-char* safe_strdup(const char* s);
-
 namespace rfb {
 
   // -=- Class to handle cleanup of arrays of characters
@@ -54,6 +52,9 @@
     CharArray& operator=(const CharArray&);
   };
 
+  char* strDup(const char* s);
+  void strFree(char* s);
+
   // Returns true if split successful.  Returns false otherwise.
   // ALWAYS *copies* first part of string to out1 buffer.
   // If limiter not found, leaves out2 alone (null) and just copies to out1.
