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:
nobu 2012-09-16 09:24:44 +00:00
parent f3dd7c4963
commit 315cbef835

12
file.c
View File

@ -2443,7 +2443,6 @@ rb_file_s_readlink(VALUE klass, VALUE path)
static VALUE static VALUE
rb_readlink(VALUE path) rb_readlink(VALUE path)
{ {
char *buf;
int size = 100; int size = 100;
ssize_t rv; ssize_t rv;
VALUE v; VALUE v;
@ -2451,21 +2450,20 @@ rb_readlink(VALUE path)
rb_secure(2); rb_secure(2);
FilePathValue(path); FilePathValue(path);
path = rb_str_encode_ospath(path); path = rb_str_encode_ospath(path);
buf = xmalloc(size); v = rb_enc_str_new(0, size, rb_filesystem_encoding());
while ((rv = readlink(RSTRING_PTR(path), buf, size)) == size while ((rv = readlink(RSTRING_PTR(path), RSTRING_PTR(v), size)) == size
#ifdef _AIX #ifdef _AIX
|| (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */ || (rv < 0 && errno == ERANGE) /* quirky behavior of GPFS */
#endif #endif
) { ) {
rb_str_modify_expand(v, size);
size *= 2; size *= 2;
buf = xrealloc(buf, size);
} }
if (rv < 0) { if (rv < 0) {
xfree(buf); rb_str_resize(v, 0);
rb_sys_fail_path(path); rb_sys_fail_path(path);
} }
v = rb_filesystem_str_new(buf, rv); rb_str_resize(v, rv);
xfree(buf);
return v; return v;
} }