On Tue, May 25, 2010 at 5:13 AM, Mark Phalan <mark.pha...@sun.com> wrote:
> On Mon, 2010-05-24 at 15:16 -0400, Chad Mynhier wrote:
>>
>> 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?
>

Nope, the above example is mostly working by sheer luck.  In this
case, the destination of the copyin() just happens to be zeroed, so
the string it copies in will necessarily be null-terminated.

Note that stringof() doesn't actually _do_ anything.  stringof() isn't
a subroutine that walks what you give it to verify that it's
null-terminated.  (And it _can't_ do that, as it doesn't have a length
argument and thus has no way of determining the proper length of that
string.)  stringof() isn't much more than a type cast.

OTOH, copyinstr() _does_ take a second argument that specifies a max
length, so the workaround you're looking for is to use that:

  data_string = strjoin("@",
      copyinstr((uintptr_t)(*((uint32_t *)
      copyin((uintptr_t)&P->data, sizeof (uint32_t)))), *((uint32_t *)
      copyin((uintptr_t)&P->length, sizeof (uint32_t)))));

copyinstr() will null-terminate the resulting string.  You can see
this here:  
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/dtrace/dtrace.c#3174.

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

Reply via email to