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

David Gibson
2021-06-08T01:54:33Z

[-- Attachment #1: Type: text/plain, Size: 3211 bytes --]

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-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>

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 #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]