# \#2009 File.open memory leak

**URL:** <https://www.ruby-forum.com/t/2009-file-open-memory-leak/176442>\
**Category:** Development\
**Created:** [September 30, 2009, 4:54pm UTC](https://www.ruby-forum.com/t/2009-file-open-memory-leak/176442 "2009-09-30T16:54:57Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecd19e/32.png) [@SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/u/SSSBSHS_SSSSS5SRSmS)\
**Post date:** [September 30, 2009, 4:54pm UTC](https://www.ruby-forum.com/t/2009-file-open-memory-leak/176442/1 "2009-09-30T16:54:57Z")

</div>

e$B$H$\_$?$G$9!#e(B

# e$B1Q8l$O%@%a$J$N$Ge(B ruby-dev e$B$G!De(B

[http://redmine.ruby-lang.org/issues/show/2009](http://redmine.ruby-lang.org/issues/show/2009) e$B$Ne(B File.open memory  
leak  
e$B$G$9$,!"860x$Oe(B r21435 e$B$Ne(B gc.c e$B$N\<!$NJQ99$@$H;W$$$^$9!#e(B

@@ -1274,8 +1291,11 @@  
break;  
case T\_FILE:  
if (RANY(obj)-\>as.file.fptr) {

- 

```
 rb_io_fptr_finalize(RANY(obj)->as.file.fptr);

```

- 

```
 RUBY_CRITICAL(free(RANY(obj)->as.file.fptr));

```

- 

```
 struct rb_io_t *fptr = RANY(obj)->as.file.fptr;

```

- 

```
 make_deferred(RANY(obj));

```

- 

```
 RDATA(obj)->dfree = (void (*)(void*))rb_io_fptr_finalize;

```

- 

```
 RDATA(obj)->data = fptr;

```

- 

```
 return 1;

```

}  
break;  
case T\_ICLASS:

fptr e$B$Ne(B free() e$B$,$J$/$J$C$?$?$a$K%a%b%j%j!\<%/$7$F$^$9!#e(B

e$B\<!$N$h$&$J$9$l$PD\>$j$^$7$?!#e(B

# Index: gc.c

— gc.c (e$B%j%S%8%g%se(B 25170)  
+++ gc.c (e$B:n6H%3%T!\<e(B)  
@@ -1243,6 +1243,14 @@  
p-\>as.basic.flags = (p-\>as.basic.flags & ~T\_MASK) | T\_DEFERRED;  
}

+static void  
+fptr\_finalize\_and\_free(fptr)

- void \*fptr;  
+{
- rb\_io\_fptr\_finalize(fptr);
- free(fptr);  
+}
- 

static int  
obj\_free(obj)  
VALUE obj;  
@@ -1318,7 +1326,7 @@  
if (RANY(obj)-\>as.file.fptr) {  
struct rb\_io\_t \*fptr = RANY(obj)-\>as.file.fptr;  
make\_deferred(RANY(obj));

- 

```
 RDATA(obj)->dfree = (void (*)(void*))rb_io_fptr_finalize;

```

- 

```
 RDATA(obj)->dfree = (void (*)(void*))fptr_finalize_and_free;
 RDATA(obj)->data = fptr;
 return 1;

```

}

---

<div class="post-metadata">

**Author:** ![SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecd19e/32.png) [@SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/u/SSSBSHS_SSSSS5SRSmS)\
**Post date:** [September 30, 2009, 6:19pm UTC](https://www.ruby-forum.com/t/2009-file-open-memory-leak/176442/2 "2009-09-30T18:19:17Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39410] #2009 File.open memory leak”  
on Wed, 30 Sep 2009 23:54:20 +0900, e$B$H$\_$?$^$5$R$me(B  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|# e$B1Q8l$O%@%a$J$N$Ge(B ruby-dev e$B$G!De(B  
|  
|[http://redmine.ruby-lang.org/issues/show/2009](http://redmine.ruby-lang.org/issues/show/2009) e$B$Ne(B File.open memory leak  
|e$B$G$9$,!"860x$Oe(B r21435 e$B$Ne(B gc.c e$B$N\<!$NJQ99$@$H;W$$$^$9!#e(B

e$B$J$k$[$I!#e(B

|fptr e$B$Ne(B free() e$B$,$J$/$J$C$?$?$a$K%a%b%j%j!\<%/$7$F$^$9!#e(B  
|  
|e$B\<!$N$h$&$J$9$l$PD\>$j$^$7$?!#e(B

1.9e$B$N$h$&$Ke(Brb\_io\_fptr\_finalize()e$B$N:G8e$Ge(Bfptre$B$re(Bxfree()e$B$9$l$PNIe(B  
e$B$$$h$&$K;W$$$^$9!#e(B

e$B$3$s$J%Q%C%A$r=q$$$F$\_$^$7$?!#e(Bmake teste$B$/$i$$$O$A$c$s$HF0$/e(B  
e$B$h$&$G$9!#:NMQ$9$k$+$I$&$+$Oe(B1.8e$B$N%a%s%F%J!\<$KG$$;$^$9!#e(B

— a/io.c  
+++ b/io.c  
@@ -2348,10 +2348,10 @@ rb\_io\_fptr\_finalize(fptr)  
if (fptr-\>path) {  
free(fptr-\>path);  
}

- if (!fptr-\>f && !fptr-\>f2) return;
- if (fileno(fptr-\>f) \< 3) return;
- 
- rb\_io\_fptr\_cleanup(fptr, Qtrue);

- if ((fptr-\>f && fileno(fptr-\>f) \> 2) || fptr-\>f2) {
- rb\_io\_fptr\_cleanup(fptr, Qtrue);
- }
- xfree(fptr);  
}

VALUE

---

<div class="post-metadata">

**Author:** ![SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/ecd19e/32.png) [@SSSBSHS\_SSSSS5SRSmS](https://www.ruby-forum.com/u/SSSBSHS_SSSSS5SRSmS)\
**Post date:** [October 2, 2009, 7:46am UTC](https://www.ruby-forum.com/t/2009-file-open-memory-leak/176442/3 "2009-10-02T07:46:45Z")

</div>

At Thu, 1 Oct 2009 01:18:34 +0900,  
matz wrote:

> |fptr ã® free() ãŒãªããªã£ãŸãŸã‚ã«ãƒ¡ãƒ¢ãƒªãƒªãƒ¼ã‚¯ã—ã¦ã¾ã™ã€‚  
> |  
> |æ¬¡ã®ã‚ˆã†ãªã™ã‚Œã°ç›´ã‚Šã¾ã—ãŸã€‚
> 
> 1.9ã®ã‚ˆã†ã«rb\_io\_fptr\_finalize()ã®æœ€å¾Œã§fptrã‚’xfree()ã™ã‚Œã°è‰¯  
> ã„ã‚ˆã†ã«æ€ã„ã¾ã™ã€‚
> 
> ã“ã‚“ãªãƒ‘ãƒƒãƒã‚’æ›¸ã„ã¦ã¿ã¾ã—ãŸã€‚make testãã‚‰ã„ã¯ã¡ã‚ƒã‚“ã¨å‹•ã  
> ã‚ˆã†ã§ã™ã€‚æŽ¡ç”¨ã™ã‚‹ã‹ã©ã†ã‹ã¯1.8ã®ãƒ¡ãƒ³ãƒ†ãƒŠãƒ¼ã«ä»»ã›ã¾ã™ã€‚

1.9ã§ã‚‚ rb\_io\_fptr\_finalize() ãŒ free(fptr) ã—ã¦ã„ã‚‹ã®ã§ã“ã‚ŒãŒ  
ã„ã„ã¨æ€ã„ã¾ã™ã€‚commitã‚’ãŠé¡˜ã„ã—ã¾ã™ã€‚
