joes 2004/07/11 13:26:43
Modified: glue/perl/t/response/TestApReq request.pm
glue/perl/xsbuilder apreq_xs_tables.h
glue/perl/xsbuilder/Apache/Upload Apache__Upload.h
Log:
Add some type safety by tagging magic keys with the object which created
them. That should prevent segfaults that could occur; for example if magic
keys from a cookie table are passed to ->upload (the returned objects are of
different types, so the v-string magic in the cookie key needs to be ignored).
Revision Changes Path
1.28 +1 -1 httpd-apreq-2/glue/perl/t/response/TestApReq/request.pm
Index: request.pm
===================================================================
RCS file: /home/cvs/httpd-apreq-2/glue/perl/t/response/TestApReq/request.pm,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- request.pm 11 Jul 2004 18:35:26 -0000 1.27
+++ request.pm 11 Jul 2004 20:26:43 -0000 1.28
@@ -151,7 +151,7 @@
$test_string eq "test=disable_uploads;foo=bar1;foo=bar2;";
$test_string = join ":", values %$args;
- die "values test failed: $test_string" unless
+ die "values test failed: '$test_string'" unless
$test_string eq "disable_uploads:bar1:bar2";
$test_string = "";
1.8 +27 -17 httpd-apreq-2/glue/perl/xsbuilder/apreq_xs_tables.h
Index: apreq_xs_tables.h
===================================================================
RCS file: /home/cvs/httpd-apreq-2/glue/perl/xsbuilder/apreq_xs_tables.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- apreq_xs_tables.h 11 Jul 2004 18:35:26 -0000 1.7
+++ apreq_xs_tables.h 11 Jul 2004 20:26:43 -0000 1.8
@@ -88,6 +88,20 @@
/* TABLE_GET */
+struct apreq_xs_table_key_magic {
+ SV *obj;
+ const char *val;
+};
+
+#define APREQ_XS_TABLE_ADD_KEY_MAGIC(p, sv, o, v) do {
\
+ struct apreq_xs_table_key_magic *info = apr_palloc(p,sizeof *info);
\
+ info->obj = o;
\
+ info->val = v;
\
+ sv_magic(sv, Nullsv, PERL_MAGIC_vstring, Nullch, -1);
\
+ SvMAGIC(sv)->mg_ptr = (char *)info;
\
+ SvRMAGICAL_on(sv);
\
+} while (0)
+
struct apreq_xs_do_arg {
void *env;
@@ -105,11 +119,7 @@
dSP;
SV *sv = newSVpv(key,0);
-
- sv_magic(sv, Nullsv, PERL_MAGIC_vstring, Nullch, -1);
- SvMAGIC(sv)->mg_ptr = (char *)val;
- SvRMAGICAL_on(sv);
-
+ APREQ_XS_TABLE_ADD_KEY_MAGIC(apreq_env_pool(d->env),sv,d->parent,val);
XPUSHs(sv_2mortal(sv));
PUTBACK;
return 1;
@@ -220,16 +230,18 @@
} \
if (SvMAGICAL(ST(1)) \
&& (mg = mg_find(ST(1),PERL_MAGIC_vstring)) \
- && mg->mg_len == -1) \
+ && mg->mg_len == -1 /*&& mg->mg_obj == obj*/) \
{ \
- RETVAL = apreq_value_to_##type( \
- apreq_strtoval(mg->mg_ptr)); \
- if (!strcasecmp(key,RETVAL->v.name) && (COND)) { \
- XPUSHs(sv_2mortal(apreq_xs_##type##2sv( \
- RETVAL,subclass,obj))); \
- PUTBACK; \
- break; \
- \
+ struct apreq_xs_table_key_magic *info = (void*)mg->mg_ptr; \
+ if (info->obj == obj) { \
+ RETVAL = apreq_value_to_##type( \
+ apreq_strtoval(info->val)); \
+ if (!strcasecmp(key,RETVAL->v.name) && (COND)) { \
+ XPUSHs(sv_2mortal(apreq_xs_##type##2sv( \
+ RETVAL,subclass,obj))); \
+ PUTBACK; \
+ break; \
+ } \
} \
} \
\
@@ -270,9 +282,7 @@
} \
idx = SvCUR(obj)++; \
sv = newSVpv(te[idx].key, 0); \
- sv_magic(sv, Nullsv, PERL_MAGIC_vstring, Nullch, -1); \
- SvMAGIC(sv)->mg_ptr = (char *)te[idx].val; \
- SvRMAGICAL_on(sv); \
+ APREQ_XS_TABLE_ADD_KEY_MAGIC(arr->pool,sv,obj,te[idx].val); \
ST(0) = sv_2mortal(sv); \
XSRETURN(1); \
}
1.23 +2 -2
httpd-apreq-2/glue/perl/xsbuilder/Apache/Upload/Apache__Upload.h
Index: Apache__Upload.h
===================================================================
RCS file:
/home/cvs/httpd-apreq-2/glue/perl/xsbuilder/Apache/Upload/Apache__Upload.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -r1.22 -r1.23
--- Apache__Upload.h 11 Jul 2004 18:35:26 -0000 1.22
+++ Apache__Upload.h 11 Jul 2004 20:26:43 -0000 1.23
@@ -89,12 +89,12 @@
dSP;
SV *sv;
- if (apreq_value_to_param(apreq_strtoval(val))->bb = NULL)
+ if (apreq_value_to_param(apreq_strtoval(val))->bb == NULL)
return 1;
sv = newSVpv(key,0);
- sv_magic(sv, Nullsv, PERL_MAGIC_vstring, Nullch, -1);
+ sv_magic(sv, d->parent, PERL_MAGIC_vstring, Nullch, -1);
SvMAGIC(sv)->mg_ptr = (char *)val;
SvRMAGICAL_on(sv);