Skip to content

Bug in R 2.7 for over long lines (crasher+proposed fix!) (PR#11281)

2 messages · bugreports at nn7.de, Peter Dalgaard

#
OK, I am just sending it here too as it looks like r-devel at r-project.org
is not the right place:
=EF=BB=BFOn Fri, 2008-04-25 at 08:48 +0200, Soeren Sonnenburg wrote:
d"), xxlineno);
might
Looking at the code again there seems to be another bug above this for
the MAXLINESIZE test too:

        if (*p =3D=3D '\n' || p =3D=3D end - 1) {
            nc =3D p - p0;
            if (*p !=3D '\n')
            nc++;
            if (nc <=3D MAXLINESIZE) {
            strncpy((char *)SourceLine, (char *)p0, nc);
bug2 -->    SourceLine[nc] =3D '\0';
            SET_STRING_ELT(source, lines++,
                       mkChar2((char *)SourceLine));
            } else { /* over-long line */
            char *LongLine =3D (char *) malloc(nc+1);
            if(!LongLine)
                error(_("unable to allocate space for source line %d"),
xxlineno);
bug1 -->    strncpy(LongLine, (char *)p0, nc);
            LongLine[nc] =3D '\0';
            SET_STRING_ELT(source, lines++,
                       mkChar2((char *)LongLine));
            free(LongLine);
            }
            p0 =3D p + 1;
        }


So I guess the test would be for nc < MAXLINESIZE above or to change
SourceLine to have MAXLINESIZE+1 size.

Alternatively as the strncpy manpage suggests do this for all
occurrences of strncpy

           strncpy(buf, str, n);
           if (n > 0)
               buf[n - 1]=3D =E2=80=99\0=E2=80=99;

this could even be made a makro / helper function ...

And another update: This does fix the R+swig crasher for me (tested)!

Soeren
#
bugreports at nn7.de wrote:
I think it was seen there too, just that noone got around to reply. In 
R-bugs, there's a filing system so that it won't be completely forgotten...

However, your mail seems to have gotten encoded in quoted-printable, you 
might want to follow up with a cleaned version. (Just keep the  
(PR#11281) in the header).