hc
2024-05-16 8d2a02b24d66aa359e83eebc1ed3c0f85367a1cb
kernel/drivers/s390/char/monwriter.c
....@@ -58,22 +58,31 @@
5858
5959 static int monwrite_diag(struct monwrite_hdr *myhdr, char *buffer, int fcn)
6060 {
61
- struct appldata_product_id id;
61
+ struct appldata_parameter_list *parm_list;
62
+ struct appldata_product_id *id;
6263 int rc;
6364
64
- memcpy(id.prod_nr, "LNXAPPL", 7);
65
- id.prod_fn = myhdr->applid;
66
- id.record_nr = myhdr->record_num;
67
- id.version_nr = myhdr->version;
68
- id.release_nr = myhdr->release;
69
- id.mod_lvl = myhdr->mod_level;
70
- rc = appldata_asm(&id, fcn, (void *) buffer, myhdr->datalen);
65
+ id = kmalloc(sizeof(*id), GFP_KERNEL);
66
+ parm_list = kmalloc(sizeof(*parm_list), GFP_KERNEL);
67
+ rc = -ENOMEM;
68
+ if (!id || !parm_list)
69
+ goto out;
70
+ memcpy(id->prod_nr, "LNXAPPL", 7);
71
+ id->prod_fn = myhdr->applid;
72
+ id->record_nr = myhdr->record_num;
73
+ id->version_nr = myhdr->version;
74
+ id->release_nr = myhdr->release;
75
+ id->mod_lvl = myhdr->mod_level;
76
+ rc = appldata_asm(parm_list, id, fcn,
77
+ (void *) buffer, myhdr->datalen);
7178 if (rc <= 0)
72
- return rc;
79
+ goto out;
7380 pr_err("Writing monitor data failed with rc=%i\n", rc);
74
- if (rc == 5)
75
- return -EPERM;
76
- return -EINVAL;
81
+ rc = (rc == 5) ? -EPERM : -EINVAL;
82
+out:
83
+ kfree(id);
84
+ kfree(parm_list);
85
+ return rc;
7786 }
7887
7988 static struct mon_buf *monwrite_find_hdr(struct mon_private *monpriv,