Commit 35e3bc75 authored by Simon Montagu's avatar Simon Montagu
Browse files

Improve the tests for end of output block. Bug 718573, r=emk

parent a7b8b87b
Loading
Loading
Loading
Loading
+30 −34
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(ESC == *src) {
           mState = eState_ESC;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -117,7 +117,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if('$' == *src) {
           mState = eState_ESC_24;
        } else {
           if(dest+2 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 2))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -134,7 +134,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('+' == *src) {
           mState = eState_ESC_24_2B;
        } else {
           if(dest+3 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 3))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -150,7 +150,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('G' == *src) {
           mState = eState_ESC_24_29_G;
        } else {
           if(dest+4 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 4))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -166,7 +166,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
           mState = eState_GB2312_1980;
           mRunLength = 0;
        } else {
           if(dest+5 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 5))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -182,7 +182,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(SI == *src) { // Shift-In (SI)
           mState = eState_ESC_24_29_A_SO_SI;
           if (mRunLength == 0) {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = 0xFFFD;
           }
@@ -194,7 +194,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
              mData = *src;
              mState = eState_GB2312_1980_2ndbyte;
           } else {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
           }
@@ -220,7 +220,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen

           dest += aLen;
        } else {
           if(dest+2 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 2))
              goto error1;
           *dest++ = (PRUnichar) mData;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -235,7 +235,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if(ESC == *src) {
           mState = eState_ESC;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -248,7 +248,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
           mState = eState_CNS11643_1;
           mRunLength = 0;
        } else {
           if(dest+5 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 5))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -264,7 +264,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(SI == *src) { // Shift-In (SI)
           mState = eState_ESC_24_29_G_SO_SI;
           if (mRunLength == 0) {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = 0xFFFD;
           }
@@ -276,7 +276,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
              mData = *src;
              mState = eState_CNS11643_1_2ndbyte;
           } else {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
           }
@@ -302,7 +302,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen

           dest += aLen;
        } else {
           if(dest+2 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 2))
              goto error1;
           *dest++ = (PRUnichar) mData;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -317,7 +317,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if(ESC == *src) {
           mState = eState_ESC;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -329,7 +329,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if('H' == *src) {
           mState = eState_ESC_24_2A_H;
        } else {
           if(dest+4 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 4))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -344,7 +344,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(ESC == *src) {
           mState = eState_ESC_24_2A_H_ESC;
        } else {
           if(dest+5 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 5))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -363,7 +363,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('$' == *src) {
           mState = eState_ESC_24;
        } else {
           if(dest+6 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 6))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -380,7 +380,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(SI == *src) { // Shift-In (SI)
           mState = eState_ESC_24_2A_H_ESC_SS2_SI;
           if (mRunLength == 0) {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = 0xFFFD;
           }
@@ -392,7 +392,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
              mData = *src;
              mState = eState_CNS11643_2_2ndbyte;
           } else {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
           }
@@ -420,7 +420,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen

           dest += aLen;
        } else {
           if(dest+2 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 2))
              goto error1;
           *dest++ = (PRUnichar) mData;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -432,7 +432,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(ESC == *src) {
           mState = eState_ESC_24_2A_H_ESC_SS2_SI_ESC;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -447,7 +447,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('$' == *src) {
           mState = eState_ESC_24;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -460,7 +460,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
            mState = eState_ESC_24_2B_I;
            mPlaneID = *src - 'I' + 3;
        } else {
           if(dest+4 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 4))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -475,7 +475,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(ESC == *src) {
           mState = eState_ESC_24_2B_I_ESC;
        } else {
           if(dest+5 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 5))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -494,7 +494,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('$' == *src) {
           mState = eState_ESC_24;
        } else {
           if(dest+6 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 6))
              goto error1;
           *dest++ = (PRUnichar) ESC;
           *dest++ = (PRUnichar) '$';
@@ -511,7 +511,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(SI == *src) { // Shift-In (SI)
           mState = eState_ESC_24_2B_I_ESC_SS3_SI;
           if (mRunLength == 0) {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = 0xFFFD;
           }
@@ -523,7 +523,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
              mData = *src;
              mState = eState_CNS11643_3_2ndbyte;
           } else {
              if(dest+1 >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                 goto error1;
              *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
           }
@@ -552,7 +552,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen

           dest += aLen;
        } else {
           if(dest+2 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 2))
              goto error1;
           *dest++ = (PRUnichar) mData;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -564,7 +564,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        if(ESC == *src) {
           mState = eState_ESC_24_2B_I_ESC_SS3_SI_ESC;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -579,7 +579,7 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } else if('$' == *src) {
           mState = eState_ESC_24;
        } else {
           if(dest+1 >= destEnd)
           if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
           *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;

@@ -600,10 +600,6 @@ NS_IMETHODIMP nsISO2022CNToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen

error1:
  *aDestLen = dest-aDest;
  src++;
  if ((mState == eState_ASCII) && (src == srcEnd)) {
    return NS_OK;
  }
  *aSrcLen = src - (const unsigned char*)aSrc;
  return NS_OK_UDEC_MOREOUTPUT;

+34 −36
Original line number Diff line number Diff line
@@ -505,9 +505,9 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else if(*src & 0x80) {
              goto error2;
            } else {
              *dest++ = (PRUnichar) *src;
              if(dest >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 1))
                goto error1;
              *dest++ = (PRUnichar) *src;
            }
          break;
          
@@ -521,7 +521,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else if ('N' == *src)  { // for ISO-2022-JP-2
              mState = mState_ESC_4e;
            } else  {
              if((dest+2) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 2))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              if(0x80 & *src)
@@ -535,7 +535,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            if( 'B' == *src) {
              mState = mState_ASCII;
              if (mRunLength == 0) {
                if((dest+1) >= destEnd)
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                *dest++ = 0xFFFD;
              }
@@ -543,7 +543,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else if ('J' == *src)  {
              mState = mState_JISX0201_1976Roman;
              if (mRunLength == 0 && mLastLegalState != mState_ASCII) {
                if((dest+1) >= destEnd)
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                if (mErrBehavior == kOnError_Signal)
                  goto error2;
@@ -554,7 +554,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              mState = mState_JISX0201_1976Kana;
              mRunLength = 0;
            } else  {
              if((dest+3) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 3))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              *dest++ = (PRUnichar) '(';
@@ -578,7 +578,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else if ('(' == *src)  {
              mState = mState_ESC_24_28;
            } else  {
              if((dest+3) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 3))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              *dest++ = (PRUnichar) '$';
@@ -597,7 +597,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              mState = mState_JISX0212_1990;
              mRunLength = 0;
            } else  {
              if((dest+4) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 4))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              *dest++ = (PRUnichar) '$';
@@ -619,10 +619,10 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              // XXX We need to  decide how to handle \ and ~ here
              // we may need a if statement here for '\' and '~' 
              // to map them to Yen and Overbar
              if (CHECK_OVERRUN(dest, destEnd, 1))
                goto error1;
              *dest++ = (PRUnichar) *src;
              ++mRunLength;
              if(dest >= destEnd)
                goto error1;
            }
          break;

@@ -632,13 +632,13 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              mState = mState_ESC;
            } else {
              if((0x21 <= *src) && (*src <= 0x5F)) {
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                *dest++ = (0xFF61-0x0021) + *src;
                ++mRunLength;
              } else {
                goto error2;
              }
              if(dest >= destEnd)
                goto error1;
            }
          break;

@@ -725,12 +725,12 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else {
               // XXX We need to map from JIS X 0208 1983 to 1987 
               // in the next line before pass to *dest++
              if (CHECK_OVERRUN(dest, destEnd, 1))
                goto error1;
              *dest++ = gJapaneseMap[mData+off];
              ++mRunLength;
            }
            mState = mState_JISX0208_1978;
            if(dest >= destEnd)
              goto error1;
          }
          break;

@@ -752,6 +752,8 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              if (!mGB2312Decoder) {// failed creating a delegate converter
                goto error2;
              } else {
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                unsigned char gb[2];
                PRUnichar uni;
                PRInt32 gbLen = 2, uniLen = 1;
@@ -768,8 +770,6 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              }
            }
            mState = mState_GB2312_1980;
            if(dest >= destEnd)
              goto error1;
          }
          break;

@@ -779,12 +779,12 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            if(0xFF == off) {
               goto error2;
            } else {
              if (CHECK_OVERRUN(dest, destEnd, 1))
                goto error1;
              *dest++ = gJapaneseMap[mData+off];
              ++mRunLength;
            }
            mState = mState_JISX0208_1983;
            if(dest >= destEnd)
              goto error1;
          }
          break;

@@ -806,6 +806,8 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              if (!mEUCKRDecoder) {// failed creating a delegate converter
                goto error2;
              } else {              
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                unsigned char ksc[2];
                PRUnichar uni;
                PRInt32 kscLen = 2, uniLen = 1;
@@ -822,8 +824,6 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              }
            }
            mState = mState_KSC5601_1987;
            if(dest >= destEnd)
              goto error1;
          }
          break;

@@ -833,12 +833,12 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            if(0xFF == off) {
               goto error2;
            } else {
              if (CHECK_OVERRUN(dest, destEnd, 1))
                goto error1;
              *dest++ = gJapaneseMap[mData+off];
              ++mRunLength;
            }
            mState = mState_JISX0212_1990;
            if(dest >= destEnd)
              goto error1;
          }
          break;

@@ -850,7 +850,7 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            } else if ('F' == *src) {
              G2charset = G2_ISO88597;
            } else  {
              if((dest+3) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 3))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              *dest++ = (PRUnichar) '.';
@@ -867,6 +867,8 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
            mState = mLastLegalState;
            if((0x20 <= *src) && (*src <= 0x7F)) {
              if (G2_ISO88591 == G2charset) {
                if (CHECK_OVERRUN(dest, destEnd, 1))
                  goto error1;
                *dest++ = *src | 0x80;
                ++mRunLength;
              } else if (G2_ISO88597 == G2charset) {
@@ -882,6 +884,8 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
                if (!mISO88597Decoder) {// failed creating a delegate converter
                  goto error2;
                } else {
                  if (CHECK_OVERRUN(dest, destEnd, 1))
                    goto error1;
                  // Put one character with ISO-8859-7 encoding.
                  unsigned char gr = *src | 0x80;
                  PRUnichar uni;
@@ -895,10 +899,8 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
              } else {// G2charset is G2_unknown (not designated yet)
                goto error2;
              }
              if(dest >= destEnd)
                goto error1;
            } else {
              if((dest+3) >= destEnd)
              if (CHECK_OVERRUN(dest, destEnd, 3))
                goto error1;
              *dest++ = (PRUnichar) 0x1b;
              *dest++ = (PRUnichar) 'N';
@@ -921,10 +923,6 @@ NS_IMETHODIMP nsISO2022JPToUnicodeV2::Convert(
   return NS_OK;
error1:
   *aDestLen = dest - aDest;
   src++;
   if ((mState == 0) && (src == srcEnd)) {
     return NS_OK;
   }
   *aSrcLen = src - (const unsigned char*)aSrc;
   return NS_OK_UDEC_MOREOUTPUT;
error2:
+18 −18
Original line number Diff line number Diff line
@@ -71,14 +71,14 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
          mRunLength = 0;
        } 
        else if(*src & 0x80) {
          *dest++ = 0xFFFD;
          if(dest >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 1))
            goto error1;
          *dest++ = 0xFFFD;
        } 
        else {
          *dest++ = (PRUnichar) *src;
          if(dest >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 1))
            goto error1;
          *dest++ = (PRUnichar) *src;
        }
        break;
          
@@ -87,7 +87,7 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
          mState = mState_ESC_24;
        } 
        else  {
          if((dest+2) >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 2))
            goto error1;
          *dest++ = (PRUnichar) 0x1b;
          *dest++ = (0x80 & *src) ? 0xFFFD : (PRUnichar) *src;
@@ -100,7 +100,7 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
          mState = mState_ESC_24_29;
        } 
        else  {
          if((dest+3) >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 3))
            goto error1;
          *dest++ = (PRUnichar) 0x1b;
          *dest++ = (PRUnichar) '$';
@@ -116,7 +116,7 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
          mRunLength = 0;
        } 
        else  {
          if((dest+4) >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 4))
            goto error1;
          *dest++ = (PRUnichar) 0x1b;
          *dest++ = (PRUnichar) '$';
@@ -134,7 +134,7 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        else if (0x0f == *src) { // Shift-In (SI)
          mState = mState_ASCII;
          if (mRunLength == 0) {
            if(dest+1 >= destEnd)
            if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
            *dest++ = 0xFFFD;
          }
@@ -142,16 +142,16 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
        } 
        else if ((PRUint8) *src == 0x20 || (PRUint8) *src == 0x09) {
          // Allow space and tab between SO and SI (i.e. in Hangul segment)
          if (CHECK_OVERRUN(dest, destEnd, 1))
            goto error1;
          mState = mState_KSX1001_1992;
          *dest++ = (PRUnichar) *src;
          ++mRunLength;
          if(dest >= destEnd)
          goto error1;
        } 
        else {         // Everything else is invalid.
          *dest++ = 0xFFFD;
          if(dest >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 1))
            goto error1;
          *dest++ = 0xFFFD;
        }
        break;

@@ -171,6 +171,8 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
           *dest++ = 0xFFFD;
          } 
          else {              
            if (CHECK_OVERRUN(dest, destEnd, 1))
              goto error1;
            unsigned char ksx[2];
            PRUnichar uni;
            PRInt32 ksxLen = 2, uniLen = 1;
@@ -184,8 +186,6 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
            *dest++ = uni;
            ++mRunLength;
          }
          if(dest >= destEnd)
            goto error1;
          mState = mState_KSX1001_1992;
        } 
        else {        // Invalid 
@@ -195,17 +195,17 @@ NS_IMETHODIMP nsISO2022KRToUnicode::Convert(const char * aSrc, PRInt32 * aSrcLen
          else {
            mState = mState_KSX1001_1992;
          }
          *dest++ = 0xFFFD;
          if(dest >= destEnd)
          if (CHECK_OVERRUN(dest, destEnd, 1))
            goto error1;
          *dest++ = 0xFFFD;
        }
        break;

      case mState_ERROR:
        mState = mLastLegalState;
        *dest++ = 0xFFFD;
        if(dest >= destEnd)
        if (CHECK_OVERRUN(dest, destEnd, 1))
          goto error1;
        *dest++ = 0xFFFD;
        break;

    } // switch
+7 −0
Original line number Diff line number Diff line
@@ -46,6 +46,13 @@

#define ONE_BYTE_TABLE_SIZE 256

inline bool WillOverrun(PRUnichar* aDest, PRUnichar* aDestEnd, PRUint32 aLength)
{
  NS_ASSERTION(aDest <= aDestEnd, "Pointer overrun even before check");
  return ((aDestEnd - aDest) < aLength);
}
#define CHECK_OVERRUN(dest, destEnd, length) (WillOverrun(dest, destEnd, length))

#ifdef NS_DEBUG
// {7AFC9F0A-CFE1-44ea-A755-E3B86AB1226E}
#define NS_IBASICDECODER_IID \