mirror of
https://github.com/ruby/ruby.git
synced 2026-01-27 12:34:21 +00:00
Fix memory leak in File.expand_path
File.expand_path leaks the dir if the encodings are not compatible.
For example:
Encoding.default_external = Encoding::UTF_16BE
10.times do
100_000.times do
File.expand_path("./a")
rescue
end
puts `ps -o rss= -p #{$$}`
end
Before:
12288
15488
18656
21872
25056
28240
31392
34688
37856
41056
After:
9680
9728
9728
9792
9792
9792
9792
9792
9792
This commit is contained in:
parent
c1f8d974a8
commit
dddef93bbd
10
file.c
10
file.c
@ -3710,7 +3710,15 @@ append_fspath(VALUE result, VALUE fname, char *dir, rb_encoding **enc, rb_encodi
|
||||
size_t dirlen = strlen(dir), buflen = rb_str_capacity(result);
|
||||
|
||||
if (NORMALIZE_UTF8PATH || *enc != fsenc) {
|
||||
rb_encoding *direnc = fs_enc_check(fname, dirname = ospath_new(dir, dirlen, fsenc));
|
||||
dirname = ospath_new(dir, dirlen, fsenc);
|
||||
if (!rb_enc_compatible(fname, dirname)) {
|
||||
xfree(dir);
|
||||
/* rb_enc_check must raise because the two encodings are not
|
||||
* compatible. */
|
||||
rb_enc_check(fname, dirname);
|
||||
rb_bug("unreachable");
|
||||
}
|
||||
rb_encoding *direnc = fs_enc_check(fname, dirname);
|
||||
if (direnc != fsenc) {
|
||||
dirname = rb_str_conv_enc(dirname, fsenc, direnc);
|
||||
RSTRING_GETMEM(dirname, cwdp, dirlen);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user