[Rd] file descriptor leak in getSrcLines in R 2.10.0 svn 48590

William Dunlap wdunlap at tibco.com
Fri May 22 17:17:08 CEST 2009


> ... 
> 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:

> 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