From a5720e571939ff452967cf9cdb1b7d8665708739 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Tue, 20 Nov 2018 10:44:39 +0100 Subject: [PATCH] Fix memory leaks --- common/rfb/SSecurityPlain.cxx | 2 +- unix/tx/TXWindow.cxx | 16 +++++++++------- unix/vncpasswd/vncpasswd.cxx | 15 ++++++++++++++- unix/xserver/hw/vnc/vncExtInit.cc | 4 ++-- vncviewer/DesktopWindow.cxx | 4 ++-- vncviewer/OptionsDialog.cxx | 2 +- vncviewer/ServerDialog.cxx | 10 +++++----- vncviewer/parameters.cxx | 2 ++ vncviewer/vncviewer.cxx | 2 +- 9 files changed, 37 insertions(+), 20 deletions(-) diff --git a/common/rfb/SSecurityPlain.cxx b/common/rfb/SSecurityPlain.cxx index 6d48b65c..6f72432a 100644 --- a/common/rfb/SSecurityPlain.cxx +++ b/common/rfb/SSecurityPlain.cxx @@ -41,7 +41,7 @@ StringParameter PasswordValidator::plainUsers bool PasswordValidator::validUser(const char* username) { - CharArray users(strDup(plainUsers.getValueStr())), user; + CharArray users(plainUsers.getValueStr()), user; while (users.buf) { strSplit(users.buf, ',', &user.buf, &users.buf); diff --git a/unix/tx/TXWindow.cxx b/unix/tx/TXWindow.cxx index a6819179..6129840e 100644 --- a/unix/tx/TXWindow.cxx +++ b/unix/tx/TXWindow.cxx @@ -24,6 +24,7 @@ #include #include #include +#include #include std::list windows; @@ -132,20 +133,20 @@ TXGlobalEventHandler* TXWindow::setGlobalEventHandler(TXGlobalEventHandler* h) void TXWindow::getColours(Display* dpy, XColor* cols, int nCols) { - bool* got = new bool[nCols]; + std::vector got; + bool failed = false; int i; for (i = 0; i < nCols; i++) { if (XAllocColor(dpy, cmap, &cols[i])) { - got[i] = true; + got.push_back(true); } else { - got[i] = false; + got.push_back(false); failed = true; } } if (!failed) { - delete [] got; return; } @@ -168,12 +169,13 @@ void TXWindow::getColours(Display* dpy, XColor* cols, int nCols) int cmapSize = DisplayCells(dpy,DefaultScreen(dpy)); XColor* cm = new XColor[cmapSize]; - bool* shared = new bool[cmapSize]; - bool* usedAsNearest = new bool[cmapSize]; + std::vector shared; + std::vector usedAsNearest; for (i = 0; i < cmapSize; i++) { cm[i].pixel = i; - shared[i] = usedAsNearest[i] = false; + shared.push_back(false); + usedAsNearest.push_back(false); } XQueryColors(dpy, cmap, cm, cmapSize); diff --git a/unix/vncpasswd/vncpasswd.cxx b/unix/vncpasswd/vncpasswd.cxx index 8bd4e48e..3055223e 100644 --- a/unix/vncpasswd/vncpasswd.cxx +++ b/unix/vncpasswd/vncpasswd.cxx @@ -134,7 +134,7 @@ int main(int argc, char** argv) } else if (argv[i][0] == '-') { usage(); } else if (!fname) { - fname = argv[i]; + fname = strDup(argv[i]); } else { usage(); } @@ -165,24 +165,37 @@ 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); } chmod(fname, S_IRUSR|S_IWUSR); 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); } + delete obfuscated; + 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); } } fclose(fp); + delete [] fname; + delete obfuscatedReadOnly; + return 0; } } diff --git a/unix/xserver/hw/vnc/vncExtInit.cc b/unix/xserver/hw/vnc/vncExtInit.cc index d6f6b742..7ca71d94 100644 --- a/unix/xserver/hw/vnc/vncExtInit.cc +++ b/unix/xserver/hw/vnc/vncExtInit.cc @@ -184,7 +184,7 @@ void vncExtensionInit(void) listeners.push_back(new network::TcpListener(vncInetdSock)); vlog.info("inetd wait"); } - } else if (rfbunixpath.getValueStr()[0] != '\0') { + } else if (((const char*)rfbunixpath)[0] != '\0') { char path[PATH_MAX]; int mode = (int)rfbunixmode; @@ -192,7 +192,7 @@ void vncExtensionInit(void) strncpy(path, rfbunixpath, sizeof(path)); else snprintf(path, sizeof(path), "%s.%d", - rfbunixpath.getValueStr(), scr); + (const char*)rfbunixpath, scr); path[sizeof(path)-1] = '\0'; listeners.push_back(new network::UnixListener(path, mode)); diff --git a/vncviewer/DesktopWindow.cxx b/vncviewer/DesktopWindow.cxx index d070b648..1843485a 100644 --- a/vncviewer/DesktopWindow.cxx +++ b/vncviewer/DesktopWindow.cxx @@ -103,12 +103,12 @@ DesktopWindow::DesktopWindow(int w, int h, const char *name, int geom_x = 0, geom_y = 0; if (strcmp(geometry, "") != 0) { int matched; - matched = sscanf(geometry.getValueStr(), "+%d+%d", &geom_x, &geom_y); + matched = sscanf((const char*)geometry, "+%d+%d", &geom_x, &geom_y); if (matched == 2) { force_position(1); } else { int geom_w, geom_h; - matched = sscanf(geometry.getValueStr(), "%dx%d+%d+%d", &geom_w, &geom_h, &geom_x, &geom_y); + matched = sscanf((const char*)geometry, "%dx%d+%d+%d", &geom_w, &geom_h, &geom_x, &geom_y); switch (matched) { case 4: force_position(1); diff --git a/vncviewer/OptionsDialog.cxx b/vncviewer/OptionsDialog.cxx index b018c95b..62b5d9c5 100644 --- a/vncviewer/OptionsDialog.cxx +++ b/vncviewer/OptionsDialog.cxx @@ -282,7 +282,7 @@ void OptionsDialog::loadOptions(void) /* Screen */ int width, height; - if (sscanf(desktopSize.getValueStr(), "%dx%d", &width, &height) != 2) { + if (sscanf((const char*)desktopSize, "%dx%d", &width, &height) != 2) { desktopSizeCheckbox->value(false); desktopWidthInput->value("1024"); desktopHeightInput->value("768"); diff --git a/vncviewer/ServerDialog.cxx b/vncviewer/ServerDialog.cxx index de67f87b..fec17896 100644 --- a/vncviewer/ServerDialog.cxx +++ b/vncviewer/ServerDialog.cxx @@ -150,7 +150,7 @@ void ServerDialog::handleLoad(Fl_Widget *widget, void *data) return; } - const char* filename = strdup(file_chooser->value()); + const char* filename = file_chooser->value(); try { dialog->serverName->value(loadViewerParameters(filename)); @@ -165,8 +165,8 @@ void ServerDialog::handleLoad(Fl_Widget *widget, void *data) void ServerDialog::handleSaveAs(Fl_Widget *widget, void *data) { ServerDialog *dialog = (ServerDialog*)data; - const char* servername = strdup(dialog->serverName->value()); - char* filename; + const char* servername = dialog->serverName->value(); + const char* filename; Fl_File_Chooser* file_chooser = new Fl_File_Chooser("", _("TigerVNC configuration (*.tigervnc)"), 2, _("Save the TigerVNC configuration to file")); @@ -187,7 +187,7 @@ void ServerDialog::handleSaveAs(Fl_Widget *widget, void *data) return; } - filename = strdup(file_chooser->value()); + filename = file_chooser->value(); FILE* f = fopen(filename, "r"); if (f) { @@ -235,7 +235,7 @@ void ServerDialog::handleCancel(Fl_Widget *widget, void *data) void ServerDialog::handleConnect(Fl_Widget *widget, void *data) { ServerDialog *dialog = (ServerDialog*)data; - const char* servername = strdup(dialog->serverName->value()); + const char* servername = dialog->serverName->value(); dialog->hide(); diff --git a/vncviewer/parameters.cxx b/vncviewer/parameters.cxx index 51cce3d7..94cc1b05 100644 --- a/vncviewer/parameters.cxx +++ b/vncviewer/parameters.cxx @@ -499,6 +499,7 @@ void saveViewerParameters(const char *filename, const char *servername) { } snprintf(filepath, sizeof(filepath), "%sdefault.tigervnc", homeDir); + free(homeDir); } else { snprintf(filepath, sizeof(filepath), "%s", filename); } @@ -555,6 +556,7 @@ char* loadViewerParameters(const char *filename) { "can't obtain home directory path.")); snprintf(filepath, sizeof(filepath), "%sdefault.tigervnc", homeDir); + free(homeDir); } else { snprintf(filepath, sizeof(filepath), "%s", filename); } diff --git a/vncviewer/vncviewer.cxx b/vncviewer/vncviewer.cxx index f076565f..a9d4dfea 100644 --- a/vncviewer/vncviewer.cxx +++ b/vncviewer/vncviewer.cxx @@ -470,9 +470,9 @@ static int mktunnel() int localPort = findFreeTcpPort(); int remotePort; - gatewayHost = strDup(via.getValueStr()); if (interpretViaParam(remoteHost, &remotePort, localPort) != 0) return 1; + gatewayHost = (const char*)via; createTunnel(gatewayHost, remoteHost, remotePort, localPort); return 0; -- 2.39.5