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;
}