hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/char/ipmi/ipmi_msghandler.c
....@@ -1284,6 +1284,7 @@
12841284 unsigned long flags;
12851285 struct cmd_rcvr *rcvr;
12861286 struct cmd_rcvr *rcvrs = NULL;
1287
+ struct module *owner;
12871288
12881289 if (!acquire_ipmi_user(user, &i)) {
12891290 /*
....@@ -1345,8 +1346,9 @@
13451346 kfree(rcvr);
13461347 }
13471348
1349
+ owner = intf->owner;
13481350 kref_put(&intf->refcount, intf_free);
1349
- module_put(intf->owner);
1351
+ module_put(owner);
13501352 }
13511353
13521354 int ipmi_destroy_user(struct ipmi_user *user)
....@@ -3540,12 +3542,16 @@
35403542 struct ipmi_smi_msg *msg,
35413543 unsigned char err)
35423544 {
3545
+ int rv;
35433546 msg->rsp[0] = msg->data[0] | 4;
35443547 msg->rsp[1] = msg->data[1];
35453548 msg->rsp[2] = err;
35463549 msg->rsp_size = 3;
3547
- /* It's an error, so it will never requeue, no need to check return. */
3548
- handle_one_recv_msg(intf, msg);
3550
+
3551
+ /* This will never requeue, but it may ask us to free the message. */
3552
+ rv = handle_one_recv_msg(intf, msg);
3553
+ if (rv == 0)
3554
+ ipmi_free_smi_msg(msg);
35493555 }
35503556
35513557 static void cleanup_smi_msgs(struct ipmi_smi *intf)