RE: [bug report] extcon: add Realtek DHC RTD SoC Type-C driver

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

 



Hi Dan,

I have fixed this issue.
https://lore.kernel.org/lkml/20231016053510.28881-1-stanley_chang@xxxxxxxxxxx/

Thanks,
Stanley

> -----Original Message-----
> From: Dan Carpenter <dan.carpenter@xxxxxxxxxx>
> Sent: Tuesday, October 10, 2023 5:27 PM
> To: Stanley Chang[昌育德] <stanley_chang@xxxxxxxxxxx>
> Cc: kernel-janitors@xxxxxxxxxxxxxxx
> Subject: [bug report] extcon: add Realtek DHC RTD SoC Type-C driver
> 
> 
> External mail.
> 
> 
> 
> Hello Stanley Chang,
> 
> The patch 8a590d7371f0: "extcon: add Realtek DHC RTD SoC Type-C driver"
> from Sep 4, 2023 (linux-next), leads to the following Smatch static checker
> warning:
> 
>         drivers/extcon/extcon-rtk-type-c.c:905
> __updated_type_c_parameter_by_efuse()
>         error: 'buf' dereferencing possible ERR_PTR()
> 
> drivers/extcon/extcon-rtk-type-c.c
>     873 static int __updated_type_c_parameter_by_efuse(struct type_c_data
> *type_c)
>     874 {
>     875         struct type_c_cfg *type_c_cfg = type_c->type_c_cfg;
>     876         struct cc_param *cc_param;
>     877         struct nvmem_cell *cell;
>     878         s8 cc1_4p7k = 0;
>     879         s8 cc1_12k = 0;
>     880         s8 cc1_0p2v = 0;
>     881         s8 cc1_0p8v = 0;
>     882         s8 cc1_2p6v = 0;
>     883         s8 cc1_0p66v = 0;
>     884         s8 cc1_1p23v = 0;
>     885         s8 cc2_4p7k = 0;
>     886         s8 cc2_12k = 0;
>     887         s8 cc2_0p2v = 0;
>     888         s8 cc2_0p8v = 0;
>     889         s8 cc2_2p6v = 0;
>     890         s8 cc2_0p66v = 0;
>     891         s8 cc2_1p23v = 0;
>     892
>     893         cell = nvmem_cell_get(type_c->dev, "usb-cal");
>     894         if (IS_ERR(cell)) {
>     895                 dev_warn(type_c->dev, "%s failed to get usb-cal:
> %ld\n",
>     896                          __func__, PTR_ERR(cell));
>     897         } else {
>     898                 unsigned char *buf;
>     899                 size_t buf_size;
>     900                 int value_size = 4;
>     901                 int value_mask = (BIT(value_size) - 1);
>     902
>     903                 buf = nvmem_cell_read(cell, &buf_size);
>                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 
> This does a variable size allocation.  Not sure how large.  But allocations
> need to be checked for failure.
> 
>     904
> --> 905                 cc1_0p2v = get_value((buf[0] >> value_size * 0) &
> value_mask);
>                                               ^^^^^^ Or it leads to
> a crash.
> 
>     906                 cc1_0p8v = get_value((buf[0] >> value_size * 1)
> & value_mask);
>     907                 cc1_2p6v = get_value((buf[1] >> value_size * 0)
> & value_mask);
>     908                 cc1_0p66v = get_value((buf[1] >> value_size * 1)
> & value_mask);
>     909                 cc1_1p23v = get_value((buf[2] >> value_size * 0)
> & value_mask);
>     910
>     911                 cc2_0p2v = get_value((buf[3] >> value_size * 0)
> & value_mask);
>     912                 cc2_0p8v = get_value((buf[3] >> value_size * 1)
> & value_mask);
>     913                 cc2_2p6v = get_value((buf[4] >> value_size * 0)
> & value_mask);
>     914                 cc2_0p66v = get_value((buf[4] >> value_size * 1)
> & value_mask);
>     915                 cc2_1p23v = get_value((buf[5] >> value_size * 0)
> & value_mask);
>     916
>     917                 cc1_4p7k = get_value((buf[6] >> value_size * 0)
> & value_mask);
>     918                 cc1_12k = get_value((buf[6] >> value_size * 1) &
> value_mask);
>     919                 cc2_4p7k = get_value((buf[7] >> value_size * 0)
> & value_mask);
>     920                 cc2_12k = get_value((buf[7] >> value_size * 1) &
> value_mask);
>     921
>     922                 kfree(buf);
>     923                 nvmem_cell_put(cell);
>     924         }
>     925
>     926         dev_dbg(type_c->dev, "check efuse cc1_4p7k=%d
> cc1_12k=%d cc2_4p7k=%d cc2_12k=%d\n",
>     927                 cc1_4p7k, cc1_12k, cc2_4p7k, cc2_12k);
>     928         dev_dbg(type_c->dev, "check efuse cc1_0p2v=%d
> cc1_0p8v=%d cc1_2p6v=%d cc1_0p66v=%d cc1_1p23v=%d\n",
>     929                 cc1_0p2v, cc1_0p8v, cc1_2p6v, cc1_0p66v,
> cc1_1p23v);
>     930         dev_dbg(type_c->dev, "check efuse cc2_0p2v=%d
> cc2_0p8v=%d cc2_2p6v=%d cc2_0p66v=%d cc2_1p23v=%d\n",
>     931                 cc2_0p2v, cc2_0p8v, cc2_2p6v, cc2_0p66v,
> cc2_1p23v);
>     932
>     933         cc_param = &type_c_cfg->cc1_param;
>     934         cc_param->rp_4p7k_code = cc_param->rp_4p7k_code +
> cc1_4p7k;
>     935         cc_param->rp_12k_code = cc_param->rp_12k_code +
> cc1_12k;
>     936
>     937         cc_param->vref_1p23v = cc_param->vref_1p23v +
> cc1_1p23v;
>     938         cc_param->vref_0p66v = cc_param->vref_0p66v +
> cc1_0p66v;
>     939         cc_param->vref_2p6v = cc_param->vref_2p6v + cc1_2p6v;
>     940         cc_param->vref_0p8v = cc_param->vref_0p8v + cc1_0p8v;
>     941         cc_param->vref_0p2v = cc_param->vref_0p2v + cc1_0p2v;
>     942
>     943         cc_param = &type_c_cfg->cc2_param;
>     944         cc_param->rp_4p7k_code = cc_param->rp_4p7k_code +
> cc2_4p7k;
>     945         cc_param->rp_12k_code = cc_param->rp_12k_code +
> cc2_12k;
>     946
>     947         cc_param->vref_1p23v = cc_param->vref_1p23v +
> cc2_1p23v;
>     948         cc_param->vref_0p66v = cc_param->vref_0p66v +
> cc2_0p66v;
>     949         cc_param->vref_2p6v = cc_param->vref_2p6v + cc2_2p6v;
>     950         cc_param->vref_0p8v = cc_param->vref_0p8v + cc2_0p8v;
>     951         cc_param->vref_0p2v = cc_param->vref_0p2v + cc2_0p2v;
>     952
>     953         return 0;
>     954 }
> 
> regards,
> dan carpenter




[Index of Archives]     [Kernel Development]     [Kernel Announce]     [Kernel Newbies]     [Linux Networking Development]     [Share Photos]     [IDE]     [Security]     [Git]     [Netfilter]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Device Mapper]

  Powered by Linux