Hervé Pagès
2015-Sep-21 20:50 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
Hi,
Note that one significant change to read.dcf() that happened since R
3.0.2 is the addition of support for arbitrary long lines (commit
63281), which never worked:
dcf <- paste(c("aa: ", rep(letters, length.out=10000)),
collapse="")
writeLines(dcf, "test.dcf")
nchar(read.dcf("test.dcf"))
# aa
# [1,] 8186
The culprit being line 53 in src/main/dcf.c where the author of the
Rconn_getline2() function only copies 'nbuf' chars from 'buf' to
'buf2'
when in fact 'nbuf + 1' chars have been stored in 'buf' so far.
Quickest fix:
Index: src/main/dcf.c
==================================================================---
src/main/dcf.c (revision 69404)
+++ src/main/dcf.c (working copy)
@@ -50,7 +50,7 @@
if(nbuf+2 >= bufsize) { // allow for terminator below
bufsize *= 2;
char *buf2 = R_alloc(bufsize, sizeof(char));
- memcpy(buf2, buf, nbuf);
+ memcpy(buf2, buf, nbuf + 1);
buf = buf2;
}
if(c != '\n'){
However a better fix would be to have 'nbuf' actually contain the nb
of chars that was stored in 'buf' so far (as it name suggests):
Index: src/main/dcf.c
==================================================================---
src/main/dcf.c (revision 69404)
+++ src/main/dcf.c (working copy)
@@ -42,12 +42,12 @@
/* Use R_alloc as this might get interrupted */
static char *Rconn_getline2(Rconnection con)
{
- int c, bufsize = MAXELTSIZE, nbuf = -1;
+ int c, bufsize = MAXELTSIZE, nbuf = 0;
char *buf;
buf = R_alloc(bufsize, sizeof(char));
while((c = Rconn_fgetc(con)) != R_EOF) {
- if(nbuf+2 >= bufsize) { // allow for terminator below
+ if(nbuf+1 >= bufsize) { // allow for terminator below
bufsize *= 2;
char *buf2 = R_alloc(bufsize, sizeof(char));
memcpy(buf2, buf, nbuf);
@@ -54,17 +54,19 @@
buf = buf2;
}
if(c != '\n'){
- buf[++nbuf] = (char) c;
+ buf[nbuf++] = (char) c;
} else {
- buf[++nbuf] = '\0';
+ buf[nbuf++] = '\0';
break;
}
}
+ if (nbuf == 0)
+ return NULL;
/* Make sure it is null-terminated even if file did not end with
* newline.
*/
- if(nbuf >= 0 && buf[nbuf]) buf[++nbuf] = '\0';
- return (nbuf == -1) ? NULL: buf;
+ buf[nbuf-1] = '\0';
+ return buf;
}
That improves readability and reduces the risk of bugs.
Also note that Rconn_getline2() allocates a new buffer for each line in
the DCF file. So we got support for arbitrary long lines (a rare
situation) at the price of a slow down and increased memory usage for
all DCF files. Sounds less than optimal :-/
Cheers,
H.
On 09/21/2015 11:01 AM, Duncan Murdoch wrote:> On 21/09/2015 1:49 PM, Vinh Nguyen wrote:
>> Here's an update:
>>
>> I checked the ChangeLog for R, and it seems like readDCF was changed
>> in 3.0.2. I went on a whim and copied src/main/dcf.c from R 2.15.3
>> over to 3.2.2, and R compiled fine and install.packages now work for
>> me.
>>
>> This is probably not ideal, but it at least makes R usable on AIX for
>> me. Would definitely like to help figure out what's wrong with the
>> new dcf.c on AIX.
>
> I don't know if anyone on the core team has access to AIX, so
you're
> likely on your own for this.
>
> I'd suggest running R in a debugger (gdb or whatever you have), and
> identifying exactly which line in dcf.c fails, and why. If you tell us
> that, we might be able to spot what is going wrong.
>
> Duncan Murdoch
>
>>
>> Thanks.
>>
>> -- Vinh
>>
>>
>> On Mon, Sep 21, 2015 at 10:01 AM, Vinh Nguyen <vinhdizzo at
gmail.com> wrote:
>>> Hi there,
>>>
>>> I just wanted to follow up on this readDCF issue with
install.packages
>>> on AIX on R 3.*. I'm happy to help try potential solutions or
debug
>>> if anyone could point me in the right direction.
>>>
>>> To re-cap, it appears readDCF is segfault'ing since R 3.* on
AIX.
>>> This was not the case up until R 2.15.3. This makes
install.packages
>>> not usable. Thanks.
>>>
>>> -- Vinh
>>>
>>>
>>> On Tue, Nov 11, 2014 at 10:23 AM, Vinh Nguyen <vinhdizzo at
gmail.com> wrote:
>>>> Dear list (re-posting from r-help as r-devel is probably more
appropriate),
>>>>
>>>> I was able to successfully compile R on our AIX box at work
using the
>>>> GNU compilers following the instructions on the R
Administration
>>>> guide. The output can be seen at here
>>>> (https://gist.github.com/nguyenvinh/504321ea9c89d8919bef) and
yields
>>>> no errors .
>>>>
>>>> However, I get a segfault whenever I try to use the
install.packages
>>>> function to install packages. Using debug, I was able to trace
it to
>>>> the readDCF function:
>>>>
>>>> Browse[2]>
>>>> debug: if (!all) return(.Internal(readDCF(file, fields,
keep.white)))
>>>> Browse[2]>
>>>> debug: return(.Internal(readDCF(file, fields, keep.white)))
>>>> Browse[2]>
>>>>
>>>> *** caught segfault ***
>>>> address 4, cause 'invalid permissions'
>>>>
>>>> Possible actions:
>>>> 1: abort (with core dump, if enabled)
>>>> 2: normal R exit
>>>> 3: exit R without saving workspace
>>>> 4: exit R saving workspace
>>>> Selection:
>>>>
>>>> Was curious if anyone has a clue on why such error exists or
what I
>>>> could do to fix it? I'm able to install packages via R CMD
INSTALL,
>>>> but I would hate to have to manually determine dependencies,
download
>>>> the source for each package, and install them "by
hand" via R CMD
>>>> INSTALL.
>>>>
>>>> I went back and compiled older versions of R to see if this
error
>>>> exists. On R 3.0.3, I get:
>>>>
>>>> debug(available.packages)
>>>> install.packages('ggplot2', dep=TRUE,
repo='http://cran.stat.ucla.edu')
>>>> ...
>>>> Browse[2]>
>>>> debug: z <- res0 <- tryCatch(read.dcf(file = tmpf), error
= identity)
>>>> Browse[2]>
>>>> Error: segfault from C stack overflow
>>>>
>>>> On R 2.15.3, I do not see the error.
>>>>
>>>> Would be great to get this resolved. Thank you for your help.
>>>>
>>>> -- Vinh
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>
--
Herv? Pag?s
Program in Computational Biology
Division of Public Health Sciences
Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N, M1-B514
P.O. Box 19024
Seattle, WA 98109-1024
E-mail: hpages at fredhutch.org
Phone: (206) 667-5791
Fax: (206) 667-1319
Hervé Pagès
2015-Sep-21 21:36 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
On 09/21/2015 01:50 PM, Herv? Pag?s wrote:> Hi, > > Note that one significant change to read.dcf() that happened since R > 3.0.2 is the addition of support for arbitrary long lines (commit > 63281), which never worked: > > dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") > writeLines(dcf, "test.dcf") > nchar(read.dcf("test.dcf")) > # aa > # [1,] 8186 > > The culprit being line 53 in src/main/dcf.c where the author of the > Rconn_getline2() function only copies 'nbuf' chars from 'buf' to 'buf2' > when in fact 'nbuf + 1' chars have been stored in 'buf' so far. > > Quickest fix: > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -50,7 +50,7 @@ > if(nbuf+2 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > - memcpy(buf2, buf, nbuf); > + memcpy(buf2, buf, nbuf + 1); > buf = buf2; > } > if(c != '\n'){ > > However a better fix would be to have 'nbuf' actually contain the nb > of chars that was stored in 'buf' so far (as it name suggests): > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -42,12 +42,12 @@ > /* Use R_alloc as this might get interrupted */ > static char *Rconn_getline2(Rconnection con) > { > - int c, bufsize = MAXELTSIZE, nbuf = -1; > + int c, bufsize = MAXELTSIZE, nbuf = 0; > char *buf; > > buf = R_alloc(bufsize, sizeof(char)); > while((c = Rconn_fgetc(con)) != R_EOF) { > - if(nbuf+2 >= bufsize) { // allow for terminator below > + if(nbuf+1 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > memcpy(buf2, buf, nbuf); > @@ -54,17 +54,19 @@ > buf = buf2; > } > if(c != '\n'){ > - buf[++nbuf] = (char) c; > + buf[nbuf++] = (char) c; > } else { > - buf[++nbuf] = '\0'; > + buf[nbuf++] = '\0'; > break; > } > } > + if (nbuf == 0) > + return NULL; > /* Make sure it is null-terminated even if file did not end with > * newline. > */ > - if(nbuf >= 0 && buf[nbuf]) buf[++nbuf] = '\0'; > - return (nbuf == -1) ? NULL: buf; > + buf[nbuf-1] = '\0';^^^^^^ oops... need to be: buf[nbuf] = '\0'; Cheers, H.> + return buf; > } > > That improves readability and reduces the risk of bugs. > > Also note that Rconn_getline2() allocates a new buffer for each line in > the DCF file. So we got support for arbitrary long lines (a rare > situation) at the price of a slow down and increased memory usage for > all DCF files. Sounds less than optimal :-/ > > Cheers, > H. > > > On 09/21/2015 11:01 AM, Duncan Murdoch wrote: >> On 21/09/2015 1:49 PM, Vinh Nguyen wrote: >>> Here's an update: >>> >>> I checked the ChangeLog for R, and it seems like readDCF was changed >>> in 3.0.2. I went on a whim and copied src/main/dcf.c from R 2.15.3 >>> over to 3.2.2, and R compiled fine and install.packages now work for >>> me. >>> >>> This is probably not ideal, but it at least makes R usable on AIX for >>> me. Would definitely like to help figure out what's wrong with the >>> new dcf.c on AIX. >> >> I don't know if anyone on the core team has access to AIX, so you're >> likely on your own for this. >> >> I'd suggest running R in a debugger (gdb or whatever you have), and >> identifying exactly which line in dcf.c fails, and why. If you tell us >> that, we might be able to spot what is going wrong. >> >> Duncan Murdoch >> >>> >>> Thanks. >>> >>> -- Vinh >>> >>> >>> On Mon, Sep 21, 2015 at 10:01 AM, Vinh Nguyen <vinhdizzo at gmail.com> >>> wrote: >>>> Hi there, >>>> >>>> I just wanted to follow up on this readDCF issue with install.packages >>>> on AIX on R 3.*. I'm happy to help try potential solutions or debug >>>> if anyone could point me in the right direction. >>>> >>>> To re-cap, it appears readDCF is segfault'ing since R 3.* on AIX. >>>> This was not the case up until R 2.15.3. This makes install.packages >>>> not usable. Thanks. >>>> >>>> -- Vinh >>>> >>>> >>>> On Tue, Nov 11, 2014 at 10:23 AM, Vinh Nguyen <vinhdizzo at gmail.com> >>>> wrote: >>>>> Dear list (re-posting from r-help as r-devel is probably more >>>>> appropriate), >>>>> >>>>> I was able to successfully compile R on our AIX box at work using the >>>>> GNU compilers following the instructions on the R Administration >>>>> guide. The output can be seen at here >>>>> (https://gist.github.com/nguyenvinh/504321ea9c89d8919bef) and yields >>>>> no errors . >>>>> >>>>> However, I get a segfault whenever I try to use the install.packages >>>>> function to install packages. Using debug, I was able to trace it to >>>>> the readDCF function: >>>>> >>>>> Browse[2]> >>>>> debug: if (!all) return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> debug: return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> >>>>> *** caught segfault *** >>>>> address 4, cause 'invalid permissions' >>>>> >>>>> Possible actions: >>>>> 1: abort (with core dump, if enabled) >>>>> 2: normal R exit >>>>> 3: exit R without saving workspace >>>>> 4: exit R saving workspace >>>>> Selection: >>>>> >>>>> Was curious if anyone has a clue on why such error exists or what I >>>>> could do to fix it? I'm able to install packages via R CMD INSTALL, >>>>> but I would hate to have to manually determine dependencies, download >>>>> the source for each package, and install them "by hand" via R CMD >>>>> INSTALL. >>>>> >>>>> I went back and compiled older versions of R to see if this error >>>>> exists. On R 3.0.3, I get: >>>>> >>>>> debug(available.packages) >>>>> install.packages('ggplot2', dep=TRUE, >>>>> repo='http://cran.stat.ucla.edu') >>>>> ... >>>>> Browse[2]> >>>>> debug: z <- res0 <- tryCatch(read.dcf(file = tmpf), error = identity) >>>>> Browse[2]> >>>>> Error: segfault from C stack overflow >>>>> >>>>> On R 2.15.3, I do not see the error. >>>>> >>>>> Would be great to get this resolved. Thank you for your help. >>>>> >>>>> -- Vinh >>> >>> ______________________________________________ >>> R-devel at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> >-- Herv? Pag?s Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpages at fredhutch.org Phone: (206) 667-5791 Fax: (206) 667-1319
Duncan Murdoch
2015-Sep-21 21:48 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
On 21/09/2015 4:50 PM, Herv? Pag?s wrote:> Hi, > > Note that one significant change to read.dcf() that happened since R > 3.0.2 is the addition of support for arbitrary long lines (commit > 63281), which never worked: > > dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") > writeLines(dcf, "test.dcf") > nchar(read.dcf("test.dcf")) > # aa > # [1,] 8186 >I don't see that in R 3.2.2 on OSX or 3.2.2 patched on Windows:> nchar(read.dcf("test.dcf"))aa [1,] 10000 Duncan Murdoch> The culprit being line 53 in src/main/dcf.c where the author of the > Rconn_getline2() function only copies 'nbuf' chars from 'buf' to 'buf2' > when in fact 'nbuf + 1' chars have been stored in 'buf' so far. > > Quickest fix: > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -50,7 +50,7 @@ > if(nbuf+2 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > - memcpy(buf2, buf, nbuf); > + memcpy(buf2, buf, nbuf + 1); > buf = buf2; > } > if(c != '\n'){ > > However a better fix would be to have 'nbuf' actually contain the nb > of chars that was stored in 'buf' so far (as it name suggests): > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -42,12 +42,12 @@ > /* Use R_alloc as this might get interrupted */ > static char *Rconn_getline2(Rconnection con) > { > - int c, bufsize = MAXELTSIZE, nbuf = -1; > + int c, bufsize = MAXELTSIZE, nbuf = 0; > char *buf; > > buf = R_alloc(bufsize, sizeof(char)); > while((c = Rconn_fgetc(con)) != R_EOF) { > - if(nbuf+2 >= bufsize) { // allow for terminator below > + if(nbuf+1 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > memcpy(buf2, buf, nbuf); > @@ -54,17 +54,19 @@ > buf = buf2; > } > if(c != '\n'){ > - buf[++nbuf] = (char) c; > + buf[nbuf++] = (char) c; > } else { > - buf[++nbuf] = '\0'; > + buf[nbuf++] = '\0'; > break; > } > } > + if (nbuf == 0) > + return NULL; > /* Make sure it is null-terminated even if file did not end with > * newline. > */ > - if(nbuf >= 0 && buf[nbuf]) buf[++nbuf] = '\0'; > - return (nbuf == -1) ? NULL: buf; > + buf[nbuf-1] = '\0'; > + return buf; > } > > That improves readability and reduces the risk of bugs. > > Also note that Rconn_getline2() allocates a new buffer for each line in > the DCF file. So we got support for arbitrary long lines (a rare > situation) at the price of a slow down and increased memory usage for > all DCF files. Sounds less than optimal :-/ > > Cheers, > H. > > > On 09/21/2015 11:01 AM, Duncan Murdoch wrote: >> On 21/09/2015 1:49 PM, Vinh Nguyen wrote: >>> Here's an update: >>> >>> I checked the ChangeLog for R, and it seems like readDCF was changed >>> in 3.0.2. I went on a whim and copied src/main/dcf.c from R 2.15.3 >>> over to 3.2.2, and R compiled fine and install.packages now work for >>> me. >>> >>> This is probably not ideal, but it at least makes R usable on AIX for >>> me. Would definitely like to help figure out what's wrong with the >>> new dcf.c on AIX. >> >> I don't know if anyone on the core team has access to AIX, so you're >> likely on your own for this. >> >> I'd suggest running R in a debugger (gdb or whatever you have), and >> identifying exactly which line in dcf.c fails, and why. If you tell us >> that, we might be able to spot what is going wrong. >> >> Duncan Murdoch >> >>> >>> Thanks. >>> >>> -- Vinh >>> >>> >>> On Mon, Sep 21, 2015 at 10:01 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>> Hi there, >>>> >>>> I just wanted to follow up on this readDCF issue with install.packages >>>> on AIX on R 3.*. I'm happy to help try potential solutions or debug >>>> if anyone could point me in the right direction. >>>> >>>> To re-cap, it appears readDCF is segfault'ing since R 3.* on AIX. >>>> This was not the case up until R 2.15.3. This makes install.packages >>>> not usable. Thanks. >>>> >>>> -- Vinh >>>> >>>> >>>> On Tue, Nov 11, 2014 at 10:23 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>>> Dear list (re-posting from r-help as r-devel is probably more appropriate), >>>>> >>>>> I was able to successfully compile R on our AIX box at work using the >>>>> GNU compilers following the instructions on the R Administration >>>>> guide. The output can be seen at here >>>>> (https://gist.github.com/nguyenvinh/504321ea9c89d8919bef) and yields >>>>> no errors . >>>>> >>>>> However, I get a segfault whenever I try to use the install.packages >>>>> function to install packages. Using debug, I was able to trace it to >>>>> the readDCF function: >>>>> >>>>> Browse[2]> >>>>> debug: if (!all) return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> debug: return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> >>>>> *** caught segfault *** >>>>> address 4, cause 'invalid permissions' >>>>> >>>>> Possible actions: >>>>> 1: abort (with core dump, if enabled) >>>>> 2: normal R exit >>>>> 3: exit R without saving workspace >>>>> 4: exit R saving workspace >>>>> Selection: >>>>> >>>>> Was curious if anyone has a clue on why such error exists or what I >>>>> could do to fix it? I'm able to install packages via R CMD INSTALL, >>>>> but I would hate to have to manually determine dependencies, download >>>>> the source for each package, and install them "by hand" via R CMD >>>>> INSTALL. >>>>> >>>>> I went back and compiled older versions of R to see if this error >>>>> exists. On R 3.0.3, I get: >>>>> >>>>> debug(available.packages) >>>>> install.packages('ggplot2', dep=TRUE, repo='http://cran.stat.ucla.edu') >>>>> ... >>>>> Browse[2]> >>>>> debug: z <- res0 <- tryCatch(read.dcf(file = tmpf), error = identity) >>>>> Browse[2]> >>>>> Error: segfault from C stack overflow >>>>> >>>>> On R 2.15.3, I do not see the error. >>>>> >>>>> Would be great to get this resolved. Thank you for your help. >>>>> >>>>> -- Vinh >>> >>> ______________________________________________ >>> R-devel at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> >
Hervé Pagès
2015-Sep-21 22:22 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
On 09/21/2015 02:48 PM, Duncan Murdoch wrote:> On 21/09/2015 4:50 PM, Herv? Pag?s wrote: >> Hi,at >> >> Note that one significant change to read.dcf() that happened since R >> 3.0.2 is the addition of support for arbitrary long lines (commit >> 63281), which never worked: >> >> dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") >> writeLines(dcf, "test.dcf") >> nchar(read.dcf("test.dcf")) >> # aa >> # [1,] 8186 >> > > I don't see that in R 3.2.2 on OSX or 3.2.2 patched on Windows: > >> nchar(read.dcf("test.dcf")) > aa > [1,] 10000You're just being lucky that 'buf2[nbuf + 1]' is not '\0' after allocation by R_alloc(). Try this: val <- paste(rep(letters, length.out=10000), collapse="") writeLines(paste("aa:", val), "test.dcf") identical(val, read.dcf("test.dcf")[1]) Maybe you won't be so lucky with this one. H.> > Duncan Murdoch > >> The culprit being line 53 in src/main/dcf.c where the author of the >> Rconn_getline2() function only copies 'nbuf' chars from 'buf' to 'buf2' >> when in fact 'nbuf + 1' chars have been stored in 'buf' so far. >> >> Quickest fix: >> >> Index: src/main/dcf.c >> ==================================================================>> --- src/main/dcf.c (revision 69404) >> +++ src/main/dcf.c (working copy) >> @@ -50,7 +50,7 @@ >> if(nbuf+2 >= bufsize) { // allow for terminator below >> bufsize *= 2; >> char *buf2 = R_alloc(bufsize, sizeof(char)); >> - memcpy(buf2, buf, nbuf); >> + memcpy(buf2, buf, nbuf + 1); >> buf = buf2; >> } >> if(c != '\n'){ >> >> However a better fix would be to have 'nbuf' actually contain the nb >> of chars that was stored in 'buf' so far (as it name suggests): >> >> Index: src/main/dcf.c >> ==================================================================>> --- src/main/dcf.c (revision 69404) >> +++ src/main/dcf.c (working copy) >> @@ -42,12 +42,12 @@ >> /* Use R_alloc as this might get interrupted */ >> static char *Rconn_getline2(Rconnection con) >> { >> - int c, bufsize = MAXELTSIZE, nbuf = -1; >> + int c, bufsize = MAXELTSIZE, nbuf = 0; >> char *buf; >> >> buf = R_alloc(bufsize, sizeof(char)); >> while((c = Rconn_fgetc(con)) != R_EOF) { >> - if(nbuf+2 >= bufsize) { // allow for terminator below >> + if(nbuf+1 >= bufsize) { // allow for terminator below >> bufsize *= 2; >> char *buf2 = R_alloc(bufsize, sizeof(char)); >> memcpy(buf2, buf, nbuf); >> @@ -54,17 +54,19 @@ >> buf = buf2; >> } >> if(c != '\n'){ >> - buf[++nbuf] = (char) c; >> + buf[nbuf++] = (char) c; >> } else { >> - buf[++nbuf] = '\0'; >> + buf[nbuf++] = '\0'; >> break; >> } >> } >> + if (nbuf == 0) >> + return NULL; >> /* Make sure it is null-terminated even if file did not end with >> * newline. >> */ >> - if(nbuf >= 0 && buf[nbuf]) buf[++nbuf] = '\0'; >> - return (nbuf == -1) ? NULL: buf; >> + buf[nbuf-1] = '\0'; >> + return buf; >> } >> >> That improves readability and reduces the risk of bugs. >> >> Also note that Rconn_getline2() allocates a new buffer for each line in >> the DCF file. So we got support for arbitrary long lines (a rare >> situation) at the price of a slow down and increased memory usage for >> all DCF files. Sounds less than optimal :-/ >> >> Cheers, >> H. >> >> >> On 09/21/2015 11:01 AM, Duncan Murdoch wrote: >>> On 21/09/2015 1:49 PM, Vinh Nguyen wrote: >>>> Here's an update: >>>> >>>> I checked the ChangeLog for R, and it seems like readDCF was changed >>>> in 3.0.2. I went on a whim and copied src/main/dcf.c from R 2.15.3 >>>> over to 3.2.2, and R compiled fine and install.packages now work for >>>> me. >>>> >>>> This is probably not ideal, but it at least makes R usable on AIX for >>>> me. Would definitely like to help figure out what's wrong with the >>>> new dcf.c on AIX. >>> >>> I don't know if anyone on the core team has access to AIX, so you're >>> likely on your own for this. >>> >>> I'd suggest running R in a debugger (gdb or whatever you have), and >>> identifying exactly which line in dcf.c fails, and why. If you tell us >>> that, we might be able to spot what is going wrong. >>> >>> Duncan Murdoch >>> >>>> >>>> Thanks. >>>> >>>> -- Vinh >>>> >>>> >>>> On Mon, Sep 21, 2015 at 10:01 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>>> Hi there, >>>>> >>>>> I just wanted to follow up on this readDCF issue with install.packages >>>>> on AIX on R 3.*. I'm happy to help try potential solutions or debug >>>>> if anyone could point me in the right direction. >>>>> >>>>> To re-cap, it appears readDCF is segfault'ing since R 3.* on AIX. >>>>> This was not the case up until R 2.15.3. This makes install.packages >>>>> not usable. Thanks. >>>>> >>>>> -- Vinh >>>>> >>>>> >>>>> On Tue, Nov 11, 2014 at 10:23 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>>>> Dear list (re-posting from r-help as r-devel is probably more appropriate), >>>>>> >>>>>> I was able to successfully compile R on our AIX box at work using the >>>>>> GNU compilers following the instructions on the R Administration >>>>>> guide. The output can be seen at here >>>>>> (https://gist.github.com/nguyenvinh/504321ea9c89d8919bef) and yields >>>>>> no errors . >>>>>> >>>>>> However, I get a segfault whenever I try to use the install.packages >>>>>> function to install packages. Using debug, I was able to trace it to >>>>>> the readDCF function: >>>>>> >>>>>> Browse[2]> >>>>>> debug: if (!all) return(.Internal(readDCF(file, fields, keep.white))) >>>>>> Browse[2]> >>>>>> debug: return(.Internal(readDCF(file, fields, keep.white))) >>>>>> Browse[2]> >>>>>> >>>>>> *** caught segfault *** >>>>>> address 4, cause 'invalid permissions' >>>>>> >>>>>> Possible actions: >>>>>> 1: abort (with core dump, if enabled) >>>>>> 2: normal R exit >>>>>> 3: exit R without saving workspace >>>>>> 4: exit R saving workspace >>>>>> Selection: >>>>>> >>>>>> Was curious if anyone has a clue on why such error exists or what I >>>>>> could do to fix it? I'm able to install packages via R CMD INSTALL, >>>>>> but I would hate to have to manually determine dependencies, download >>>>>> the source for each package, and install them "by hand" via R CMD >>>>>> INSTALL. >>>>>> >>>>>> I went back and compiled older versions of R to see if this error >>>>>> exists. On R 3.0.3, I get: >>>>>> >>>>>> debug(available.packages) >>>>>> install.packages('ggplot2', dep=TRUE, repo='http://cran.stat.ucla.edu') >>>>>> ... >>>>>> Browse[2]> >>>>>> debug: z <- res0 <- tryCatch(read.dcf(file = tmpf), error = identity) >>>>>> Browse[2]> >>>>>> Error: segfault from C stack overflow >>>>>> >>>>>> On R 2.15.3, I do not see the error. >>>>>> >>>>>> Would be great to get this resolved. Thank you for your help. >>>>>> >>>>>> -- Vinh >>>> >>>> ______________________________________________ >>>> R-devel at r-project.org mailing list >>>> https://stat.ethz.ch/mailman/listinfo/r-devel >>>> >>> >>> ______________________________________________ >>> R-devel at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >-- Herv? Pag?s Program in Computational Biology Division of Public Health Sciences Fred Hutchinson Cancer Research Center 1100 Fairview Ave. N, M1-B514 P.O. Box 19024 Seattle, WA 98109-1024 E-mail: hpages at fredhutch.org Phone: (206) 667-5791 Fax: (206) 667-1319
Vinh Nguyen
2015-Sep-22 02:20 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
On Mon, Sep 21, 2015 at 2:48 PM, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:> On 21/09/2015 4:50 PM, Herv? Pag?s wrote: >> Hi, >> >> Note that one significant change to read.dcf() that happened since R >> 3.0.2 is the addition of support for arbitrary long lines (commit >> 63281), which never worked: >> >> dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") >> writeLines(dcf, "test.dcf") >> nchar(read.dcf("test.dcf")) >> # aa >> # [1,] 8186 >> > > I don't see that in R 3.2.2 on OSX or 3.2.2 patched on Windows: > >> nchar(read.dcf("test.dcf")) > aa > [1,] 10000I'm at home now and getting the following from Revolution R Open 3.2.2 on a Mac:> dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") > writeLines(dcf, "test.dcf") > nchar(read.dcf("test.dcf"))aa [1,] 8186 Here's what I see in the file: $ wc -c test.dcf 10005 test.dcf Same results using Revolution R Open on Windows. Also same results on regular R 3.2.0 on Windows. -- Vinh
Duncan Murdoch
2015-Sep-22 11:00 UTC
[Rd] segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
On 21/09/2015 4:50 PM, Herv? Pag?s wrote:> Hi, > > Note that one significant change to read.dcf() that happened since R > 3.0.2 is the addition of support for arbitrary long lines (commit > 63281), which never worked: > > dcf <- paste(c("aa: ", rep(letters, length.out=10000)), collapse="") > writeLines(dcf, "test.dcf") > nchar(read.dcf("test.dcf")) > # aa > # [1,] 8186 > > The culprit being line 53 in src/main/dcf.c where the author of the > Rconn_getline2() function only copies 'nbuf' chars from 'buf' to 'buf2' > when in fact 'nbuf + 1' chars have been stored in 'buf' so far. > > Quickest fix: > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -50,7 +50,7 @@ > if(nbuf+2 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > - memcpy(buf2, buf, nbuf); > + memcpy(buf2, buf, nbuf + 1); > buf = buf2; > } > if(c != '\n'){ > > However a better fix would be to have 'nbuf' actually contain the nb > of chars that was stored in 'buf' so far (as it name suggests): > > Index: src/main/dcf.c > ==================================================================> --- src/main/dcf.c (revision 69404) > +++ src/main/dcf.c (working copy) > @@ -42,12 +42,12 @@ > /* Use R_alloc as this might get interrupted */ > static char *Rconn_getline2(Rconnection con) > { > - int c, bufsize = MAXELTSIZE, nbuf = -1; > + int c, bufsize = MAXELTSIZE, nbuf = 0; > char *buf; > > buf = R_alloc(bufsize, sizeof(char)); > while((c = Rconn_fgetc(con)) != R_EOF) { > - if(nbuf+2 >= bufsize) { // allow for terminator below > + if(nbuf+1 >= bufsize) { // allow for terminator below > bufsize *= 2; > char *buf2 = R_alloc(bufsize, sizeof(char)); > memcpy(buf2, buf, nbuf); > @@ -54,17 +54,19 @@ > buf = buf2; > } > if(c != '\n'){ > - buf[++nbuf] = (char) c; > + buf[nbuf++] = (char) c; > } else { > - buf[++nbuf] = '\0'; > + buf[nbuf++] = '\0'; > break; > } > } > + if (nbuf == 0) > + return NULL; > /* Make sure it is null-terminated even if file did not end with > * newline. > */ > - if(nbuf >= 0 && buf[nbuf]) buf[++nbuf] = '\0'; > - return (nbuf == -1) ? NULL: buf; > + buf[nbuf-1] = '\0'; > + return buf; > } > > That improves readability and reduces the risk of bugs. > > Also note that Rconn_getline2() allocates a new buffer for each line in > the DCF file. So we got support for arbitrary long lines (a rare > situation) at the price of a slow down and increased memory usage for > all DCF files. Sounds less than optimal :-/I'll put in your patch plus a partial fix for the efficiency issue. (It will allocate the first buffer on the stack.) Should show up in R-devel and R-patched in due course. Duncan Murdoch> > Cheers, > H. > > > On 09/21/2015 11:01 AM, Duncan Murdoch wrote: >> On 21/09/2015 1:49 PM, Vinh Nguyen wrote: >>> Here's an update: >>> >>> I checked the ChangeLog for R, and it seems like readDCF was changed >>> in 3.0.2. I went on a whim and copied src/main/dcf.c from R 2.15.3 >>> over to 3.2.2, and R compiled fine and install.packages now work for >>> me. >>> >>> This is probably not ideal, but it at least makes R usable on AIX for >>> me. Would definitely like to help figure out what's wrong with the >>> new dcf.c on AIX. >> >> I don't know if anyone on the core team has access to AIX, so you're >> likely on your own for this. >> >> I'd suggest running R in a debugger (gdb or whatever you have), and >> identifying exactly which line in dcf.c fails, and why. If you tell us >> that, we might be able to spot what is going wrong. >> >> Duncan Murdoch >> >>> >>> Thanks. >>> >>> -- Vinh >>> >>> >>> On Mon, Sep 21, 2015 at 10:01 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>> Hi there, >>>> >>>> I just wanted to follow up on this readDCF issue with install.packages >>>> on AIX on R 3.*. I'm happy to help try potential solutions or debug >>>> if anyone could point me in the right direction. >>>> >>>> To re-cap, it appears readDCF is segfault'ing since R 3.* on AIX. >>>> This was not the case up until R 2.15.3. This makes install.packages >>>> not usable. Thanks. >>>> >>>> -- Vinh >>>> >>>> >>>> On Tue, Nov 11, 2014 at 10:23 AM, Vinh Nguyen <vinhdizzo at gmail.com> wrote: >>>>> Dear list (re-posting from r-help as r-devel is probably more appropriate), >>>>> >>>>> I was able to successfully compile R on our AIX box at work using the >>>>> GNU compilers following the instructions on the R Administration >>>>> guide. The output can be seen at here >>>>> (https://gist.github.com/nguyenvinh/504321ea9c89d8919bef) and yields >>>>> no errors . >>>>> >>>>> However, I get a segfault whenever I try to use the install.packages >>>>> function to install packages. Using debug, I was able to trace it to >>>>> the readDCF function: >>>>> >>>>> Browse[2]> >>>>> debug: if (!all) return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> debug: return(.Internal(readDCF(file, fields, keep.white))) >>>>> Browse[2]> >>>>> >>>>> *** caught segfault *** >>>>> address 4, cause 'invalid permissions' >>>>> >>>>> Possible actions: >>>>> 1: abort (with core dump, if enabled) >>>>> 2: normal R exit >>>>> 3: exit R without saving workspace >>>>> 4: exit R saving workspace >>>>> Selection: >>>>> >>>>> Was curious if anyone has a clue on why such error exists or what I >>>>> could do to fix it? I'm able to install packages via R CMD INSTALL, >>>>> but I would hate to have to manually determine dependencies, download >>>>> the source for each package, and install them "by hand" via R CMD >>>>> INSTALL. >>>>> >>>>> I went back and compiled older versions of R to see if this error >>>>> exists. On R 3.0.3, I get: >>>>> >>>>> debug(available.packages) >>>>> install.packages('ggplot2', dep=TRUE, repo='http://cran.stat.ucla.edu') >>>>> ... >>>>> Browse[2]> >>>>> debug: z <- res0 <- tryCatch(read.dcf(file = tmpf), error = identity) >>>>> Browse[2]> >>>>> Error: segfault from C stack overflow >>>>> >>>>> On R 2.15.3, I do not see the error. >>>>> >>>>> Would be great to get this resolved. Thank you for your help. >>>>> >>>>> -- Vinh >>> >>> ______________________________________________ >>> R-devel at r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> >
Maybe Matching Threads
- segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
- segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
- segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
- segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages
- segfault with readDCF on R 3.1.2 on AIX 6.1 when using install.packages