Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 20 Dec 2016 03:02:24 +0900 (JST)
From:      Hiroki Sato <hrs@FreeBSD.org>
To:        markj@FreeBSD.org
Cc:        freebsd-dtrace@freebsd.org
Subject:   Re: clause-local variable with copyin()
Message-ID:  <20161220.030224.323335605995825210.hrs@allbsd.org>
In-Reply-To: <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com>
References:  <20161217.151014.1579687141761225852.hrs@allbsd.org> <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com>

next in thread | previous in thread | raw e-mail | index | archive | help
----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Mark Johnston <markj@FreeBSD.org> wrote
  in <20161219030125.GB57753@wkstn-mjohnston.west.isilon.com>:

ma> On Sat, Dec 17, 2016 at 03:10:14PM +0900, Hiroki Sato wrote:
ma> >  Do I misunderstand clause-local variable?  I noticed this when I use
ma> >  if-then clause which was recently implemented as a syntax sugar to
ma> >  split a probe automatically.  The following ended up with the same
ma> >  result:
ma>
ma> I think this is more a quirk of copyin() than of clause-local variables.
ma> In particular:
ma> - your example works as expected if copyinstr() is used instead of
ma>   copyin(), and
ma> - your example works if one assigns this->st = stringof(copyin(...)).
ma>
ma> copyin() and copyinstr() both copy data into a scratch buffer. However,
ma> copyinstr() returns a pass-by-reference string, while copyin() returns a
ma> pass-by-value pointer. The DIF instruction which saves to a clause-local
ma> variable, STLS, performs a deep copy of pass-by-reference variables to
ma> some dedicated storage. The scratch space containing the
ma> copyin()/copyinstr() is not preserved between enablings of the same
ma> probe, so the string copied during the first probe is not available in
ma> the second probe when copyin() is used.

 The difference of the scratch space when using copyin() and
 copyinstr() were the following ("-" is copyin() and "+" is
 copyinstr()):

  NAME             ID   KND SCP FLAG TYPE
  arg0             106  scl glb r    D type (integer) (size 8)
 -st               500  scl loc w    D type (pointer) (size 8)
 +st               500  scl loc w    string (unknown) by ref (size 256)

 As you explained copyinstr() had DIF_TF_BYREF and DIF_OP_STLS
 performed dtrace_vcopy().  However, I still do not understand the
 difference of the behavior across the boundary of two clauses for a
 single probe.  Is it correct that the cause is that the contents of
 the scratch space which came from copyin() or copyinstr() are not
 preserved across multiple clauses of a single probe?

 If it is true, I am still wondering why copyinstr() works.  I think
 DIF_OP_LDLS in the second probe to load this->st always fails if the
 scratch space is not preserved regardless of whether the data type
 involves dereference or not.

-- Hiroki

----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)--
Content-Type: application/pgp-signature
Content-Transfer-Encoding: 7bit

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iEYEABECAAYFAlhYILAACgkQTyzT2CeTzy0iMACgmAZW0gBSq1iuzq/GYqtwMGMG
qWEAoI/V4657LgnTc10a/bk1sF8jxF7C
=T9NS
-----END PGP SIGNATURE-----

----Security_Multipart(Tue_Dec_20_03_02_24_2016_631)----



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20161220.030224.323335605995825210.hrs>