In message <[EMAIL PROTECTED]> Tom Hughes <[EMAIL PROTECTED]> wrote:
> Syscall param open(pathname) contains uninitialised or unaddressable byte(s) > at 0x403F1892: __libc_open (__libc_open:31) > by 0x403829C3: _IO_fopen@@GLIBC_2.1 (iofopen.c:67) > by 0x809B287: cg_core (core.ops:138) > by 0x80955E0: runops_fast_core (runops_cores.c:34) > Address 0x4104051D is 3201 bytes inside a block of size 32824 alloc'd > at 0x4003DCC2: malloc (vg_clientmalloc.c:618) > by 0x8092E11: mem_sys_allocate (memory.c:74) > by 0x8098DAD: Parrot_alloc_new_block (resources.c:830) > by 0x8092EC0: mem_setup_allocator (memory.c:108) > > ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0) > malloc/free: in use at exit: 249652 bytes in 54 blocks. > malloc/free: 58 allocs, 4 frees, 381692 bytes allocated. > For a detailed leak analysis, rerun with: --leak-check=yes > For counts of detected errors, rerun with: -v > > I haven't attempted to look at this and see what is causing it. I've had a look at it now. The problem is that we are passing s->bufstart to fopen but there is no guarantee that there is a nul byte at the end of the buffer as parrot strings are not nul terminated. I have developed patch for this in the form of a new routine which returns a nul terminated C style string given a parrot string as argument. It does this by making sure buflen is at least one greater than bufused and then stuffing a nul in that byte. This isn't a particularly brilliant fix so I'm attaching it here for comments before I commit it. Of course we also need to think about encoding/charset issues when passing strings to system calls... Tom -- Tom Hughes ([EMAIL PROTECTED]) http://www.compton.nu/
Index: core.ops =================================================================== RCS file: /home/perlcvs/parrot/core.ops,v retrieving revision 1.119 diff -u -w -r1.119 core.ops --- core.ops 3 Apr 2002 23:03:37 -0000 1.119 +++ core.ops 13 Apr 2002 14:11:11 -0000 @@ -135,7 +135,7 @@ =cut inline op open(out INT, in STR) { - $1 = (INTVAL)fopen(($2)->bufstart, "r+"); + $1 = (INTVAL)fopen(string_to_cstring(interpreter, ($2)), "r+"); if (!$1) { perror("Can't open"); exit(1); @@ -145,7 +145,7 @@ } inline op open(out INT, in STR, in STR) { - $1 = (INTVAL)fopen(($2)->bufstart, ($3)->bufstart); + $1 = (INTVAL)fopen(string_to_cstring(interpreter, ($2)), +string_to_cstring(interpreter, ($3))); goto NEXT(); } @@ -246,7 +246,7 @@ op print(in STR) { STRING *s = $1; if (s && string_length(s)) { - printf("%.*s", (int)string_length(s), (char *) s->bufstart); + printf("%s", string_to_cstring(interpreter, (s))); } goto NEXT(); } @@ -255,7 +255,7 @@ PMC *p = $1; STRING *s = (p->vtable->get_string(interpreter, p)); if (s) { - printf("%.*s",(int)string_length(s),(char *) s->bufstart); + printf("%s", string_to_cstring(interpreter, (s))); } goto NEXT(); } @@ -304,7 +304,7 @@ default: file = (FILE *)$1; } if (s && string_length(s)) { - fprintf(file, "%.*s",(int)string_length(s),(char *) s->bufstart); + fprintf(file, "%s", string_to_cstring(interpreter, (s))); } goto NEXT(); } @@ -323,7 +323,7 @@ default: file = (FILE *)$1; } if (s) { - fprintf(file, "%.*s",(int)string_length(s),(char *) s->bufstart); + fprintf(file, "%s", string_to_cstring(interpreter, (s))); } goto NEXT(); } Index: string.c =================================================================== RCS file: /home/perlcvs/parrot/string.c,v retrieving revision 1.68 diff -u -w -r1.68 string.c --- string.c 12 Apr 2002 01:40:28 -0000 1.68 +++ string.c 13 Apr 2002 14:11:12 -0000 @@ -802,6 +802,21 @@ NULL, 0, NULL); } +const char * +string_to_cstring(struct Parrot_Interp * interpreter, STRING * s) +{ + char *cstring; + + if (s->buflen == s->bufused) + string_grow(interpreter, s, 1); + + cstring = s->bufstart; + + cstring[s->bufused] = 0; + + return cstring; +} + /* * Local variables: Index: include/parrot/string_funcs.h =================================================================== RCS file: /home/perlcvs/parrot/include/parrot/string_funcs.h,v retrieving revision 1.6 diff -u -w -r1.6 string_funcs.h --- include/parrot/string_funcs.h 22 Mar 2002 04:11:57 -0000 1.6 +++ include/parrot/string_funcs.h 13 Apr 2002 14:11:12 -0000 @@ -27,6 +27,7 @@ const STRING *, STRING **); INTVAL Parrot_string_compare(Parrot, const STRING *, const STRING *); Parrot_Bool Parrot_string_bool(const STRING *); +const char *Parrot_string_cstring(const STRING *); /* Declarations of other functions */ UINTVAL Parrot_string_length(const STRING *); @@ -45,6 +46,7 @@ STRING **dest_ptr); void Parrot_string_init(void); INTVAL Parrot_string_index(const STRING *, UINTVAL idx); +const char *Parrot_string_to_cstring(struct Parrot_Interp *, STRING *); #ifdef PARROT_IN_CORE @@ -56,6 +58,7 @@ #define string_replace Parrot_string_replace #define string_compare Parrot_string_compare #define string_bool Parrot_string_bool +#define string_cstring Parrot_string_cstring #define string_length Parrot_string_length #define string_ord Parrot_string_ord @@ -69,6 +72,7 @@ #define string_transcode Parrot_string_transcode #define string_init Parrot_string_init #define string_index Parrot_string_index +#define string_to_cstring Parrot_string_to_cstring #endif