Commit 0e5a117441ce245b87949cc7713627a293f37227
Committed by
David S. Miller
1 parent
71a8638480
Exists in
master
and in
4 other branches
caif: Bugfix add check NULL pointer before calling functions.
Add check on layer->dn != NULL before calling functions in layer below. Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Showing 1 changed file with 26 additions and 9 deletions Side-by-side Diff
net/caif/cfctrl.c
... | ... | @@ -178,20 +178,23 @@ |
178 | 178 | void cfctrl_enum_req(struct cflayer *layer, u8 physlinkid) |
179 | 179 | { |
180 | 180 | struct cfctrl *cfctrl = container_obj(layer); |
181 | - int ret; | |
182 | 181 | struct cfpkt *pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN); |
182 | + struct cflayer *dn = cfctrl->serv.layer.dn; | |
183 | 183 | if (!pkt) { |
184 | 184 | pr_warn("Out of memory\n"); |
185 | 185 | return; |
186 | 186 | } |
187 | + if (!dn) { | |
188 | + pr_debug("not able to send enum request\n"); | |
189 | + return; | |
190 | + } | |
187 | 191 | caif_assert(offsetof(struct cfctrl, serv.layer) == 0); |
188 | 192 | init_info(cfpkt_info(pkt), cfctrl); |
189 | 193 | cfpkt_info(pkt)->dev_info->id = physlinkid; |
190 | 194 | cfctrl->serv.dev_info.id = physlinkid; |
191 | 195 | cfpkt_addbdy(pkt, CFCTRL_CMD_ENUM); |
192 | 196 | cfpkt_addbdy(pkt, physlinkid); |
193 | - ret = | |
194 | - cfctrl->serv.layer.dn->transmit(cfctrl->serv.layer.dn, pkt); | |
197 | + dn->transmit(dn, pkt); | |
195 | 198 | } |
196 | 199 | |
197 | 200 | int cfctrl_linkup_request(struct cflayer *layer, |
198 | 201 | |
... | ... | @@ -206,7 +209,13 @@ |
206 | 209 | int ret; |
207 | 210 | char utility_name[16]; |
208 | 211 | struct cfpkt *pkt; |
212 | + struct cflayer *dn = cfctrl->serv.layer.dn; | |
209 | 213 | |
214 | + if (!dn) { | |
215 | + pr_debug("not able to send linkup request\n"); | |
216 | + return -ENODEV; | |
217 | + } | |
218 | + | |
210 | 219 | if (cfctrl_cancel_req(layer, user_layer) > 0) { |
211 | 220 | /* Slight Paranoia, check if already connecting */ |
212 | 221 | pr_err("Duplicate connect request for same client\n"); |
... | ... | @@ -282,7 +291,7 @@ |
282 | 291 | */ |
283 | 292 | cfpkt_info(pkt)->dev_info->id = param->phyid; |
284 | 293 | ret = |
285 | - cfctrl->serv.layer.dn->transmit(cfctrl->serv.layer.dn, pkt); | |
294 | + dn->transmit(dn, pkt); | |
286 | 295 | if (ret < 0) { |
287 | 296 | int count; |
288 | 297 | |
289 | 298 | |
290 | 299 | |
... | ... | @@ -301,15 +310,23 @@ |
301 | 310 | int ret; |
302 | 311 | struct cfctrl *cfctrl = container_obj(layer); |
303 | 312 | struct cfpkt *pkt = cfpkt_create(CFPKT_CTRL_PKT_LEN); |
313 | + struct cflayer *dn = cfctrl->serv.layer.dn; | |
314 | + | |
304 | 315 | if (!pkt) { |
305 | 316 | pr_warn("Out of memory\n"); |
306 | 317 | return -ENOMEM; |
307 | 318 | } |
319 | + | |
320 | + if (!dn) { | |
321 | + pr_debug("not able to send link-down request\n"); | |
322 | + return -ENODEV; | |
323 | + } | |
324 | + | |
308 | 325 | cfpkt_addbdy(pkt, CFCTRL_CMD_LINK_DESTROY); |
309 | 326 | cfpkt_addbdy(pkt, channelid); |
310 | 327 | init_info(cfpkt_info(pkt), cfctrl); |
311 | 328 | ret = |
312 | - cfctrl->serv.layer.dn->transmit(cfctrl->serv.layer.dn, pkt); | |
329 | + dn->transmit(dn, pkt); | |
313 | 330 | #ifndef CAIF_NO_LOOP |
314 | 331 | cfctrl->loop_linkused[channelid] = 0; |
315 | 332 | #endif |
... | ... | @@ -477,7 +494,7 @@ |
477 | 494 | cfpkt_extr_head(pkt, ¶m, len); |
478 | 495 | break; |
479 | 496 | default: |
480 | - pr_warn("Request setup - invalid link type (%d)\n", | |
497 | + pr_warn("Request setup, invalid type (%d)\n", | |
481 | 498 | serv); |
482 | 499 | goto error; |
483 | 500 | } |
... | ... | @@ -489,7 +506,8 @@ |
489 | 506 | |
490 | 507 | if (CFCTRL_ERR_BIT == (CFCTRL_ERR_BIT & cmdrsp) || |
491 | 508 | cfpkt_erroneous(pkt)) { |
492 | - pr_err("Invalid O/E bit or parse error on CAIF control channel\n"); | |
509 | + pr_err("Invalid O/E bit or parse error " | |
510 | + "on CAIF control channel\n"); | |
493 | 511 | cfctrl->res.reject_rsp(cfctrl->serv.layer.up, |
494 | 512 | 0, |
495 | 513 | req ? req->client_layer |
496 | 514 | |
... | ... | @@ -550,9 +568,8 @@ |
550 | 568 | case _CAIF_CTRLCMD_PHYIF_FLOW_OFF_IND: |
551 | 569 | case CAIF_CTRLCMD_FLOW_OFF_IND: |
552 | 570 | spin_lock_bh(&this->info_list_lock); |
553 | - if (!list_empty(&this->list)) { | |
571 | + if (!list_empty(&this->list)) | |
554 | 572 | pr_debug("Received flow off in control layer\n"); |
555 | - } | |
556 | 573 | spin_unlock_bh(&this->info_list_lock); |
557 | 574 | break; |
558 | 575 | case _CAIF_CTRLCMD_PHYIF_DOWN_IND: { |