#15630: patch for imap_utf7_encode() and imap_utf7_decode()

From: Date: Wed, 07 Aug 2002 20:25:44 +0000
Subject: #15630: patch for imap_utf7_encode() and imap_utf7_decode()
Groups: php.dev 
Request: Send a blank email to php-dev+get-86612@lists.php.net to get a copy of this message
--- php_imap.c  5 Aug 2002 21:53:09 -0000       1.134
+++ php_imap.c 7 Aug 2002 20:21:05 -0000 @@ -2077,14 +2077,14 @@
                                php_error(E_WARNING, "%s(): Invalid modified UTF-7 character: `%c'", get_active_function_name(TSRMLS_C), *inp);
                                RETURN_FALSE;
                        } else if (*inp != '&') {
-                               outlen++;
+                               outlen += 2;
                        } else if (inp + 1 == endp) {
                                php_error(E_WARNING, "%s(): Unexpected end of string", get_active_function_name(TSRMLS_C));
                                RETURN_FALSE;
                        } else if (inp[1] != '-') {
                                state = ST_DECODE0;
                        } else {
-                               outlen++;
+                               outlen += 2;
                                inp++;
                        }
                } else if (*inp == '-') {
@@ -2134,8 +2134,11 @@
                        if (*inp == '&' && inp[1] != '-') {
                                state = ST_DECODE0;
                        }
-                       else if ((*outp++ = *inp) == '&') {
-                               inp++;
+                       else {
+                               *outp++ = 0x00;
+                               if ((*outp++ = *inp) == '&') {
+                                       inp++;
+                               }
                        }
                }
                else if (*inp == '-') {
@@ -2213,15 +2216,21 @@
        endp = (inp = in) + inlen;
        while (inp < endp) {
                if (state == ST_NORMAL) {
-                       if (SPECIAL(*inp)) {
+                       if (*inp == 0x00 && *(inp+1) < 0x80) {
+                               /* ASCII character */
+                               if (*(inp+1) == '&')
+                                       outlen++;       // for '-'
+                               inp += 2;
+                       } else {
+                               /* begin encoding */
                                state = ST_ENCODE0;
-                               outlen++;
-                       } else if (*inp++ == '&') {
-                               outlen++;
+                               outlen++;       // for '&'
                        }
                        outlen++;
-               } else if (!SPECIAL(*inp)) {
+               } else if (*inp == 0x00 && *(inp+1) < 0x80) {
                        state = ST_NORMAL;
+                       if (*(inp+1) != '&')
+                               outlen++;       // for '-'
                } else {
                        /* ST_ENCODE0 -> ST_ENCODE1     - two chars
                         * ST_ENCODE1 -> ST_ENCODE2     - one char
@@ -2233,8 +2242,8 @@
                        else if (state++ == ST_ENCODE0) {
                                outlen++;
                        }
-                       outlen++;
-                       inp++;
+                       outlen += 2;
+                       inp += 2;
                }
        }
@@ -2250,14 +2259,17 @@
        endp = (inp = in) + inlen;
        while (inp < endp || state != ST_NORMAL) {
                if (state == ST_NORMAL) {
-                       if (SPECIAL(*inp)) {
+                       if (*inp == 0x00 && *(inp+1) < 0x80) {
+                               /* ASCII character */
+                               inp++;
+                               if ((*outp++ = *inp++) == '&')
+                                       *outp++ = '-';
+                       } else {
                                /* begin encoding */
                                *outp++ = '&';
                                state = ST_ENCODE0;
-                       } else if ((*outp++ = *inp++) == '&') {
-                               *outp++ = '-';
                        }
-               } else if (inp == endp || !SPECIAL(*inp)) {
+               } else if (inp == endp || (*inp == 0x00 && *(inp+1) < 0x80)) {
                        /* flush overflow and terminate region */
                        if (state != ST_ENCODE0) {
                                *outp++ = B64(*outp);


« previous php.dev (#86612) next »