[Rd] file descriptor leak in getSrcLines in R 2.10.0 svn 48590
Duncan Murdoch
murdoch at stats.uwo.ca
Fri May 22 17:25:22 CEST 2009
On 5/22/2009 11:17 AM, William Dunlap wrote:
>> ...
>> The idea is that if the srcfile is already open, then it
>> should be left
>> open; but if it is not open, it should be closed at the end.
>> open() on
>> an open srcfile is supposed to make no change to the srcfile, just
>> return the already open connection.
>>
>> > (It looks like the srcref stuff is not finished yet, as
>> there are other
>> > problems, like print(parse(file)) not showing what it used to.)
>>
>>
>> This is an encoding problem, which looks easy to fix. I
>> think the leak
>> was caused by this: because of the encoding problem, the connections
>> got opened but open.srcfile aborted before completion, so
>> close.srcfile
>> didn't think the srcfile was open at all, and it left the
>> connections in
>> existence.
>
> That incompletely opened connection may be why after doing
> this test closeAllConnections crashed R because the ex_ptr
> component of an Rconnection object was a nil pointer:
I saw a crash like that once, but then couldn't reproduce it. I'll see
if I can do so with your code.
Duncan Murdoch
>
>> tf<-tempfile()
>> cat(file=tf, "1:10\nlog(log(pi))\n")
>> p<-parse(tf)
>> p
> expression(<srcref: file "/tmp/RtmpazU79B/file327b23c6" chars 1:1 to 1:4>,
> <srcref: file "/tmp/RtmpazU79B/file327b23c6" chars 2:1 to 2:12>)
> attr(,"srcfile")
> /tmp/RtmpazU79B/file327b23c6
>> showConnections()
> description class mode text isopen can read can write
> 3 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no"
> 4 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no"
> 5 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no"
> 6 "/tmp/RtmpazU79B/file327b23c6" "file" "rt" "text" "opened" "yes" "no"
>> closeAllConnections()
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x08118eff in Rf_setAttrib (vec=0x883f278, name=0x8621948, val=0x0)
> at attrib.c:226
> 226 if (NAMED(val)) val = duplicate(val);
> (gdb) up
> #1 0x08146c7b in do_getconnection (call=0x87a3b74, op=0x85f6fd8,
> args=0x87a3ca8, env=0x87a3c1c) at connections.c:4166
> 4166 setAttrib(ans, install("conn_id"), con->ex_ptr);
> (gdb) list
> 4161 PROTECT(class = allocVector(STRSXP, 2));
> 4162 SET_STRING_ELT(class, 0, mkChar(con->class));
> 4163 SET_STRING_ELT(class, 1, mkChar("connection"));
> 4164 classgets(ans, class);
> 4165 if (what > 2)
> 4166 setAttrib(ans, install("conn_id"), con->ex_ptr);
> 4167 UNPROTECT(2);
> 4168 return ans;
> 4169 }
> 4170
>
> (gdb) print con->ex_ptr
> $3 = (void *) 0x0
> (gdb) print *con
> $4 = {class = 0x90c8940 "file",
> description = 0x89c5878 "/tmp/RtmpazU79B/file327b23c6", enc = 0,
> mode = "rt\000\000", text = TRUE, isopen = TRUE, incomplete = FALSE,
> canread = TRUE, canwrite = FALSE, canseek = TRUE, blocking = TRUE,
> isGzcon = FALSE, open = 0x813c4f2 <file_open>,
> close = 0x813c77b <file_close>, destroy = 0x813bcf9 <null_destroy>,
> vfprintf = 0x813c7c3 <file_vfprintf>, fgetc = 0x813bfef <dummy_fgetc>,
> fgetc_internal = 0x813c860 <file_fgetc_internal>,
> seek = 0x813c8f9 <file_seek>, truncate = 0x813caa1 <file_truncate>,
> fflush = 0x813cb8a <file_fflush>, read = 0x813cbae <file_read>,
> write = 0x813cc26 <file_write>, nPushBack = 0, posPushBack = 64256,
> PushBack = 0x204, save = -1000, save2 = -1000,
> encname = "unknown", '\0' <repeats 93 times>, "A", inconv = 0x0,
> outconv = 0x0,
> iconvbuff = " \036\022\tE\001\000\000F\001\000\000G\001\000\000H\001\000\000I\001\000\000J",
> oconvbuff = "\001\000\000K\001\000\000L\001\000\000M\001\000\000N\001\000\000O\001\000\000P\001\000\000Q\001\000\000R\001\000\000S\001\000\000T\001\000\000U\001\000\000V\001", next = 0x157 <Address 0x157 out of bounds>,
> init_out = "X\001\000\000Y\001\000\000Z\001\000\000[\001\000\000\\\001\000\000]\001\000\000^", navail = 0, inavail = 351, EOF_signalled = 352,
> UTF8out = FALSE, id = 0x23, ex_ptr = 0x0, private = 0x908ec78}
More information about the R-devel
mailing list