You are viewing a plain text version of this content. The canonical link for it is here.
Posted to apreq-cvs@httpd.apache.org by jo...@apache.org on 2005/07/15 16:57:49 UTC

svn commit: r219206 - in /httpd/apreq/trunk: CHANGES include/apreq_version.h library/t/params.c library/util.c

Author: joes
Date: Fri Jul 15 07:57:45 2005
New Revision: 219206

URL: http://svn.apache.org/viewcvs?rev=219206&view=rev
Log:
  Fix apreq_decode(v) when iso-latin-1 chars appear
  at the end of an encoded string.

Reported by: Marc Gracia

Modified:
    httpd/apreq/trunk/CHANGES
    httpd/apreq/trunk/include/apreq_version.h
    httpd/apreq/trunk/library/t/params.c
    httpd/apreq/trunk/library/util.c

Modified: httpd/apreq/trunk/CHANGES
URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/CHANGES?rev=219206&r1=219205&r2=219206&view=diff
==============================================================================
--- httpd/apreq/trunk/CHANGES (original)
+++ httpd/apreq/trunk/CHANGES Fri Jul 15 07:57:45 2005
@@ -5,6 +5,10 @@
 @section v2_06 Changes with libapreq2-2.06
 
 
+- C API [Marc GrĂ cia, joes]
+  Fix apreq_decode(v) when iso-latin-1 chars appear
+  at the end of an encoded string.
+
 - Perl API [Philip M. Gollucci]
   Fix "Attempt to free temp prematurely" error in apreq_xs_croak().
 

Modified: httpd/apreq/trunk/include/apreq_version.h
URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/include/apreq_version.h?rev=219206&r1=219205&r2=219206&view=diff
==============================================================================
--- httpd/apreq/trunk/include/apreq_version.h (original)
+++ httpd/apreq/trunk/include/apreq_version.h Fri Jul 15 07:57:45 2005
@@ -61,7 +61,7 @@
 #define APREQ_MINOR_VERSION       1
 
 /** patch level */
-#define APREQ_PATCH_VERSION       2
+#define APREQ_PATCH_VERSION       3
 
 /** 
  *  This symbol is defined for internal, "development" copies of libapreq.

Modified: httpd/apreq/trunk/library/t/params.c
URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/t/params.c?rev=219206&r1=219205&r2=219206&view=diff
==============================================================================
--- httpd/apreq/trunk/library/t/params.c (original)
+++ httpd/apreq/trunk/library/t/params.c Fri Jul 15 07:57:45 2005
@@ -22,7 +22,7 @@
 
 
 static const char query_string[] = "a=1;quux=foo+bar&a=2&plus=%2B;"
-                                   "uplus=%U002b;okie=dokie;"
+                                   "uplus=%U002b;okie=dokie;foo=a%E1;"
                                    "novalue1;novalue2=";
 static apr_table_t *args;
 static apr_pool_t *p;
@@ -35,7 +35,7 @@
     AT_not_null(args);
     s = apreq_parse_query_string(p, args, query_string);
     AT_int_eq(s, APR_SUCCESS);
-    AT_int_eq(apr_table_elts(args)->nelts, 8);
+    AT_int_eq(apr_table_elts(args)->nelts, 9);
 }
 
 

Modified: httpd/apreq/trunk/library/util.c
URL: http://svn.apache.org/viewcvs/httpd/apreq/trunk/library/util.c?rev=219206&r1=219205&r2=219206&view=diff
==============================================================================
--- httpd/apreq/trunk/library/util.c (original)
+++ httpd/apreq/trunk/library/util.c Fri Jul 15 07:57:45 2005
@@ -350,6 +350,15 @@
                 else if (*charset == APREQ_CHARSET_LATIN1) {
                     *d = c;
                 }
+                else if (s + 1 >= end) {
+                    *charset = APREQ_CHARSET_UTF8;
+                    s -= 2;
+                    *dlen = d - start;
+                    *slen = s - src;
+                    memmove(d, s, end - s);
+                    d[end - s] = 0;
+                    return APR_INCOMPLETE;
+                }
 
                 /* utf8 cases */
 
@@ -591,6 +600,15 @@
     }
 
     rv = url_decode(d, dlen, &c, s, &slen);
+
+    if (rv == APR_INCOMPLETE && c == APREQ_CHARSET_UTF8) {
+        c = APREQ_CHARSET_LATIN1;
+        len += *dlen;
+        d += *dlen;
+        slen = end - (s + slen);
+        rv = url_decode(d, dlen, &c, d, &slen);
+    }
+
     *dlen += len;
 
     return rv + c;
@@ -620,13 +638,18 @@
         case APR_INCOMPLETE:
             d += len;
             *dlen += len;
+            slen = v[n].iov_len - slen;
 
-            if (++n == nelts)
-                return APR_INCOMPLETE + c;
-
-            len = v[n-1].iov_len - slen;
-            memcpy(d + len, v[n].iov_base, v[n].iov_len);
-            v[n].iov_len += len;
+            if (++n == nelts) {
+                if (c == APREQ_CHARSET_UTF8) {
+                    c = APREQ_CHARSET_LATIN1;
+                    status = url_decode(d, &len, &c, d, &slen);
+                    *dlen += len;
+                }
+                return status + c;
+            }
+            memcpy(d + slen, v[n].iov_base, v[n].iov_len);
+            v[n].iov_len += slen;
             v[n].iov_base = d;
             continue;
 
@@ -635,7 +658,8 @@
             return status;
         }
     }
-    return APR_SUCCESS + c;
+
+    return status + c;
 }