Re: [PATCH 7/9] Read temperature type characteristic

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

 



Hi Santiago,

On Wed, Sep 28, 2011 at 1:48 PM, Santiago Carot-Nemesio
<sancane@xxxxxxxxx> wrote:
> +static gchar* temptype2str(uint8_t value)

Small conding style issue here: gchar*  -> gchar *

> +{
> +       switch (value) {
> +       case 1: return "Armpit";
> +       case 2: return "Body";
> +       case 3: return "Ear";
> +       case 4: return "Finger";
> +       case 5: return "Intestines";
> +       case 6: return "Mouth";
> +       case 7: return "Rectum";
> +       case 8: return "Toe";
> +       case 9: return "Tympanum";
> +       default:
> +               error("Temperature type %d reserved for future use", value);
> +               return NULL;
> +       };
> +}
> +
>  static void destroy_char(gpointer user_data)
>  {
>        struct characteristic *c = user_data;
> @@ -113,7 +138,27 @@ static void discover_desc_cb(guint8 status, const guint8 *pdu, guint16 len,
>  static void read_temp_type_cb(guint8 status, const guint8 *pdu, guint16 len,
>                                                        gpointer user_data)
>  {
> -       /* TODO */
> +       struct characteristic *ch = user_data;
> +       struct thermometer *t = ch->t;
> +       uint8_t value;
> +       int vlen;
> +
> +       if (status != 0) {
> +               DBG("Temperature Type value read failed: %s",
> +                                                       att_ecode2str(status));
> +               return;
> +       }
> +
> +       if (!dec_read_resp(pdu, len, &value, &vlen)) {

Your code is assuming that the read response PDU will always have a
one-byte value. This will cause memory corruption if the peer sends an
error response with size greater than 2 (first byte is the opcode).

Either put a check like "if (len == sizeof(uint8_t) + 1 &&
read_read_resp(...))", or use:

uint8_t value[ATT_MAX_MTU];

and cast the first byte.

(just noticed that Proximity monitor code has the same bug...)

> +               DBG("Protocol error");
> +               return;
> +       }
> +
> +       DBG("TEMPERATURE TYPE: %s", temptype2str(value));

Can you avoid using all-caps on the DBG() message above?

> +       if (!t->has_interval)
> +               t->has_interval = TRUE;

Why the if() check? You could just do "t->has_interval = TRUE;" always.

> +
> +       t->type = value;
>  }

Regards,
-- 
Anderson Lizardo
Instituto Nokia de Tecnologia - INdT
Manaus - Brazil
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux