Re: [PATCH 1/5] yamltree: Remove marker ordering dependency

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On Tue, May 25, 2021 at 08:03:31PM -0500, Rob Herring wrote:
> The check for phandle markers is fragile because the phandle marker must
> be after a type marker. The only guarantee for markers is they are in
> offset order. The order at a specific offset is undefined.
> 
> Rework yaml_propval_int() to get the full marker list, so it can find a
> phandle marker no matter the ordering.
> 
> Signed-off-by: Rob Herring <robh@xxxxxxxxxx>

Frankly, I think the difference in data models is enough that yaml
output will *always* be fragile, but this helps somewhat so I've
applied it.

> ---
>  yamltree.c | 16 +++++++++-------
>  1 file changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/yamltree.c b/yamltree.c
> index e63d32fe142a..55908c829c98 100644
> --- a/yamltree.c
> +++ b/yamltree.c
> @@ -29,11 +29,12 @@ char *yaml_error_name[] = {
>  		    (emitter)->problem, __func__, __LINE__);		\
>  })
>  
> -static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, char *data, unsigned int len, int width)
> +static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers,
> +	char *data, unsigned int seq_offset, unsigned int len, int width)
>  {
>  	yaml_event_t event;
>  	void *tag;
> -	unsigned int off, start_offset = markers->offset;
> +	unsigned int off;
>  
>  	switch(width) {
>  		case 1: tag = "!u8"; break;
> @@ -66,7 +67,7 @@ static void yaml_propval_int(yaml_emitter_t *emitter, struct marker *markers, ch
>  			m = markers;
>  			is_phandle = false;
>  			for_each_marker_of_type(m, REF_PHANDLE) {
> -				if (m->offset == (start_offset + off)) {
> +				if (m->offset == (seq_offset + off)) {
>  					is_phandle = true;
>  					break;
>  				}
> @@ -114,6 +115,7 @@ static void yaml_propval(yaml_emitter_t *emitter, struct property *prop)
>  	yaml_event_t event;
>  	unsigned int len = prop->val.len;
>  	struct marker *m = prop->val.markers;
> +	struct marker *markers = prop->val.markers;
>  
>  	/* Emit the property name */
>  	yaml_scalar_event_initialize(&event, NULL,
> @@ -151,19 +153,19 @@ static void yaml_propval(yaml_emitter_t *emitter, struct property *prop)
>  
>  		switch(m->type) {
>  		case TYPE_UINT16:
> -			yaml_propval_int(emitter, m, data, chunk_len, 2);
> +			yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 2);
>  			break;
>  		case TYPE_UINT32:
> -			yaml_propval_int(emitter, m, data, chunk_len, 4);
> +			yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 4);
>  			break;
>  		case TYPE_UINT64:
> -			yaml_propval_int(emitter, m, data, chunk_len, 8);
> +			yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 8);
>  			break;
>  		case TYPE_STRING:
>  			yaml_propval_string(emitter, data, chunk_len);
>  			break;
>  		default:
> -			yaml_propval_int(emitter, m, data, chunk_len, 1);
> +			yaml_propval_int(emitter, markers, data, m->offset, chunk_len, 1);
>  			break;
>  		}
>  	}

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Device Tree]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux