Jeffrey Ratcliffe
2008-09-05 19:46:57 UTC
I'm writing some Perl bindings for SANE. Having got things working,
I'm trying to fix a couple of memory leaks.
valgrind is complaining:
==7353== Invalid read of size 1
==7353== at 0x40239E3: strlen (mc_replace_strmem.c:242)
==7353== by 0x80D0710: Perl_newSVpv (in /usr/bin/perl)
==7353== by 0x472152F: XS_SANE_open (SANE.xs:126)
==7353== by 0x80C22D2: Perl_pp_entersub (in /usr/bin/perl)
==7353== by 0x80C0CAA: Perl_runops_standard (in /usr/bin/perl)
==7353== by 0x806727A: perl_run (in /usr/bin/perl)
==7353== by 0x8063791: main (in /usr/bin/perl)
==7353== Address 0x49840b8 is 0 bytes after a block of size 8 alloc'd
==7353== at 0x4021BDE: calloc (vg_replace_malloc.c:397)
==7353== by 0x473CAF2: sane_dll_open (in /usr/lib/libsane.so.1.0.19)
==7353== by 0x473D193: sane_open (in /usr/lib/libsane.so.1.0.19)
==7353== by 0x47213D9: XS_SANE_open (SANE.xs:124)
==7353== by 0x80C22D2: Perl_pp_entersub (in /usr/bin/perl)
==7353== by 0x80C0CAA: Perl_runops_standard (in /usr/bin/perl)
==7353== by 0x806727A: perl_run (in /usr/bin/perl)
==7353== by 0x8063791: main (in /usr/bin/perl)
void
sane_open(class, name)
SANE_String_Const name
INIT:
SANE_Status status;
SANE_Handle h;
PPCODE:
status = sane_open(name, &h);
XPUSHs(sv_2mortal(newSViv(status)));
126-> XPUSHs(sv_2mortal(newSVpv(h, 0)));
SANE_Handle is a void pointer:
http://www.sane-project.org/html/doc011.html#s4.2.6: Access to a
scanner is provided through an opaque type called SANE_Handle. The C
declaration of this type is given below.
typedef void *SANE_Handle;
While this type is declared to be a void pointer, an application must
not attempt to interpret the value of a SANE_Handle. In particular,
SANE does not require that a value of this type is a legal pointer
value.
So in the typemap I have:
SANE_Handle T_OPAQUEPTR
I assume that newSVpv(h, 0) is causing me the trouble. I can't work
out what is correct.
Any help would be appreciated
Jeff
I'm trying to fix a couple of memory leaks.
valgrind is complaining:
==7353== Invalid read of size 1
==7353== at 0x40239E3: strlen (mc_replace_strmem.c:242)
==7353== by 0x80D0710: Perl_newSVpv (in /usr/bin/perl)
==7353== by 0x472152F: XS_SANE_open (SANE.xs:126)
==7353== by 0x80C22D2: Perl_pp_entersub (in /usr/bin/perl)
==7353== by 0x80C0CAA: Perl_runops_standard (in /usr/bin/perl)
==7353== by 0x806727A: perl_run (in /usr/bin/perl)
==7353== by 0x8063791: main (in /usr/bin/perl)
==7353== Address 0x49840b8 is 0 bytes after a block of size 8 alloc'd
==7353== at 0x4021BDE: calloc (vg_replace_malloc.c:397)
==7353== by 0x473CAF2: sane_dll_open (in /usr/lib/libsane.so.1.0.19)
==7353== by 0x473D193: sane_open (in /usr/lib/libsane.so.1.0.19)
==7353== by 0x47213D9: XS_SANE_open (SANE.xs:124)
==7353== by 0x80C22D2: Perl_pp_entersub (in /usr/bin/perl)
==7353== by 0x80C0CAA: Perl_runops_standard (in /usr/bin/perl)
==7353== by 0x806727A: perl_run (in /usr/bin/perl)
==7353== by 0x8063791: main (in /usr/bin/perl)
void
sane_open(class, name)
SANE_String_Const name
INIT:
SANE_Status status;
SANE_Handle h;
PPCODE:
status = sane_open(name, &h);
XPUSHs(sv_2mortal(newSViv(status)));
126-> XPUSHs(sv_2mortal(newSVpv(h, 0)));
SANE_Handle is a void pointer:
http://www.sane-project.org/html/doc011.html#s4.2.6: Access to a
scanner is provided through an opaque type called SANE_Handle. The C
declaration of this type is given below.
typedef void *SANE_Handle;
While this type is declared to be a void pointer, an application must
not attempt to interpret the value of a SANE_Handle. In particular,
SANE does not require that a value of this type is a legal pointer
value.
So in the typemap I have:
SANE_Handle T_OPAQUEPTR
I assume that newSVpv(h, 0) is causing me the trouble. I can't work
out what is correct.
Any help would be appreciated
Jeff