|
@@ -421,10 +421,13 @@ static int multipath_pr_out(int fd, const uint8_t *cdb, uint8_t *sense,
|
|
|
int rq_servact = cdb[1];
|
|
|
int rq_scope = cdb[2] >> 4;
|
|
|
int rq_type = cdb[2] & 0xf;
|
|
|
- struct prout_param_descriptor paramp;
|
|
|
+ g_autofree struct prout_param_descriptor *paramp = NULL;
|
|
|
char transportids[PR_HELPER_DATA_SIZE];
|
|
|
int r;
|
|
|
|
|
|
+ paramp = g_malloc0(sizeof(struct prout_param_descriptor)
|
|
|
+ + sizeof(struct transportid *) * MPATH_MX_TIDS);
|
|
|
+
|
|
|
if (sz < PR_OUT_FIXED_PARAM_SIZE) {
|
|
|
/* Illegal request, Parameter list length error. This isn't fatal;
|
|
|
* we have read the data, send an error without closing the socket.
|
|
@@ -454,10 +457,9 @@ static int multipath_pr_out(int fd, const uint8_t *cdb, uint8_t *sense,
|
|
|
* used by libmpathpersist (which, of course, will immediately
|
|
|
* do the opposite).
|
|
|
*/
|
|
|
- memset(¶mp, 0, sizeof(paramp));
|
|
|
- memcpy(¶mp.key, ¶m[0], 8);
|
|
|
- memcpy(¶mp.sa_key, ¶m[8], 8);
|
|
|
- paramp.sa_flags = param[20];
|
|
|
+ memcpy(¶mp->key, ¶m[0], 8);
|
|
|
+ memcpy(¶mp->sa_key, ¶m[8], 8);
|
|
|
+ paramp->sa_flags = param[20];
|
|
|
if (sz > PR_OUT_FIXED_PARAM_SIZE) {
|
|
|
size_t transportid_len;
|
|
|
int i, j;
|
|
@@ -520,12 +522,13 @@ static int multipath_pr_out(int fd, const uint8_t *cdb, uint8_t *sense,
|
|
|
return CHECK_CONDITION;
|
|
|
}
|
|
|
|
|
|
- paramp.trnptid_list[paramp.num_transportid++] = id;
|
|
|
+ assert(paramp->num_transportid < MPATH_MX_TIDS);
|
|
|
+ paramp->trnptid_list[paramp->num_transportid++] = id;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
r = mpath_persistent_reserve_out(fd, rq_servact, rq_scope, rq_type,
|
|
|
- ¶mp, noisy, verbose);
|
|
|
+ paramp, noisy, verbose);
|
|
|
return mpath_reconstruct_sense(fd, r, sense);
|
|
|
}
|
|
|
#endif
|