[DTrace-devel] [PATCH] Add workstatus error conditions

Eugene Loh eugene.loh at oracle.com
Fri Jan 15 21:41:18 PST 2021


On 01/15/2021 05:38 PM, Kris Van Hees wrote:

> The processing of perf event output buffer data can fail in a few
> different ways, all leading to returning DTRACE_WORKSTATUS_ERROR.
> In order to better troubleshoot such issues we add two new DTrace
> error codes:
>
> - EDT_DSIZE: Data record has an incrreoct size

Typo.

(Beyond that, I was going to suggest using "invalid", but given that 
"incorrect" is used in the actual error string, "incorrect" also makes 
sense here.)

> - EDT_BADEPID: Data record contains an invalid EPID
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_consume.c | 12 +++++++++---
>   libdtrace/dt_error.c   |  4 +++-
>   libdtrace/dt_impl.h    |  4 +++-
>   3 files changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> index 497fdd27..46b03641 100644
> --- a/libdtrace/dt_consume.c
> +++ b/libdtrace/dt_consume.c
> @@ -1950,14 +1950,18 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
>   		 * and 'data' points to the 'size' member at this point.
>   		 * (Note that 'n' may be 0.)
>   		 */
> -		if (ptr > buf + hdr->size)
> +		if (ptr > buf + hdr->size) {
> +			dt_set_errno(dtp, EDT_DSIZE);
>   			return DTRACE_WORKSTATUS_ERROR;
> +		}

Instead of adding the braces and using "dt_set_errno()/return 
DTRACE_WORKSTATUS_ERROR", just use "return dt_set_errno()".  That way, 
you conform to current (and continuing) practice within this function.  
That is, all other dt_set_errno() sites within this function use the 
"return dt_set_errno()" expression.  I realize the two expressions do 
the same thing, but the pre-existing practice is more compact and 
uniformity of practice throughout the function would be good.

>   		size = *(uint32_t *)data;
>   		data += sizeof(size);
>   		ptr += sizeof(size) + size;
> -		if (ptr != buf + hdr->size)
> +		if (ptr != buf + hdr->size) {
> +			dt_set_errno(dtp, EDT_DSIZE);
>   			return DTRACE_WORKSTATUS_ERROR;
> +		}

Ditto.

>   
>   		data += sizeof(uint32_t);		/* skip padding */
>   		size -= sizeof(uint32_t);
> @@ -1976,8 +1980,10 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
>   
>   		rval = dt_epid_lookup(dtp, epid, &pdat->dtpda_ddesc,
>   						 &pdat->dtpda_pdesc);
> -		if (rval != 0)
> +		if (rval != 0) {
> +			dt_set_errno(dtp, EDT_BADEPID);
>   			return DTRACE_WORKSTATUS_ERROR;
> +		}

Ditto.

>   		if (flow)
>   			dt_flowindent(dtp, pdat, *last, DTRACE_EPIDNONE);
> diff --git a/libdtrace/dt_error.c b/libdtrace/dt_error.c
> index b2688402..6276d52c 100644
> --- a/libdtrace/dt_error.c
> +++ b/libdtrace/dt_error.c
> @@ -1,6 +1,6 @@
>   /*
>    * Oracle Linux DTrace.
> - * Copyright (c) 2009, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved.
>    * Licensed under the Universal Permissive License v 1.0 as shown at
>    * http://oss.oracle.com/licenses/upl.
>    */
> @@ -52,6 +52,8 @@ static const struct {
>   	{ EDT_DMISMATCH, "Data record list does not match statement" },
>   	{ EDT_DOFFSET,	"Data record offset exceeds buffer boundary" },
>   	{ EDT_DALIGN,	"Data record has inappropriate alignment" },
> +	{ EDT_DSIZE,	"Data record has incorrect size" },
> +	{ EDT_BADEPID,	"Invalid EPID" },
>   	{ EDT_BADOPTNAME, "Invalid option name" },
>   	{ EDT_BADOPTVAL, "Invalid value for specified option" },
>   	{ EDT_BADOPTCTX, "Option cannot be used from within a D program" },
> diff --git a/libdtrace/dt_impl.h b/libdtrace/dt_impl.h
> index 4548a11d..0cc4bfab 100644
> --- a/libdtrace/dt_impl.h
> +++ b/libdtrace/dt_impl.h
> @@ -1,6 +1,6 @@
>   /*
>    * Oracle Linux DTrace.
> - * Copyright (c) 2010, 2020, Oracle and/or its affiliates. All rights reserved.
> + * Copyright (c) 2010, 2021, Oracle and/or its affiliates. All rights reserved.
>    * Licensed under the Universal Permissive License v 1.0 as shown at
>    * http://oss.oracle.com/licenses/upl.
>    */
> @@ -585,6 +585,8 @@ enum {
>   	EDT_DMISMATCH,		/* record list does not match statement */
>   	EDT_DOFFSET,		/* record data offset error */
>   	EDT_DALIGN,		/* record data alignment error */
> +	EDT_DSIZE,		/* record data size error */
> +	EDT_BADEPID,		/* bad enabled probe id */

bad
->
invalid
(to be consistent with both the ensuing comments and, more importantly, 
the actual string)

>   	EDT_BADOPTNAME,		/* invalid dtrace_setopt option name */
>   	EDT_BADOPTVAL,		/* invalid dtrace_setopt option value */
>   	EDT_BADOPTCTX,		/* invalid dtrace_setopt option context */

Reviewed-by: Eugene Loh <eugene.loh at oracle.com>



More information about the DTrace-devel mailing list