Skip to content

Commit 9c41c8d

Browse files
tychobrailleurBanzaiMan
authored andcommitted
Fixing memory leaks, more than likely responsible for JRUBY-6313
1 parent b62c119 commit 9c41c8d

File tree

4 files changed

+37
-25
lines changed

4 files changed

+37
-25
lines changed

argparser.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <cstring>
66
#include <cstdlib>
77
#include <memory>
8+
#include <string>
89
#include "utilsfuncs.h"
910
#include "argparser.h"
1011
#include "argnames.h"
@@ -166,12 +167,9 @@ bool ArgParser::initPlatformDir() {
166167

167168
if (!found) { // try via PATH search
168169
logMsg("initPlatformDir: trying to find executable on PATH");
169-
char * location = findOnPath(platformDir.c_str());
170-
if (location != NULL) {
171-
strncpy(path, location, PATH_MAX);
172-
free(location);
173-
found = true;
174-
}
170+
std::string location = findOnPath(platformDir.c_str());
171+
strncpy(path, location.c_str(), PATH_MAX);
172+
found = true;
175173
}
176174

177175
if (!found) { // try via JRUBY_HOME
@@ -430,6 +428,7 @@ void ArgParser::prepareOptions() {
430428
option += bootClassPath;
431429
javaOptions.push_back(option);
432430
}
431+
433432
}
434433

435434
void ArgParser::setupMaxHeapAndStack() {

unixlauncher.cpp

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,15 @@ int UnixLauncher::run(int argc, char* argv[], char* envp[]) {
2828
if (nailgunClient) {
2929
progArgs.push_front("org.jruby.util.NailMain");
3030
char ** nailArgv = convertToArgvArray(progArgs);
31+
int nailArgc = progArgs.size();
32+
3133
if (printCommandLine) {
32-
return printArgvToConsole(nailArgv);
34+
printListToConsole(progArgs);
35+
for (int i = 0; i < nailArgc; i++) {
36+
free(nailArgv[i]);
37+
}
38+
delete[] nailArgv;
39+
return 0;
3340
}
3441
return nailgunClientMain(progArgs.size(), (char**)nailArgv, envp);
3542
}
@@ -65,12 +72,17 @@ int UnixLauncher::run(int argc, char* argv[], char* envp[]) {
6572
}
6673

6774
char** newArgv = convertToArgvArray(commandLine);
75+
int newArgc = commandLine.size();
6876

6977
if (printCommandLine) {
70-
return printArgvToConsole(newArgv);
78+
printListToConsole(commandLine);
79+
for (int i = 0; i < newArgc; i++) {
80+
free(newArgv[i]);
81+
}
82+
delete[] newArgv;
83+
return 0;
7184
}
7285

73-
7486
if (!fileExists(java.c_str())) {
7587
string msg = "No `java' exists at " + java + ", please double-check JAVA_HOME.\n";
7688
printToConsole(msg.c_str());

utilsfuncs.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
#include <cstring>
4848
#include <cstdlib>
4949
#include <memory>
50+
#include <list>
51+
#include <algorithm>
52+
#include <iterator>
53+
#include <iostream>
5054
#include "utilsfuncs.h"
5155
#include "argnames.h"
5256

@@ -114,7 +118,7 @@ bool fileExists(const char *path) {
114118
return true;
115119
}
116120

117-
char* findOnPath(const char* name) {
121+
string findOnPath(const char* name) {
118122
string path(getenv("PATH"));
119123
size_t start = 0;
120124
size_t sep;
@@ -133,9 +137,8 @@ char* findOnPath(const char* name) {
133137
elem += name;
134138

135139
if (checkExists(elem.c_str(), 0)) {
136-
found = (char*) malloc(elem.length());
137-
strncpy(found, elem.c_str(), elem.length() + 1);
138-
return found;
140+
string found_string(elem);
141+
return found_string;
139142
}
140143

141144
start = sep + 1;
@@ -244,26 +247,24 @@ bool printToConsole(const char *msg) {
244247
}
245248

246249
char** convertToArgvArray(list<string> args) {
247-
char ** argv = (char**) malloc(sizeof (char*) * args.size() + 1);
250+
char ** argv = new char*[args.size()+2];
248251
int i = 0;
249252
for (list<string>::iterator it = args.begin(); it != args.end(); ++it, ++i) {
250-
argv[i] = (char*) malloc(sizeof(char) * it->length() + 1);
251-
strncpy(argv[i], it->c_str(), it->length() + 1);
253+
argv[i] = strdup((*it).c_str());
252254
}
253-
argv[i] = NULL;
255+
argv[args.size()+1] = NULL;
254256
return argv;
255257
}
256258

257259
void addToArgList(list<string> & args, int argc, char ** argv) {
258260
for (int i = 0; i < argc; i++) {
259-
args.push_back(argv[i]);
261+
std::string str(argv[i]);
262+
args.push_back(str);
260263
}
261264
}
262265

263-
int printArgvToConsole(char** argv) {
264-
while (*argv) {
265-
printf("%s\n", *argv);
266-
argv++;
266+
void printListToConsole(list<string> values) {
267+
for (list<string>::iterator it = values.begin(); it != values.end(); ++it) {
268+
std::cout << *it << std::endl;
267269
}
268-
return 0;
269270
}

utilsfuncs.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ bool checkLoggingArg(int argc, char *argv[], bool delFile);
5656
bool printToConsole(const char *msg);
5757
char** convertToArgvArray(std::list<std::string> args);
5858
void addToArgList(std::list<std::string> & args, int argc, char ** argv);
59-
char* findOnPath(const char* name);
59+
std::string findOnPath(const char* name);
6060
bool checkDirectory(const char* path);
61-
int printArgvToConsole(char** argv);
61+
void printListToConsole(std::list<std::string> l);
6262

6363
#ifndef WIN32
6464
#define FILE_SEP '/'

0 commit comments

Comments
 (0)