On Mon, 2010-05-24 at 15:16 -0400, Chad Mynhier wrote:
> On Mon, May 24, 2010 at 8:56 AM, Mark Phalan <mark.pha...@sun.com> wrote:
> > On Mon, 2010-05-24 at 13:42 +0200, Mark Phalan wrote:
> >> On Tue, 2010-05-18 at 17:28 -0400, Angelo Rajadurai wrote:
> >> >
> >> > The way to fix it is to set strsize
> >> >
> >> > #pragma D option strsize=1024 // make sure your string can fit in!
> >> >
> >>
> >> Thanks for the idea but it doesn't seem to make any difference even if I
> >> increase strsize up to 2097152 (above which I get drops).
> >> The size of the string is just 5 characters "TEST" + "@".
> >>
> >> I'll file a bug.
> >
> >
> > 6955097 "out of scratch space in action" error with small amounts of
> > data
> >
> 
> I don't think this is a bug in DTrace, I think this is just an
> off-by-one error in your original code.  Try adding 1 to data.length.

In the simple example I included the string is NULL-terminated. This
isn't the case in reality. strings are represented by a pointer (data)
and a string length (length).

Anyway, I changed the C to look like this:

int main() {
      my_data data;

      data.length = strlen("TEST") + 1;
      data.data = "TEST";

      SIMPLE_START(&data);
}

and I see exactly the same error.

> 
> Even though "string" is a separate type in DTrace, a string is still
> just stored as a null-terminated sequence of characters.  stringof()
> isn't doing anything to null-terminate what you give it, it's just
> assuming that you're giving it something that's null-terminated.  In
> this case, it appears that there's enough garbage after the copied-in
> string to ...

I thought that stringof() was being clever. I see this example:

"To print only as much of the string as the caller intended, use the
copyin() subroutine, which takes a size as its second argument:


syscall::write:entry
{
        printf("%s", stringof(copyin(arg1, arg2)));
}"

from: http://docs.sun.com/app/docs/doc/817-6223/chp-user?a=view

which seems to imply that stringof() should NULL-terminate.

Is the above example incorrect?

> 
> Oh.  I know what's happening.  Because there's no null-termination on
> the string, strjoin() actually ends up generating the garbage that
> makes the copied-in string appear infinitely long.
> 
> +---+---+---+---+---+---+---+---+---+---+---+---+---+---+
> | T | E | S | T | @ | T | E | S | T | @ | T | E | S | T | ...
> +---+---+---+---+---+---+---+---+---+---+---+---+---+---+
>   ^                   ^
>   |                   |
>   A                   B
> 
> strjoin() is copying from pointer A to pointer B.  Pointer A never
> hits a '\0', you just end up running out of scratch space.

Any ideas how I can workaround this when the string being copied in
isn't null terminated?

Thanks,

-M

_______________________________________________
dtrace-discuss mailing list
dtrace-discuss@opensolaris.org

Reply via email to