[bug report] media: tuners: fix error return code of hybrid_tuner_request_state()

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

 



Hello Jia-Ju Bai,

The patch b9302fa7ed97: "media: tuners: fix error return code of
hybrid_tuner_request_state()" from Mar 6, 2021, leads to the
following static checker warnings:

drivers/media/tuners/tuner-simple.c:1112 simple_tuner_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/mxl5007t.c:885 mxl5007t_attach() error: potential null dereference 'state'.  (<unknown> returns null)
drivers/media/tuners/tda18271-fe.c:1311 tda18271_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/xc4000.c:1685 xc4000_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/xc4000.c:1699 xc4000_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/xc5000.c:1397 xc5000_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/r820t.c:2350 r820t_attach() error: potential null dereference 'priv'.  (<unknown> returns null)
drivers/media/tuners/tuner-xc2028.c:1500 xc2028_attach() error: potential null dereference 'priv'.  (<unknown> returns null)

drivers/media/tuners/tuner-i2c.h
   109  /* The return value of hybrid_tuner_request_state indicates the number of
   110   * instances using this tuner object.
   111   *
   112   * 0 - no instances, indicates an error - kzalloc must have failed

The comment says that hybrid_tuner_request_state() returns an error.

   113   *
   114   * 1 - one instance, indicates that the tuner object was created successfully
   115   *
   116   * 2 (or more) instances, indicates that an existing tuner object was found
   117   */
   118  
   119  #define hybrid_tuner_request_state(type, state, list, i2cadap, i2caddr, devname)\
   120  ({                                                                      \
   121          int __ret = 0;                                                  \
   122          list_for_each_entry(state, &list, hybrid_tuner_instance_list) { \
   123                  if (((i2cadap) && (state->i2c_props.adap)) &&           \
   124                      ((i2c_adapter_id(state->i2c_props.adap) ==          \
   125                        i2c_adapter_id(i2cadap)) &&                       \
   126                       (i2caddr == state->i2c_props.addr))) {             \
   127                          __tuner_info(state->i2c_props,                  \
   128                                       "attaching existing instance\n");  \
   129                          state->i2c_props.count++;                       \
   130                          __ret = state->i2c_props.count;                 \
   131                          break;                                          \
   132                  }                                                       \
   133          }                                                               \
   134          if (0 == __ret) {                                               \
   135                  state = kzalloc(sizeof(type), GFP_KERNEL);              \
   136                  if (!state) {                                           \
   137                          __ret = -ENOMEM;                                \
   138                          goto __fail;                                    \

But the patch changes the code to return -ENOMEM on error.  The callers
need to be updated or it intruces a bunch of potential NULL
dereferences.

   139                  }                                                       \
   140                  state->i2c_props.addr = i2caddr;                        \
   141                  state->i2c_props.adap = i2cadap;                        \
   142                  state->i2c_props.name = devname;                        \
   143                  __tuner_info(state->i2c_props,                          \
   144                               "creating new instance\n");                \
   145                  list_add_tail(&state->hybrid_tuner_instance_list, &list);\
   146                  state->i2c_props.count++;                               \
   147                  __ret = state->i2c_props.count;                         \
   148          }                                                               \
   149  __fail:                                                                 \
   150          __ret;                                                          \
   151  })

regards,
dan carpenter



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux