Hello all,

I have noticed something that is creating problems in my modified GCC,
and I see it as a bug, maybe I don't do something right. If you take a
look at cpp_interpret_string() function in charset.c you will see the
following part:

for (;;)
        {
          base = p;
          while (p < limit && *p != '\\')
            p++;
          if (p > base)
            {
              /* We have a run of normal characters; these can be fed
                 directly to convert_cset.  */
              if (!APPLY_CONVERSION (cvt, base, p - base, &tbuf))
                goto fail;
            }
          if (p == limit)
            break;

          p = convert_escape (pfile, p + 1, limit, &tbuf, wide);
        }

and if you have a string that ends with "\\n", what will happen is the
following:

When p points to that last "\\", right before 'n' it p will be bigger
than base and smaller than limit for 1 (because p will be pointing to
"\\". p=convert_escape() will be called next with p+1 as one of the
arguments, which is OK, but convert_escape returns position for 1
increased, which means that after convert_escape() call, p will be
actually increased for two and there for be bigger than limit. But
there is no check for p bigger than limit, only p equals limit,
therefore loop will constantly call convert_escape. Therefore, I think
it would be better to have "p>=limit" instead of "p==limit". After
all, it does make no difference if we are checking that p is bigger
limit additionally to original condition. I hope I've contributed and
if not, I apologize for inconvenience.

Best regards,
              Nikola

Reply via email to