You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by sf...@apache.org on 2011/12/02 23:18:10 UTC

svn commit: r1209736 - in /httpd/httpd/branches/2.4.x: ./ modules/filters/mod_xml2enc.c

Author: sf
Date: Fri Dec  2 22:18:09 2011
New Revision: 1209736

URL: http://svn.apache.org/viewvc?rev=1209736&view=rev
Log:
Merge r1206850:
- Add some error handling for writing to the output filter chain.
- Add some ap_assert()s for error cases that probably should not happen (and
  the following code would break).
  These fix some compiler warnings about "variable 'rv' set but not used".
- Prevent a leak of a bucket in one error case.

Modified:
    httpd/httpd/branches/2.4.x/   (props changed)
    httpd/httpd/branches/2.4.x/modules/filters/mod_xml2enc.c

Propchange: httpd/httpd/branches/2.4.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Dec  2 22:18:09 2011
@@ -1,3 +1,3 @@
 /httpd/httpd/branches/revert-ap-ldap:1150158-1150173
 /httpd/httpd/branches/wombat-integration:723609-723841
-/httpd/httpd/trunk:1201042,1201111,1201194,1201198,1201202,1202456,1202886,1203859,1204630,1204968,1204990,1205061,1205075,1205379,1205885,1206291,1206587,1207719,1208753,1208835,1209053,1209085,1209417,1209432,1209461,1209601,1209603,1209618,1209623
+/httpd/httpd/trunk:1201042,1201111,1201194,1201198,1201202,1202456,1202886,1203859,1204630,1204968,1204990,1205061,1205075,1205379,1205885,1206291,1206587,1206850,1207719,1208753,1208835,1209053,1209085,1209417,1209432,1209461,1209601,1209603,1209618,1209623

Modified: httpd/httpd/branches/2.4.x/modules/filters/mod_xml2enc.c
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/filters/mod_xml2enc.c?rev=1209736&r1=1209735&r2=1209736&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/modules/filters/mod_xml2enc.c (original)
+++ httpd/httpd/branches/2.4.x/modules/filters/mod_xml2enc.c Fri Dec  2 22:18:09 2011
@@ -50,6 +50,11 @@ module AP_MODULE_DECLARE_DATA xml2enc_mo
 #define HAVE_ENCODING(enc) \
         (((enc)!=XML_CHAR_ENCODING_NONE)&&((enc)!=XML_CHAR_ENCODING_ERROR))
 
+/*
+ * XXX: Check all those ap_assert()s ans replace those that should not happen
+ * XXX: with AP_DEBUG_ASSERT and those that may happen with proper error
+ * XXX: handling.
+ */
 typedef struct {
     xmlCharEncoding xml2enc;
     char* buf;
@@ -135,6 +140,7 @@ static void fix_skipto(request_rec* r, x
                     apr_bucket* bstart;
                     rv = apr_brigade_partition(ctx->bbsave, (p-ctx->buf),
                                                &bstart);
+                    ap_assert(rv == APR_SUCCESS);
                     while (b = APR_BRIGADE_FIRST(ctx->bbsave), b != bstart) {
                         APR_BUCKET_REMOVE(b);
                         apr_bucket_destroy(b);
@@ -199,7 +205,9 @@ static void sniff_encoding(request_rec* 
     if (ap_regexec(seek_meta_ctype, ctx->buf, 1, match, 0) == 0 ) {
         /* get markers on the start and end of the match */
         rv = apr_brigade_partition(ctx->bbsave, match[0].rm_eo, &cute);
+        ap_assert(rv == APR_SUCCESS);
         rv = apr_brigade_partition(ctx->bbsave, match[0].rm_so, &cutb);
+        ap_assert(rv == APR_SUCCESS);
         /* now set length of useful buf for start-of-data hooks */
         ctx->bytes = match[0].rm_so;
         if (ctx->encoding == NULL) {
@@ -329,7 +337,7 @@ static apr_status_t xml2enc_ffunc(ap_fil
         /* Turn all this off when post-processing */
 
         /* if we don't have enough data to sniff but more's to come, wait */
-        rv = apr_brigade_length(ctx->bbsave, 0, &ctx->bblen);
+        apr_brigade_length(ctx->bbsave, 0, &ctx->bblen);
         if ((ctx->bblen < BUF_MIN) && (ctx->bblen != -1)) {
             APR_BRIGADE_DO(b, ctx->bbsave) {
                 if (APR_BUCKET_IS_EOS(b)) {
@@ -340,7 +348,8 @@ static apr_status_t xml2enc_ffunc(ap_fil
             if (!(ctx->flags & ENC_SEEN_EOS)) {
                 /* not enough data to sniff.  Wait for more */
                 APR_BRIGADE_DO(b, ctx->bbsave) {
-                    apr_bucket_setaside(b, f->r->pool);
+                    rv = apr_bucket_setaside(b, f->r->pool);
+                    ap_assert(rv == APR_SUCCESS);
                 }
                 return APR_SUCCESS;
             }
@@ -353,6 +362,7 @@ static apr_status_t xml2enc_ffunc(ap_fil
         ctx->buf = apr_palloc(f->r->pool, (apr_size_t)(ctx->bblen+1));
         ctx->bytes = (apr_size_t)ctx->bblen;
         rv = apr_brigade_flatten(ctx->bbsave, ctx->buf, &ctx->bytes);
+        ap_assert(rv == APR_SUCCESS);
         ctx->buf[ctx->bytes] = 0;
         sniff_encoding(f->r, ctx);
 
@@ -400,6 +410,7 @@ static apr_status_t xml2enc_ffunc(ap_fil
                 buf = fixbuf;
                 bytes = BUFLEN;
                 rv = apr_brigade_flatten(bb, buf, &bytes);
+                ap_assert(rv == APR_SUCCESS);
                 if (bytes == insz) {
                     /* this is only what we've already tried to convert.
                      * The brigade is exhausted.
@@ -412,7 +423,8 @@ static apr_status_t xml2enc_ffunc(ap_fil
                     rv = ap_fflush(f->next, ctx->bbnext);
                     APR_BRIGADE_CONCAT(ctx->bbsave, bb);
                     APR_BRIGADE_DO(b, ctx->bbsave) {
-                        apr_bucket_setaside(b, f->r->pool);
+                        ap_assert(apr_bucket_setaside(b, f->r->pool)
+                                  == APR_SUCCESS);
                     }
                     return rv;
                 }
@@ -441,6 +453,7 @@ static apr_status_t xml2enc_ffunc(ap_fil
                 xml2enc_run_preprocess(f, &buf, &bytes);
                 consumed = insz = bytes;
                 while (insz > 0) {
+                    apr_status_t rv2;
                     if (ctx->bytes == ctx->bblen) {
                         /* nothing was converted last time!
                          * break out of this loop! 
@@ -461,8 +474,13 @@ static apr_status_t xml2enc_ffunc(ap_fil
                                   "/%" APR_OFF_T_FMT " bytes", consumed - insz,
                                   ctx->bblen - ctx->bytes);
                     consumed = insz;
-                    ap_fwrite(f->next, ctx->bbnext, ctx->buf,
-                              (apr_size_t)ctx->bblen - ctx->bytes);
+                    rv2 = ap_fwrite(f->next, ctx->bbnext, ctx->buf,
+                                    (apr_size_t)ctx->bblen - ctx->bytes);
+                    if (rv2 != APR_SUCCESS) {
+                        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv2, f->r,
+                                      "ap_fwrite failed");
+                        return rv2;
+                    }
                     switch (rv) {
                     case APR_SUCCESS:
                         continue;
@@ -485,17 +503,22 @@ static apr_status_t xml2enc_ffunc(ap_fil
                         ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r,
                                       "Failed to convert input; trying it raw") ;
                         ctx->convset = NULL;
-                        ap_fflush(f->next, ctx->bbnext);
-                        return ap_pass_brigade(f->next, ctx->bbnext);
+                        rv = ap_fflush(f->next, ctx->bbnext);
+                        if (rv != APR_SUCCESS)
+                            ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, f->r,
+                                          "ap_fflush failed");
+                        else
+                            rv = ap_pass_brigade(f->next, ctx->bbnext);
                     }
                 }
             } else {
                 ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r,
                               "xml2enc: error reading data") ;
             }
-            if (bdestroy) {
+            if (bdestroy)
                 apr_bucket_destroy(bdestroy);
-            }
+            if (rv != APR_SUCCESS)
+                return rv;
         }
     }
     return APR_SUCCESS;