From: Adam Tkac Date: Fri, 4 Sep 2009 10:16:58 +0000 (+0000) Subject: Replace rfb::strDup by safe_strdup and remove rfb::strFree in favor of free() X-Git-Tag: v1.0.90~390 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=97abe8a548ff9ca940d568128b21813b8a253872;p=tigervnc.git Replace rfb::strDup by safe_strdup and remove rfb::strFree in favor of free() git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3889 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- diff --git a/common/network/TcpSocket.cxx b/common/network/TcpSocket.cxx index 7ceff0b0..7056a080 100644 --- a/common/network/TcpSocket.cxx +++ b/common/network/TcpSocket.cxx @@ -238,9 +238,9 @@ char* TcpSocket::getMyAddress() { char* name = inet_ntoa(addr); if (name) { - return rfb::strDup(name); + return safe_strdup(name); } else { - return rfb::strDup(""); + return safe_strdup(""); } } @@ -268,9 +268,9 @@ char* TcpSocket::getPeerAddress() { char* name = inet_ntoa(addr); if (name) { - return rfb::strDup(name); + return safe_strdup(name); } else { - return rfb::strDup(""); + return safe_strdup(""); } } @@ -451,7 +451,7 @@ int TcpListener::getMyPort() { TcpFilter::TcpFilter(const char* spec) { rfb::CharArray tmp; - tmp.buf = rfb::strDup(spec); + tmp.buf = safe_strdup(spec); while (tmp.buf) { rfb::CharArray first; rfb::strSplit(tmp.buf, ',', &first.buf, &tmp.buf); @@ -541,9 +541,9 @@ char* TcpFilter::patternToStr(const TcpFilter::Pattern& p) { in_addr tmp; rfb::CharArray addr, mask; tmp.s_addr = p.address; - addr.buf = rfb::strDup(inet_ntoa(tmp)); + addr.buf = safe_strdup(inet_ntoa(tmp)); tmp.s_addr = p.mask; - mask.buf = rfb::strDup(inet_ntoa(tmp)); + mask.buf = safe_strdup(inet_ntoa(tmp)); char* result = new char[strlen(addr.buf)+1+strlen(mask.buf)+1+1]; switch (p.action) { case Accept: result[0] = '+'; break; diff --git a/common/rfb/Blacklist.cxx b/common/rfb/Blacklist.cxx index 4590befe..1db2995c 100644 --- a/common/rfb/Blacklist.cxx +++ b/common/rfb/Blacklist.cxx @@ -17,6 +17,7 @@ */ #include #include +#include using namespace rfb; @@ -37,7 +38,7 @@ Blacklist::~Blacklist() { // Free the map keys BlacklistMap::iterator i; for (i=blm.begin(); i!=blm.end(); i++) { - strFree((char*)(*i).first); + free((void *)(*i).first); } } @@ -51,7 +52,7 @@ bool Blacklist::isBlackmarked(const char* name) { bi.marks = 1; bi.blockUntil = 0; bi.blockTimeout = initialTimeout; - blm[strDup(name)] = bi; + blm[safe_strdup(name)] = bi; i = blm.find(name); } @@ -80,7 +81,7 @@ bool Blacklist::isBlackmarked(const char* name) { void Blacklist::clearBlackmark(const char* name) { BlacklistMap::iterator i = blm.find(name); if (i != blm.end()) { - strFree((char*)(*i).first); + free((void *)(*i).first); blm.erase(i); } } diff --git a/common/rfb/CConnection.cxx b/common/rfb/CConnection.cxx index 36778f02..59955696 100644 --- a/common/rfb/CConnection.cxx +++ b/common/rfb/CConnection.cxx @@ -234,7 +234,7 @@ void CConnection::processSecurityResultMsg() } CharArray reason; if (cp.beforeVersion(3,8)) - reason.buf = strDup("Authentication failure"); + reason.buf = safe_strdup("Authentication failure"); else reason.buf = is->readString(); state_ = RFBSTATE_INVALID; diff --git a/common/rfb/CConnection.h b/common/rfb/CConnection.h index 79110eb9..b3fd093f 100644 --- a/common/rfb/CConnection.h +++ b/common/rfb/CConnection.h @@ -47,7 +47,7 @@ namespace rfb { // 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(strDup(name_)); } + void setServerName(const char* name_) { serverName.replaceBuf(safe_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 9ebc20a8..fd4c23ae 100644 --- a/common/rfb/Configuration.cxx +++ b/common/rfb/Configuration.cxx @@ -67,7 +67,7 @@ Configuration* Configuration::global() { // -=- Configuration implementation Configuration::Configuration(const char* name_, Configuration* attachToGroup) -: name(strDup(name_)), head(0), _next(0) { +: name(safe_strdup(name_)), head(0), _next(0) { if (attachToGroup) { _next = attachToGroup->_next; attachToGroup->_next = this; @@ -182,7 +182,7 @@ void Configuration::list(int width, int nameWidth) { if (column + (int)strlen(def_str) + 11 > width) fprintf(stderr,"\n%*s",nameWidth+4,""); fprintf(stderr," (default=%s)\n",def_str); - strFree(def_str); + free(def_str); } else { fprintf(stderr,"\n"); } @@ -315,11 +315,11 @@ void BoolParameter::setParam(bool b) { char* BoolParameter::getDefaultStr() const { - return strDup(def_value ? "1" : "0"); + return safe_strdup(def_value ? "1" : "0"); } char* BoolParameter::getValueStr() const { - return strDup(value ? "1" : "0"); + return safe_strdup(value ? "1" : "0"); } bool BoolParameter::isBool() const { @@ -381,7 +381,7 @@ IntParameter::operator int() const { StringParameter::StringParameter(const char* name_, const char* desc_, const char* v, Configuration* conf) - : VoidParameter(name_, desc_, conf), value(strDup(v)), def_value(v) + : VoidParameter(name_, desc_, conf), value(safe_strdup(v)), def_value(v) { if (!v) { fprintf(stderr,"Default value for %s not allowed\n",name_); @@ -390,7 +390,7 @@ StringParameter::StringParameter(const char* name_, const char* desc_, } StringParameter::~StringParameter() { - strFree(value); + free(value); } bool StringParameter::setParam(const char* v) { @@ -400,17 +400,17 @@ bool StringParameter::setParam(const char* v) { throw rfb::Exception("setParam() not allowed"); vlog.debug("set %s(String) to %s", getName(), v); CharArray oldValue(value); - value = strDup(v); + value = safe_strdup(v); return value != 0; } char* StringParameter::getDefaultStr() const { - return strDup(def_value); + return safe_strdup(def_value); } char* StringParameter::getValueStr() const { LOCK_CONFIG; - return strDup(value); + return safe_strdup(value); } // -=- BinaryParameter diff --git a/common/rfb/ConnParams.cxx b/common/rfb/ConnParams.cxx index 7b27a734..4bbd2cbe 100644 --- a/common/rfb/ConnParams.cxx +++ b/common/rfb/ConnParams.cxx @@ -82,7 +82,7 @@ void ConnParams::setPF(const PixelFormat& pf) void ConnParams::setName(const char* name) { delete [] name_; - name_ = strDup(name); + name_ = safe_strdup(name); } void ConnParams::setEncodings(int nEncodings, const rdr::U32* encodings) diff --git a/common/rfb/HTTPServer.cxx b/common/rfb/HTTPServer.cxx index 94f06090..934ca74e 100644 --- a/common/rfb/HTTPServer.cxx +++ b/common/rfb/HTTPServer.cxx @@ -240,7 +240,7 @@ HTTPServer::Session::processHTTP() { return writeResponse(501); // Store the URI to the "document" - uri.buf = strDup(path); + uri.buf = safe_strdup(path); } // Move on to reading the request headers diff --git a/common/rfb/Hostname.h b/common/rfb/Hostname.h index ebdf816f..d7ff664e 100644 --- a/common/rfb/Hostname.h +++ b/common/rfb/Hostname.h @@ -32,7 +32,7 @@ namespace rfb { if (!strSplit(&hi[1], ']', &hostBuf.buf, &portBuf.buf)) throw rdr::Exception("unmatched [ in host"); } else { - portBuf.buf = strDup(hi); + portBuf.buf = safe_strdup(hi); } if (strSplit(portBuf.buf, ':', hostBuf.buf ? 0 : &hostBuf.buf, &portBuf.buf)) { if (portBuf.buf[0] == ':') { @@ -45,7 +45,7 @@ namespace rfb { *port = basePort; } if (strlen(hostBuf.buf) == 0) - *host = strDup("localhost"); + *host = safe_strdup("localhost"); else *host = hostBuf.takeBuf(); } diff --git a/common/rfb/ListConnInfo.h b/common/rfb/ListConnInfo.h index cabcbc79..6e4eacc5 100644 --- a/common/rfb/ListConnInfo.h +++ b/common/rfb/ListConnInfo.h @@ -52,8 +52,8 @@ namespace rfb { void addInfo(void* Conn, char* IP, char* Time, int Status) { conn.push_back(Conn); - IP_address.push_back(strDup(IP)); - time_conn.push_back(strDup(Time)); + IP_address.push_back(safe_strdup(IP)); + time_conn.push_back(safe_strdup(Time)); status.push_back(Status); } @@ -62,16 +62,16 @@ namespace rfb { buf[1] = *ti; switch (*si) { case 0: - buf[2] = strDup("Full control"); + buf[2] = safe_strdup("Full control"); break; case 1: - buf[2] = strDup("View only"); + buf[2] = safe_strdup("View only"); break; case 2: - buf[2] = strDup("Stop updating"); + buf[2] = safe_strdup("Stop updating"); break; default: - buf[2] = strDup("Unknown"); + buf[2] = safe_strdup("Unknown"); } } diff --git a/common/rfb/Logger_file.cxx b/common/rfb/Logger_file.cxx index 8a109e4a..cf195c0d 100644 --- a/common/rfb/Logger_file.cxx +++ b/common/rfb/Logger_file.cxx @@ -97,7 +97,7 @@ 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 = safe_strdup(filename); } void Logger_File::setFile(FILE* file) @@ -113,7 +113,7 @@ void Logger_File::closeFile() fclose(m_file); m_file = 0; } - strFree(m_filename); + free(m_filename); m_filename = 0; } } diff --git a/common/rfb/VNCSConnectionST.cxx b/common/rfb/VNCSConnectionST.cxx index e286cf31..0006ff20 100644 --- a/common/rfb/VNCSConnectionST.cxx +++ b/common/rfb/VNCSConnectionST.cxx @@ -89,7 +89,7 @@ void VNCSConnectionST::close(const char* reason) { // Log the reason for the close if (!closeReason.buf) - closeReason.buf = strDup(reason); + closeReason.buf = safe_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 a21526ad..5be63969 100644 --- a/common/rfb/VNCServerST.cxx +++ b/common/rfb/VNCServerST.cxx @@ -74,7 +74,7 @@ static SSecurityFactoryStandard defaultSecurityFactory; VNCServerST::VNCServerST(const char* name_, SDesktop* desktop_, SSecurityFactory* sf) : blHosts(&blacklist), desktop(desktop_), desktopStarted(false), pb(0), - name(strDup(name_)), pointerClient(0), comparer(0), + name(safe_strdup(name_)), pointerClient(0), comparer(0), renderedCursorInvalid(false), securityFactory(sf ? sf : &defaultSecurityFactory), queryConnectionHandler(0), keyRemapper(&KeyRemapper::defInstance), @@ -363,7 +363,7 @@ void VNCServerST::serverCutText(const char* str, int len) void VNCServerST::setName(const char* name_) { - name.replaceBuf(strDup(name_)); + name.replaceBuf(safe_strdup(name_)); std::list::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 830d8444..9ea6a000 100644 --- a/common/rfb/secTypes.cxx +++ b/common/rfb/secTypes.cxx @@ -62,7 +62,7 @@ bool rfb::secTypeEncrypts(int num) std::list rfb::parseSecTypes(const char* types_) { std::list result; - CharArray types(strDup(types_)), type; + CharArray types(safe_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 a50ea586..7935a3a0 100644 --- a/common/rfb/util.cxx +++ b/common/rfb/util.cxx @@ -35,6 +35,19 @@ #endif #include +#include +#include +#include + +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. @@ -129,19 +142,6 @@ strncasecmp(const char *s1, const char *s2, size_t n) 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 @@ namespace rfb { } i+=increment; } - if (out1) *out1 = strDup(src); + if (out1) *out1 = safe_strdup(src); if (out2) *out2 = 0; return false; } diff --git a/common/rfb/util.h b/common/rfb/util.h index 933df527..8bf54842 100644 --- a/common/rfb/util.h +++ b/common/rfb/util.h @@ -30,6 +30,8 @@ #include #include +char* safe_strdup(const char* s); + namespace rfb { // -=- Class to handle cleanup of arrays of characters @@ -52,9 +54,6 @@ namespace rfb { 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. diff --git a/unix/tx/TXButton.h b/unix/tx/TXButton.h index b7472797..59a84303 100644 --- a/unix/tx/TXButton.h +++ b/unix/tx/TXButton.h @@ -59,7 +59,7 @@ public: // setText() changes the text in the button. void setText(const char* text_) { - text.buf = rfb::strDup(text_); + text.buf = safe_strdup(text_); int textWidth = XTextWidth(defaultFS, text.buf, strlen(text.buf)); int textHeight = (defaultFS->ascent + defaultFS->descent); int newWidth = __rfbmax(width(), textWidth + xPad*2 + bevel*2); diff --git a/unix/tx/TXLabel.h b/unix/tx/TXLabel.h index 3d5200d6..ebb8403c 100644 --- a/unix/tx/TXLabel.h +++ b/unix/tx/TXLabel.h @@ -47,7 +47,7 @@ public: // setText() changes the text in the label. void setText(const char* text_) { - text.buf = rfb::strDup(text_); + text.buf = safe_strdup(text_); lines = 0; int lineStart = 0; int textWidth = 0; diff --git a/unix/tx/TXMenu.cxx b/unix/tx/TXMenu.cxx index 92712f55..df57daf8 100644 --- a/unix/tx/TXMenu.cxx +++ b/unix/tx/TXMenu.cxx @@ -56,7 +56,7 @@ inline int TXMenu::entryHeight(int i) void TXMenu::addEntry(const char* text_, long id_) { assert(nEntries < maxEntries); - text[nEntries] = rfb::strDup(text_); + text[nEntries] = safe_strdup(text_); checked[nEntries] = false; id[nEntries++] = id_; int tw = 0; diff --git a/unix/tx/TXWindow.cxx b/unix/tx/TXWindow.cxx index 2b535df8..1b695e5b 100644 --- a/unix/tx/TXWindow.cxx +++ b/unix/tx/TXWindow.cxx @@ -93,7 +93,7 @@ void TXWindow::init(Display* dpy, const char* defaultWindowClass_) static char tickBits[] = { 0x80, 0xc0, 0xe2, 0x76, 0x3e, 0x1c, 0x08, 0x00}; tick = XCreateBitmapFromData(dpy, DefaultRootWindow(dpy), tickBits, tickSize, tickSize); - defaultWindowClass = rfb::strDup(defaultWindowClass_); + defaultWindowClass = safe_strdup(defaultWindowClass_); } void TXWindow::handleXEvents(Display* dpy) diff --git a/unix/vncviewer/CConn.cxx b/unix/vncviewer/CConn.cxx index 8231f4c6..efc3c335 100644 --- a/unix/vncviewer/CConn.cxx +++ b/unix/vncviewer/CConn.cxx @@ -221,8 +221,8 @@ void CConn::getUserPasswd(char** user, char** password) PasswdDialog dlg(dpy, title.buf, !user); if (!dlg.show()) throw rfb::Exception("Authentication cancelled"); if (user) - *user = strDup(dlg.userEntry.getText()); - *password = strDup(dlg.passwdEntry.getText()); + *user = safe_strdup(dlg.userEntry.getText()); + *password = safe_strdup(dlg.passwdEntry.getText()); } diff --git a/unix/vncviewer/vncviewer.cxx b/unix/vncviewer/vncviewer.cxx index 4a47788e..203df9a9 100644 --- a/unix/vncviewer/vncviewer.cxx +++ b/unix/vncviewer/vncviewer.cxx @@ -218,7 +218,7 @@ interpretViaParam (char **gatewayHost, char **remoteHost, if (**vncServerName != '\0') *remoteHost = *vncServerName; - *gatewayHost = strDup (via.getValueStr ()); + *gatewayHost = safe_strdup (via.getValueStr ()); *vncServerName = new char[50]; sprintf (*vncServerName, "localhost::%d", localPort); } diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx index ec2fd764..3e555ce2 100644 --- a/unix/x0vncserver/x0vncserver.cxx +++ b/unix/x0vncserver/x0vncserver.cxx @@ -101,7 +101,7 @@ public: const char* userName, char** reason) { if (queryConnectSock) { - *reason = strDup("Another connection is currently being queried."); + *reason = safe_strdup("Another connection is currently being queried."); return VNCServerST::REJECT; } if (!userName) userName = "(anonymous)"; diff --git a/unix/xserver/hw/vnc/XserverDesktop.cc b/unix/xserver/hw/vnc/XserverDesktop.cc index 66c92d29..e8e49494 100644 --- a/unix/xserver/hw/vnc/XserverDesktop.cc +++ b/unix/xserver/hw/vnc/XserverDesktop.cc @@ -219,7 +219,7 @@ void XserverDesktop::setFramebuffer(int w, int h, void* fbptr, int stride) char* XserverDesktop::substitute(const char* varName) { if (strcmp(varName, "$$") == 0) { - return rfb::strDup("$"); + return safe_strdup("$"); } if (strcmp(varName, "$PORT") == 0) { char* str = new char[10]; @@ -247,7 +247,7 @@ char* XserverDesktop::substitute(const char* varName) return str; } if (strcmp(varName, "$DESKTOP") == 0) { - return rfb::strDup(server->getName()); + return safe_strdup(server->getName()); } if (strcmp(varName, "$DISPLAY") == 0) { struct utsname uts; @@ -260,7 +260,7 @@ char* XserverDesktop::substitute(const char* varName) } if (strcmp(varName, "$USER") == 0) { struct passwd* user = getpwuid(getuid()); - return rfb::strDup(user ? user->pw_name : "?"); + return safe_strdup(user ? user->pw_name : "?"); } return 0; } @@ -270,13 +270,13 @@ XserverDesktop::queryConnection(network::Socket* sock, const char* userName, char** reason) { if (queryConnectId) { - *reason = strDup("Another connection is currently being queried."); + *reason = safe_strdup("Another connection is currently being queried."); return rfb::VNCServerST::REJECT; } queryConnectAddress.replaceBuf(sock->getPeerAddress()); if (!userName) userName = "(anonymous)"; - queryConnectUsername.replaceBuf(strDup(userName)); + queryConnectUsername.replaceBuf(safe_strdup(userName)); queryConnectId = sock; vncQueryConnect(this, sock); return rfb::VNCServerST::PENDING;