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

Reply via email to