mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
file.c: reduce xmalloc
* file.c (rb_readlink): read symlink in the result string directly. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f3dd7c4963
commit
315cbef835
1 changed files with 5 additions and 7 deletions
12
file.c
12
file.c
|
@ -2443,7 +2443,6 @@ rb_file_s_readlink(VALUE klass, VALUE path)
|
|||
static VALUE
|
||||
rb_readlink(VALUE path)
|
||||
{
|
||||
char *buf;
|
||||
int size = 100;
|
||||
ssize_t rv;
|
||||
VALUE v;
|
||||
|
@ -2451,21 +2450,20 @@ rb_readlink(VALUE path)
|
|||
rb_secure(2);
|
||||
FilePathValue(path);
|
||||
path = rb_str_encode_ospath(path);
|
||||
buf = xmalloc(size);
|
||||
while ((rv = readlink(RSTRING_PTR(path), buf, size)) == size
|
||||
v = rb_enc_str_new(0, size, rb_filesystem_encoding());
|
||||
while ((rv = readlink(RSTRING_PTR(path), RSTRING_PTR(v), size)) == size
|
||||
#ifdef _AIX
|
||||
|| (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */
|
||||
#endif
|
||||
) {
|
||||
rb_str_modify_expand(v, size);
|
||||
size *= 2;
|
||||
buf = xrealloc(buf, size);
|
||||
}
|
||||
if (rv < 0) {
|
||||
xfree(buf);
|
||||
rb_str_resize(v, 0);
|
||||
rb_sys_fail_path(path);
|
||||
}
|
||||
v = rb_filesystem_str_new(buf, rv);
|
||||
xfree(buf);
|
||||
rb_str_resize(v, rv);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue