Skip to content

Commit 53b85ab

Browse files
take-cheezekatzer
authored andcommitted
Fix memory errors. (iij#1)
* Create tmp directory for test. * Avoid buffer overflow. * Fix memory leaks.
1 parent 5e07806 commit 53b85ab

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

mrbgem.rake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,6 @@ MRuby::Gem::Specification.new('mruby-process') do |spec|
4747
else
4848
spec.objs.delete objfile("#{build_dir}/src/win32")
4949
end
50+
51+
FileUtils.mkdir_p "#{MRUBY_ROOT}/tmp"
5052
end

src/internal.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,14 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
114114
result = (char **)mrb_malloc(mrb, sizeof(char *) * (argc + 3));
115115

116116
#if defined(__APPLE__) || defined(__linux__)
117+
static char default_shell[] = "/bin/sh", default_shell_mod[] = "-c";
117118
shell = getenv("SHELL");
118-
if (!shell) shell = strdup("bin/sh");
119-
shell_mod = strdup("-c");
120119
#else
120+
static char default_shell[] = "C:\\WINDOWS\\system32\\cmd.exe", default_shell_mod[] = "/c";
121121
shell = getenv("ComSpec");
122-
if (!shell) shell = strdup("C:\\WINDOWS\\system32\\cmd.exe");
123-
shell_mod = strdup("/c");
124122
#endif
123+
if (!shell) shell = default_shell;
124+
shell_mod = default_shell_mod;
125125
mrb_build_shell_array(mrb, argv, argc, shell, shell_mod, result);
126126
argc+=2;
127127
}
@@ -161,7 +161,7 @@ mrb_execarg_fill(mrb_state *mrb, mrb_value env, mrb_value *argv, mrb_int argc, m
161161
mrb_value val = mrb_hash_get(mrb, env, key);
162162
mrb_value skey = mrb_symbol_p(key) ? mrb_sym2str(mrb, mrb_symbol(key)) : key;
163163
mrb_value sval = mrb_convert_type(mrb, val, MRB_TT_STRING, "String", "to_s");
164-
mrb_int slen = RSTRING_LEN(skey) + RSTRING_LEN(sval) + 1;
164+
mrb_int slen = RSTRING_LEN(skey) + RSTRING_LEN(sval) + 2;
165165
char str[slen];
166166

167167
sprintf(str, "%s=%s",

src/process.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ mrb_spawn_internal(mrb_state *mrb, mrb_value klass)
323323
{
324324
struct mrb_execarg *eargp;
325325
pid_t pid;
326+
char **p;
326327

327328
eargp = mrb_execarg_new(mrb);
328329

@@ -331,6 +332,13 @@ mrb_spawn_internal(mrb_state *mrb, mrb_value klass)
331332
else
332333
pid = spawnv(eargp->filename, eargp->argv, eargp->fd.in, eargp->fd.out, eargp->fd.err);
333334

335+
if (eargp->envp) {
336+
for (p = eargp->envp; *p; ++p) { free(*p); }
337+
mrb_free(mrb, eargp->envp);
338+
}
339+
340+
mrb_free(mrb, eargp->argv);
341+
334342
free(eargp);
335343

336344
return pid;

0 commit comments

Comments
 (0)