Tamar Shinar <[EMAIL PROTECTED]> writes:
>Hi,
>
>I am trying to write an xs interface to an external library.  
>My code takes two perl arrays, allocates and populates corresponding C structures, 
>and passes them to the library routine.
>The problem is that the program is unstable.  It will sometimes cause core dumps in 
>the external library.  The library in itself is believed to be stable, so it seems to 
>be something in the perl/C interface.  I use the following three functions to 
>retrieve values from my perl objects in order to copy them into the C structures.
>Does anyone see anything wrong here?
>
>thank you,
>
>Tamar
>_______________________________________________________
>
>char *
>getString(HV * source, char * fieldName) 
>{
>  SV ** sv = hv_fetch(source, fieldName, strlen(fieldName), FALSE);
>  if(!SvOK(*sv)) {
>        printf("Error - hv_fetch %s returned bad sv\n", fieldName);
>  }
>  return SvPV(*sv, PL_na);
>}

The 1st thing to notice is that return from hv_fetch can be NULL if field
does not exist in the hash. So SvOK(*sv) will core dump, also you go on 
to de-ref the thing even if your test said SV was not okay.

So you want something like this - you can provide "safe" values for 
not-there and undef cases - I have used NULL and "" as examples.
  SV **svp = hv_fetch(...)
  if (*svp) {
     if (SvOK(*svp)) {
       /* defined value of some kind (but may not be a string, but SvPV will
          force that for us). In perl5.6+ you may need to consider case 
          of string being in UTF-8
        */ 
       return SvPV_nolen(*svp);
     }
     else
      {
       /* undef value */
       return "";
      }
  }
  else {
    /* No such member */
    return NULL;
  }

-- 
Nick Ing-Simmons
http://www.ni-s.u-net.com/

Reply via email to