stas 2003/10/11 01:01:00
Modified: src/modules/perl modperl_callback.c
. Changes
Log:
callbacks returning values which aren't integers or strings (which are
to be coerced into integers) are now interpreted as errors.
Submitted by: Geoffrey Young
Revision Changes Path
1.63 +21 -9 modperl-2.0/src/modules/perl/modperl_callback.c
Index: modperl_callback.c
===================================================================
RCS file: /home/cvs/modperl-2.0/src/modules/perl/modperl_callback.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -u -r1.62 -r1.63
--- modperl_callback.c 9 Oct 2003 19:41:41 -0000 1.62
+++ modperl_callback.c 11 Oct 2003 08:01:00 -0000 1.63
@@ -4,7 +4,6 @@
request_rec *r, server_rec *s, AV *args)
{
CV *cv=Nullcv;
- SV *status_sv;
I32 flags = G_EVAL|G_SCALAR;
dSP;
int count, status = OK;
@@ -76,20 +75,33 @@
status = OK;
}
else {
- status_sv = POPs;
+ SV *status_sv = POPs;
- if (status_sv == &PL_sv_undef) {
- /* ModPerl::Util::exit(), die(), or other croaks
- * Perl_croak sets count to 1 but the stack to undef with
G_EVAL|G_SCALAR
- * if it was an error, it will be caught with ERRSV below */
+ if (SvIOK(status_sv)) {
+ /* normal IV return (e.g., Apache::OK) */
+ status = SvIVX(status_sv);
+ }
+ else if (status_sv == &PL_sv_undef) {
+ /* ModPerl::Util::exit() and Perl_croak internally
+ * arrange to return PL_sv_undef with G_EVAL|G_SCALAR */
status = OK;
}
+ else if (SvPOK(status_sv)) {
+ /* PV return that ought to be treated as IV ("0") */
+ status = SvIVx(status_sv);
+ MP_TRACE_h(MP_FUNC,
+ "coercing handler %s's return value '%s' into %d",
+ handler->name, SvPVX(status_sv), status);
+ }
else {
- /* get the integer return code (or a string coerced into an int) */
- status = SvIV(status_sv);
+ /* any other return types are considered as errors */
+ status = HTTP_INTERNAL_SERVER_ERROR;
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "handler %s didn't return a valid return value!",
+ handler->name);
}
- /* assume OK for non-http status codes and for 200 (HTTP_OK) */
+ /* assume OK for non-HTTP status codes and for 200 (HTTP_OK) */
if (((status > 0) && (status < 100)) ||
(status == 200) || (status > 600)) {
status = OK;
1.234 +4 -3 modperl-2.0/Changes
Index: Changes
===================================================================
RCS file: /home/cvs/modperl-2.0/Changes,v
retrieving revision 1.233
retrieving revision 1.234
diff -u -u -r1.233 -r1.234
--- Changes 9 Oct 2003 22:48:58 -0000 1.233
+++ Changes 11 Oct 2003 08:01:00 -0000 1.234
@@ -12,12 +12,13 @@
=item 1.99_11-dev -
+callbacks returning values which aren't integers or strings (which are
+to be coerced into integers) are now interpreted as errors. [Geoffrey
+Young]
+
in the MP_MAINTAINER mode add the -Werror compilation flag when perl
v5.6.2 or higher is used, so that we don't miss compilation
warnings. [Stas]
-
-handlers returning status numbers as strings (e.g. "0") are working
-again (as they did before 1.99_10). [Geoffrey Young]
fix the Makefile.PL option parser to support overriding of certain
build options, in addition to appending to them (.e.g. now MP_LIBNAME