fielding 97/03/31 21:41:46
Modified: src CHANGES mod_negotiation.c Log: Petr's patch to merge r->notes, r->headers_out and r->err_headers_out didn't call overlay_tables properly. This is the only bug fix. The other hunks are more destroy_sub_req()s that are similar to the other cleanups that Petr's patch performed. Submitted by: Dean Gaudet Reviewed by: Roy Fielding, Chuck Murcko Revision Changes Path 1.218 +3 -0 apache/src/CHANGES Index: CHANGES =================================================================== RCS file: /export/home/cvs/apache/src/CHANGES,v retrieving revision 1.217 retrieving revision 1.218 diff -C3 -r1.217 -r1.218 *** CHANGES 1997/04/01 05:04:24 1.217 --- CHANGES 1997/04/01 05:41:43 1.218 *************** *** 77,82 **** --- 77,85 ---- no variants found; Add handling of '*' wildcard in Accept-Charset. [Petr Lampa and Paul Sutton] + *) Fixed overlaying of request/sub-request notes and headers in + mod_negotiation. [Dean Gaudet] + *) If two variants' charset quality are equal and one is the default charset (iso-8859-1), then prefer the variant that was specifically listed in Accept-Charset instead of the default. [Petr Lampa] 1.38 +17 -6 apache/src/mod_negotiation.c Index: mod_negotiation.c =================================================================== RCS file: /export/home/cvs/apache/src/mod_negotiation.c,v retrieving revision 1.37 retrieving revision 1.38 diff -C3 -r1.37 -r1.38 *** mod_negotiation.c 1997/03/24 22:07:06 1.37 --- mod_negotiation.c 1997/04/01 05:41:44 1.38 *************** *** 764,770 **** if (sub_req->handler && !sub_req->content_type) sub_req->content_type = CGI_MAGIC_TYPE; ! if (sub_req->status != HTTP_OK || !sub_req->content_type) continue; /* If it's a map file, we use that instead of the map * we're building... --- 764,773 ---- if (sub_req->handler && !sub_req->content_type) sub_req->content_type = CGI_MAGIC_TYPE; ! if (sub_req->status != HTTP_OK || !sub_req->content_type) { ! destroy_sub_req(sub_req); ! continue; ! } /* If it's a map file, we use that instead of the map * we're building... *************** *** 1806,1814 **** char *sub_vary; if (!variant->sub_req) { sub_req = sub_req_lookup_file(variant->file_name, r); ! if (sub_req->status != HTTP_OK && sub_req->status != HTTP_MULTIPLE_CHOICES) ! return sub_req->status; variant->sub_req = sub_req; } else --- 1809,1822 ---- char *sub_vary; if (!variant->sub_req) { + int status; + sub_req = sub_req_lookup_file(variant->file_name, r); ! status = sub_req->status; ! if (status != HTTP_OK && status != HTTP_MULTIPLE_CHOICES) { ! destroy_sub_req(sub_req); ! return status; ! } variant->sub_req = sub_req; } else *************** *** 1970,1975 **** --- 1978,1984 ---- sub_req = sub_req_lookup_file (best->file_name, r); if (sub_req->status != HTTP_OK) { res = sub_req->status; + destroy_sub_req(sub_req); goto return_from_multi; } } *************** *** 1997,2005 **** r->content_language = sub_req->content_language; r->finfo = sub_req->finfo; /* copy output headers from subrequest, but leave negotiation headers */ ! overlay_tables(r->pool, sub_req->notes, r->notes); ! overlay_tables(r->pool, sub_req->headers_out, r->headers_out); ! overlay_tables(r->pool, sub_req->err_headers_out, r->err_headers_out); avail_recs = (var_rec *)neg->avail_vars->elts; for (j = 0; j < neg->avail_vars->nelts; ++j) { var_rec *variant = &avail_recs[j]; --- 2006,2016 ---- r->content_language = sub_req->content_language; r->finfo = sub_req->finfo; /* copy output headers from subrequest, but leave negotiation headers */ ! r->notes = overlay_tables(r->pool, sub_req->notes, r->notes); ! r->headers_out = overlay_tables(r->pool, sub_req->headers_out, ! r->headers_out); ! r->err_headers_out = overlay_tables(r->pool, sub_req->err_headers_out, ! r->err_headers_out); avail_recs = (var_rec *)neg->avail_vars->elts; for (j = 0; j < neg->avail_vars->nelts; ++j) { var_rec *variant = &avail_recs[j];