diff mbox series

[BlueZ,v1] shared/gatt-client:Ignore orphaned characteristics

Message ID 20200501144037.1684-1-alainm@chromium.org (mailing list archive)
State Superseded
Headers show
Series [BlueZ,v1] shared/gatt-client:Ignore orphaned characteristics | expand

Commit Message

Alain Michaud May 1, 2020, 2:40 p.m. UTC
The gatt discovery proceedure simplification to discover all
characteristics at once has exposed a device side issue where some
device implementation reports orphaned characteristics.  While this
technically shouldn't be allowed, some instances of this were observed
(namely on some Android phones).

The fix is to simply skip over orphaned characteristics and continue
with everything else that is valid.

This has been tested as part of the Android CTS tests against an
affected platform and was confirmed to have worked around the issue.
---

 src/shared/gatt-client.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

Comments

Marcel Holtmann May 1, 2020, 4:26 p.m. UTC | #1
Hi Alain,

> The gatt discovery proceedure simplification to discover all
> characteristics at once has exposed a device side issue where some
> device implementation reports orphaned characteristics.  While this
> technically shouldn't be allowed, some instances of this were observed
> (namely on some Android phones).
> 
> The fix is to simply skip over orphaned characteristics and continue
> with everything else that is valid.
> 
> This has been tested as part of the Android CTS tests against an
> affected platform and was confirmed to have worked around the issue.
> ---
> 
> src/shared/gatt-client.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
> index 963ad619f..d604c77a3 100644
> --- a/src/shared/gatt-client.c
> +++ b/src/shared/gatt-client.c
> @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
> 			util_debug(client->debug_callback, client->debug_data,
> 				"Failed to insert characteristic at 0x%04x",
> 				chrc_data->value_handle);
> -			goto failed;
> +
> +			/* Skip over invalid characteristic */
> +			free(chrc_data);
> +			continue;
> 		}

should we add a warning here?

And I think it would be good to have a bit more verbose comment why this is done this way instead of aborting.

Regards

Marcel
Alain Michaud May 1, 2020, 5:17 p.m. UTC | #2
Hi Marcel,


On Fri, May 1, 2020 at 12:26 PM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Alain,
>
> > The gatt discovery proceedure simplification to discover all
> > characteristics at once has exposed a device side issue where some
> > device implementation reports orphaned characteristics.  While this
> > technically shouldn't be allowed, some instances of this were observed
> > (namely on some Android phones).
> >
> > The fix is to simply skip over orphaned characteristics and continue
> > with everything else that is valid.
> >
> > This has been tested as part of the Android CTS tests against an
> > affected platform and was confirmed to have worked around the issue.
> > ---
> >
> > src/shared/gatt-client.c | 5 ++++-
> > 1 file changed, 4 insertions(+), 1 deletion(-)
> >
> > diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
> > index 963ad619f..d604c77a3 100644
> > --- a/src/shared/gatt-client.c
> > +++ b/src/shared/gatt-client.c
> > @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
> >                       util_debug(client->debug_callback, client->debug_data,
> >                               "Failed to insert characteristic at 0x%04x",
> >                               chrc_data->value_handle);
> > -                     goto failed;
> > +
> > +                     /* Skip over invalid characteristic */
> > +                     free(chrc_data);
> > +                     continue;
> >               }
>
> should we add a warning here?
Is there a good way other than the util_debug mechanism to write  a warning?

>
> And I think it would be good to have a bit more verbose comment why this is done this way instead of aborting.
Ack, will be added in V2.

>
> Regards
>
> Marcel
>
Marcel Holtmann May 1, 2020, 5:32 p.m. UTC | #3
Hi Alain,

>>> The gatt discovery proceedure simplification to discover all
>>> characteristics at once has exposed a device side issue where some
>>> device implementation reports orphaned characteristics.  While this
>>> technically shouldn't be allowed, some instances of this were observed
>>> (namely on some Android phones).
>>> 
>>> The fix is to simply skip over orphaned characteristics and continue
>>> with everything else that is valid.
>>> 
>>> This has been tested as part of the Android CTS tests against an
>>> affected platform and was confirmed to have worked around the issue.
>>> ---
>>> 
>>> src/shared/gatt-client.c | 5 ++++-
>>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>> 
>>> diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
>>> index 963ad619f..d604c77a3 100644
>>> --- a/src/shared/gatt-client.c
>>> +++ b/src/shared/gatt-client.c
>>> @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
>>>                      util_debug(client->debug_callback, client->debug_data,
>>>                              "Failed to insert characteristic at 0x%04x",
>>>                              chrc_data->value_handle);
>>> -                     goto failed;
>>> +
>>> +                     /* Skip over invalid characteristic */
>>> +                     free(chrc_data);
>>> +                     continue;
>>>              }
>> 
>> should we add a warning here?
> Is there a good way other than the util_debug mechanism to write  a warning?

you could just use btd_warn() here. If this gets too noisy, we either remove it later or we introduce a btd_warn_ratelimited() or btd_warn_once().

Regards

Marcel
Alain Michaud May 1, 2020, 5:40 p.m. UTC | #4
On Fri, May 1, 2020 at 1:32 PM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Alain,
>
> >>> The gatt discovery proceedure simplification to discover all
> >>> characteristics at once has exposed a device side issue where some
> >>> device implementation reports orphaned characteristics.  While this
> >>> technically shouldn't be allowed, some instances of this were observed
> >>> (namely on some Android phones).
> >>>
> >>> The fix is to simply skip over orphaned characteristics and continue
> >>> with everything else that is valid.
> >>>
> >>> This has been tested as part of the Android CTS tests against an
> >>> affected platform and was confirmed to have worked around the issue.
> >>> ---
> >>>
> >>> src/shared/gatt-client.c | 5 ++++-
> >>> 1 file changed, 4 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
> >>> index 963ad619f..d604c77a3 100644
> >>> --- a/src/shared/gatt-client.c
> >>> +++ b/src/shared/gatt-client.c
> >>> @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
> >>>                      util_debug(client->debug_callback, client->debug_data,
> >>>                              "Failed to insert characteristic at 0x%04x",
> >>>                              chrc_data->value_handle);
> >>> -                     goto failed;
> >>> +
> >>> +                     /* Skip over invalid characteristic */
> >>> +                     free(chrc_data);
> >>> +                     continue;
> >>>              }
> >>
> >> should we add a warning here?
> > Is there a good way other than the util_debug mechanism to write  a warning?
>
> you could just use btd_warn() here. If this gets too noisy, we either remove it later or we introduce a btd_warn_ratelimited() or btd_warn_once().
This being under src/shared, I wasn't sure if that was acceptable to
add a btd dependency here, especially with the work to avoid it via
the util_debug.  Happy to do either way, just want to make sure the
guidance is clear.

>
> Regards
>
> Marcel
>
Marcel Holtmann May 1, 2020, 6 p.m. UTC | #5
Hi Alain,

>>>>> The gatt discovery proceedure simplification to discover all
>>>>> characteristics at once has exposed a device side issue where some
>>>>> device implementation reports orphaned characteristics.  While this
>>>>> technically shouldn't be allowed, some instances of this were observed
>>>>> (namely on some Android phones).
>>>>> 
>>>>> The fix is to simply skip over orphaned characteristics and continue
>>>>> with everything else that is valid.
>>>>> 
>>>>> This has been tested as part of the Android CTS tests against an
>>>>> affected platform and was confirmed to have worked around the issue.
>>>>> ---
>>>>> 
>>>>> src/shared/gatt-client.c | 5 ++++-
>>>>> 1 file changed, 4 insertions(+), 1 deletion(-)
>>>>> 
>>>>> diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
>>>>> index 963ad619f..d604c77a3 100644
>>>>> --- a/src/shared/gatt-client.c
>>>>> +++ b/src/shared/gatt-client.c
>>>>> @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
>>>>>                     util_debug(client->debug_callback, client->debug_data,
>>>>>                             "Failed to insert characteristic at 0x%04x",
>>>>>                             chrc_data->value_handle);
>>>>> -                     goto failed;
>>>>> +
>>>>> +                     /* Skip over invalid characteristic */
>>>>> +                     free(chrc_data);
>>>>> +                     continue;
>>>>>             }
>>>> 
>>>> should we add a warning here?
>>> Is there a good way other than the util_debug mechanism to write  a warning?
>> 
>> you could just use btd_warn() here. If this gets too noisy, we either remove it later or we introduce a btd_warn_ratelimited() or btd_warn_once().
> This being under src/shared, I wasn't sure if that was acceptable to
> add a btd dependency here, especially with the work to avoid it via
> the util_debug.  Happy to do either way, just want to make sure the
> guidance is clear.

good point. My bad. You better leave the logging out then.

Regards

Marcel
Luiz Augusto von Dentz May 2, 2020, 6:24 a.m. UTC | #6
Hi Marcel, Alain,

On Fri, May 1, 2020 at 11:04 AM Marcel Holtmann <marcel@holtmann.org> wrote:
>
> Hi Alain,
>
> >>>>> The gatt discovery proceedure simplification to discover all
> >>>>> characteristics at once has exposed a device side issue where some
> >>>>> device implementation reports orphaned characteristics.  While this
> >>>>> technically shouldn't be allowed, some instances of this were observed
> >>>>> (namely on some Android phones).
> >>>>>
> >>>>> The fix is to simply skip over orphaned characteristics and continue
> >>>>> with everything else that is valid.
> >>>>>
> >>>>> This has been tested as part of the Android CTS tests against an
> >>>>> affected platform and was confirmed to have worked around the issue.
> >>>>> ---
> >>>>>
> >>>>> src/shared/gatt-client.c | 5 ++++-
> >>>>> 1 file changed, 4 insertions(+), 1 deletion(-)
> >>>>>
> >>>>> diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
> >>>>> index 963ad619f..d604c77a3 100644
> >>>>> --- a/src/shared/gatt-client.c
> >>>>> +++ b/src/shared/gatt-client.c
> >>>>> @@ -632,7 +632,10 @@ static bool discover_descs(struct discovery_op *op, bool *discovering)
> >>>>>                     util_debug(client->debug_callback, client->debug_data,
> >>>>>                             "Failed to insert characteristic at 0x%04x",
> >>>>>                             chrc_data->value_handle);
> >>>>> -                     goto failed;
> >>>>> +
> >>>>> +                     /* Skip over invalid characteristic */
> >>>>> +                     free(chrc_data);
> >>>>> +                     continue;
> >>>>>             }
> >>>>
> >>>> should we add a warning here?
> >>> Is there a good way other than the util_debug mechanism to write  a warning?
> >>
> >> you could just use btd_warn() here. If this gets too noisy, we either remove it later or we introduce a btd_warn_ratelimited() or btd_warn_once().
> > This being under src/shared, I wasn't sure if that was acceptable to
> > add a btd dependency here, especially with the work to avoid it via
> > the util_debug.  Happy to do either way, just want to make sure the
> > guidance is clear.
>
> good point. My bad. You better leave the logging out then.

There is already some logging a little bit before so I guess we are
covered here.
diff mbox series

Patch

diff --git a/src/shared/gatt-client.c b/src/shared/gatt-client.c
index 963ad619f..d604c77a3 100644
--- a/src/shared/gatt-client.c
+++ b/src/shared/gatt-client.c
@@ -632,7 +632,10 @@  static bool discover_descs(struct discovery_op *op, bool *discovering)
 			util_debug(client->debug_callback, client->debug_data,
 				"Failed to insert characteristic at 0x%04x",
 				chrc_data->value_handle);
-			goto failed;
+
+			/* Skip over invalid characteristic */
+			free(chrc_data);
+			continue;
 		}
 
 		if (gatt_db_attribute_get_handle(attr) !=