Re: [DTrace-devel] [PATCH v2 5/7] string: ensure string size is handled correctly

Eugene Loh <[email protected]>
Newsgroups dev.linux.lists.dtrace
Message-ID <[email protected]>
Reviewed-by: Eugene Loh <[email protected]>

On 8/14/25 16:37, Kris Van Hees wrote:
> Apologies - this is v3
>
> On Thu, Aug 14, 2025 at 04:33:37PM -0400, Kris Van Hees via DTrace-devel wrote:
>> A string is defined as a character array of size strsize.  Strings
>> that are less that strsize in length are terminated by a NUL byte.
>> This implies that the NUL byte is part of the array and therefore,
>> strsize is indeed the size of the array and not the maximum number
>> of characters in the string.
>>
>> Tests are adjusted to reflect this behaviour.
>>
>> Signed-off-by: Kris Van Hees <[email protected]>
>> ---
>>   libdtrace/dt_bpf.c                                    |  4 ++--
>>   libdtrace/dt_cg.c                                     | 11 +++++------
>>   test/unittest/codegen/tst.str_const_length.d          |  2 +-
>>   test/unittest/codegen/tst.str_data_size.d             |  2 +-
>>   test/unittest/codegen/tst.str_store_var.d             |  2 +-
>>   .../funcs/inet_ntoa6/tst.inet_ntoa6.strsize_10.r      |  6 +++---
>>   test/unittest/funcs/strjoin/tst.strjoin-bordercases.d |  2 +-
>>   .../funcs/strjoin/tst.strjoin-capped-size-2.d         |  2 +-
>>   .../funcs/strjoin/tst.strjoin-capped-size-3.d         |  2 +-
>>   test/unittest/funcs/strjoin/tst.strjoin-capped-size.d |  2 +-
>>   test/unittest/funcs/strjoin/tst.strjoin_nonDPTR.d     |  2 +-
>>   .../strlen/{tst.capped-sizw.d => tst.capped-size.d}   |  2 +-
>>   test/unittest/funcs/strtok/tst.strtok_long.d          |  4 ++--
>>   test/unittest/funcs/strtok/tst.strtok_long.r          |  4 ++--
>>   test/unittest/funcs/substr/tst.substr-stored-len.d    |  2 +-
>>   test/unittest/funcs/substr/tst.substr-strsize.d       |  2 +-
>>   test/unittest/funcs/substr/tst.substr_nonDPTR.d       |  2 +-
>>   test/unittest/funcs/tst.basename_nonDPTR.d            |  2 +-
>>   test/unittest/funcs/tst.inet_ntoa_nonDPTR.d           |  2 +-
>>   test/unittest/funcs/tst.lltostr-short.d               |  2 +-
>>   test/unittest/variables/tvar/tst.str-size.d           |  2 +-
>>   21 files changed, 30 insertions(+), 31 deletions(-)
>>   rename test/unittest/funcs/strlen/{tst.capped-sizw.d => tst.capped-size.d} (94%)
>>
>> diff --git a/libdtrace/dt_bpf.c b/libdtrace/dt_bpf.c
>> index ddf703ddd..31781ac9f 100644
>> --- a/libdtrace/dt_bpf.c
>> +++ b/libdtrace/dt_bpf.c
>> @@ -910,8 +910,8 @@ gmap_create_strtab(dtrace_hdl_t *dtp)
>>   	while (buf < end) {
>>   		uint_t	len = strlen((char *)buf);
>>   
>> -		if (len > strsize)
>> -			buf[strsize] = '\0';
>> +		if (len >= strsize)
>> +			buf[strsize - 1] = '\0';
>>   
>>   		buf += len + 1;
>>   	}
>> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
>> index 88dddb087..cd9e7f4e9 100644
>> --- a/libdtrace/dt_cg.c
>> +++ b/libdtrace/dt_cg.c
>> @@ -1741,11 +1741,10 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
>>   			dt_cg_check_ptr_arg(dlp, drp, dnp, NULL);
>>   
>>   		TRACE_REGSET("store_val(): Begin ");
>> -		off = dt_rec_add(dtp, dt_cg_fill_gap, kind, size + 1, 1, pfp,
>> -				 arg);
>> +		off = dt_rec_add(dtp, dt_cg_fill_gap, kind, size, 1, pfp, arg);
>>   
>>   		/*
>> -		 * Copy the string data (no more than STRSIZE + 1 bytes) to the
>> +		 * Copy the string data (no more than STRSIZE bytes) to the
>>   		 * buffer at (%r9 + off).  We depend on the fact that
>>   		 * probe_read_str() stops at the terminating NUL byte.
>>   		 */
>> @@ -1754,7 +1753,7 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
>>   
>>   		emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_9));
>>   		emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, off));
>> -		emit(dlp, BPF_MOV_IMM(BPF_REG_2, strsize + 1));
>> +		emit(dlp, BPF_MOV_IMM(BPF_REG_2, strsize));
>>   		emit(dlp, BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
>>   		dt_regset_free(drp, dnp->dn_reg);
>>   		dt_cg_tstring_free(pcb, dnp);
>> @@ -1765,13 +1764,13 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
>>   		/*
>>   		 * Pad the rest with zeroes, if necessary.
>>   		 */
>> -		emit(dlp,  BPF_BRANCH_IMM(BPF_JGE, BPF_REG_0, strsize + 1, lbl_ok));
>> +		emit(dlp,  BPF_BRANCH_IMM(BPF_JGE, BPF_REG_0, strsize, lbl_ok));
>>   		if (dt_regset_xalloc_args(drp) == -1)
>>   			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
>>   		emit(dlp,  BPF_MOV_REG(BPF_REG_1, BPF_REG_9));
>>   		emit(dlp,  BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, off));
>>   		emit(dlp,  BPF_ALU64_REG(BPF_ADD, BPF_REG_1, BPF_REG_0));
>> -		emit(dlp,  BPF_MOV_IMM(BPF_REG_2, strsize + 1));
>> +		emit(dlp,  BPF_MOV_IMM(BPF_REG_2, strsize));
>>   		emit(dlp,  BPF_ALU64_REG(BPF_SUB, BPF_REG_2, BPF_REG_0));
>>   		dt_cg_zerosptr(BPF_REG_3, dlp, drp);
>>   		emit(dlp,  BPF_CALL_HELPER(dtp->dt_bpfhelper[BPF_FUNC_probe_read_kernel]));
>> diff --git a/test/unittest/codegen/tst.str_const_length.d b/test/unittest/codegen/tst.str_const_length.d
>> index 1c58ba13d..bfdd00a2e 100644
>> --- a/test/unittest/codegen/tst.str_const_length.d
>> +++ b/test/unittest/codegen/tst.str_const_length.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=5
>> +#pragma D option strsize=6
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/codegen/tst.str_data_size.d b/test/unittest/codegen/tst.str_data_size.d
>> index a928e8299..c93174a4f 100644
>> --- a/test/unittest/codegen/tst.str_data_size.d
>> +++ b/test/unittest/codegen/tst.str_data_size.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=5
>> +#pragma D option strsize=6
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/codegen/tst.str_store_var.d b/test/unittest/codegen/tst.str_store_var.d
>> index c14714c01..cfd37404f 100644
>> --- a/test/unittest/codegen/tst.str_store_var.d
>> +++ b/test/unittest/codegen/tst.str_store_var.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=6
>> +#pragma D option strsize=7
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/inet_ntoa6/tst.inet_ntoa6.strsize_10.r b/test/unittest/funcs/inet_ntoa6/tst.inet_ntoa6.strsize_10.r
>> index 5e7d49b03..8090daad6 100644
>> --- a/test/unittest/funcs/inet_ntoa6/tst.inet_ntoa6.strsize_10.r
>> +++ b/test/unittest/funcs/inet_ntoa6/tst.inet_ntoa6.strsize_10.r
>> @@ -1,8 +1,8 @@
>> -fe80:7060:
>> -1080::808:
>> +fe80:7060
>> +1080::808
>>   ::1
>>   ::
>>   127.0.0.1
>>   127.0.0.1
>> -::fffe:7f0
>> +::fffe:7f
>>   
>> diff --git a/test/unittest/funcs/strjoin/tst.strjoin-bordercases.d b/test/unittest/funcs/strjoin/tst.strjoin-bordercases.d
>> index 253b2d6ef..1ac5ffd12 100644
>> --- a/test/unittest/funcs/strjoin/tst.strjoin-bordercases.d
>> +++ b/test/unittest/funcs/strjoin/tst.strjoin-bordercases.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=5
>> +#pragma D option strsize=6
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/strjoin/tst.strjoin-capped-size-2.d b/test/unittest/funcs/strjoin/tst.strjoin-capped-size-2.d
>> index 625c786b6..44a6acd88 100644
>> --- a/test/unittest/funcs/strjoin/tst.strjoin-capped-size-2.d
>> +++ b/test/unittest/funcs/strjoin/tst.strjoin-capped-size-2.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=6
>> +#pragma D option strsize=7
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/strjoin/tst.strjoin-capped-size-3.d b/test/unittest/funcs/strjoin/tst.strjoin-capped-size-3.d
>> index 52718325a..d2982a70b 100644
>> --- a/test/unittest/funcs/strjoin/tst.strjoin-capped-size-3.d
>> +++ b/test/unittest/funcs/strjoin/tst.strjoin-capped-size-3.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=6
>> +#pragma D option strsize=7
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/strjoin/tst.strjoin-capped-size.d b/test/unittest/funcs/strjoin/tst.strjoin-capped-size.d
>> index fe5b323f7..b54fd2f29 100644
>> --- a/test/unittest/funcs/strjoin/tst.strjoin-capped-size.d
>> +++ b/test/unittest/funcs/strjoin/tst.strjoin-capped-size.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option rawbytes
>> -#pragma D option strsize=10
>> +#pragma D option strsize=11
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/strjoin/tst.strjoin_nonDPTR.d b/test/unittest/funcs/strjoin/tst.strjoin_nonDPTR.d
>> index a1816f975..2b700a5a8 100644
>> --- a/test/unittest/funcs/strjoin/tst.strjoin_nonDPTR.d
>> +++ b/test/unittest/funcs/strjoin/tst.strjoin_nonDPTR.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=14
>> +#pragma D option strsize=15
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/strlen/tst.capped-sizw.d b/test/unittest/funcs/strlen/tst.capped-size.d
>> similarity index 94%
>> rename from test/unittest/funcs/strlen/tst.capped-sizw.d
>> rename to test/unittest/funcs/strlen/tst.capped-size.d
>> index 4e473236c..676ed185e 100644
>> --- a/test/unittest/funcs/strlen/tst.capped-sizw.d
>> +++ b/test/unittest/funcs/strlen/tst.capped-size.d
>> @@ -11,7 +11,7 @@
>>    * SECTION: Actions and Subroutines/strlen()
>>    */
>>   
>> -#pragma D option strsize=5
>> +#pragma D option strsize=6
>>   #pragma D option quiet
>>   
>>   BEGIN
>> diff --git a/test/unittest/funcs/strtok/tst.strtok_long.d b/test/unittest/funcs/strtok/tst.strtok_long.d
>> index 1fbe415dc..254a65485 100644
>> --- a/test/unittest/funcs/strtok/tst.strtok_long.d
>> +++ b/test/unittest/funcs/strtok/tst.strtok_long.d
>> @@ -9,8 +9,8 @@
>>   
>>   BEGIN
>>   {
>> -	/* 256-char string ending in "XYZ" */
>> -	x = "_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XYZ";
>> +	/* 256-char string ending in "XYZ" (255 chars + NUL byte)*/
>> +	x = "____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XYZ";
>>   
>>   	/* check whether the last char of a long string is seen */
>>   	y = "a";
>> diff --git a/test/unittest/funcs/strtok/tst.strtok_long.r b/test/unittest/funcs/strtok/tst.strtok_long.r
>> index a752554e8..4b172ca1b 100644
>> --- a/test/unittest/funcs/strtok/tst.strtok_long.r
>> +++ b/test/unittest/funcs/strtok/tst.strtok_long.r
>> @@ -1,5 +1,5 @@
>> -_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XYZ
>> +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XYZ
>>   zyxwvutsrqponmlkjihgfedcba
>> -_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XY
>> +____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________XY
>>   Z
>>   
>> diff --git a/test/unittest/funcs/substr/tst.substr-stored-len.d b/test/unittest/funcs/substr/tst.substr-stored-len.d
>> index 97d2b0f61..fa3e5337c 100644
>> --- a/test/unittest/funcs/substr/tst.substr-stored-len.d
>> +++ b/test/unittest/funcs/substr/tst.substr-stored-len.d
>> @@ -13,7 +13,7 @@
>>   
>>   #pragma D option quiet
>>   #pragma D option rawbytes
>> -#pragma D option strsize=13
>> +#pragma D option strsize=14
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/substr/tst.substr-strsize.d b/test/unittest/funcs/substr/tst.substr-strsize.d
>> index b4d0cc63e..04eab4297 100644
>> --- a/test/unittest/funcs/substr/tst.substr-strsize.d
>> +++ b/test/unittest/funcs/substr/tst.substr-strsize.d
>> @@ -15,7 +15,7 @@
>>   
>>   #pragma D option quiet
>>   #pragma D option rawbytes
>> -#pragma D option strsize=13
>> +#pragma D option strsize=14
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/substr/tst.substr_nonDPTR.d b/test/unittest/funcs/substr/tst.substr_nonDPTR.d
>> index 9d847ab6f..3e10af08e 100644
>> --- a/test/unittest/funcs/substr/tst.substr_nonDPTR.d
>> +++ b/test/unittest/funcs/substr/tst.substr_nonDPTR.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=13
>> +#pragma D option strsize=14
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/tst.basename_nonDPTR.d b/test/unittest/funcs/tst.basename_nonDPTR.d
>> index 4f93685f7..cecef827b 100644
>> --- a/test/unittest/funcs/tst.basename_nonDPTR.d
>> +++ b/test/unittest/funcs/tst.basename_nonDPTR.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=14
>> +#pragma D option strsize=15
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/tst.inet_ntoa_nonDPTR.d b/test/unittest/funcs/tst.inet_ntoa_nonDPTR.d
>> index 500c53e86..f079c7ef4 100644
>> --- a/test/unittest/funcs/tst.inet_ntoa_nonDPTR.d
>> +++ b/test/unittest/funcs/tst.inet_ntoa_nonDPTR.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=14
>> +#pragma D option strsize=15
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/funcs/tst.lltostr-short.d b/test/unittest/funcs/tst.lltostr-short.d
>> index 969045667..65a5714c2 100644
>> --- a/test/unittest/funcs/tst.lltostr-short.d
>> +++ b/test/unittest/funcs/tst.lltostr-short.d
>> @@ -6,7 +6,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=7
>> +#pragma D option strsize=8
>>   
>>   BEGIN
>>   {
>> diff --git a/test/unittest/variables/tvar/tst.str-size.d b/test/unittest/variables/tvar/tst.str-size.d
>> index b4ab6ea2b..bd8aac132 100644
>> --- a/test/unittest/variables/tvar/tst.str-size.d
>> +++ b/test/unittest/variables/tvar/tst.str-size.d
>> @@ -12,7 +12,7 @@
>>    */
>>   
>>   #pragma D option quiet
>> -#pragma D option strsize=4
>> +#pragma D option strsize=5
>>   
>>   BEGIN
>>   {
>> -- 
>> 2.45.2
>>
>>
>> _______________________________________________
>> DTrace-devel mailing list
>> [email protected]
>> https://oss.oracle.com/mailman/listinfo/dtrace-devel
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.