scsi-lowlevel: remove scsi_serviceactionin_params and plug potential memleaks
Signed-off-by: Arne Redlich <arne.redlich@googlemail.com>
This commit is contained in:
@@ -176,9 +176,6 @@ struct scsi_readtoc_list {
|
|||||||
struct scsi_readtoc_desc desc[0];
|
struct scsi_readtoc_desc desc[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct scsi_serviceactionin_params {
|
|
||||||
enum scsi_service_action_in sa;
|
|
||||||
};
|
|
||||||
struct scsi_readtoc_params {
|
struct scsi_readtoc_params {
|
||||||
int msf;
|
int msf;
|
||||||
int format;
|
int format;
|
||||||
@@ -222,7 +219,6 @@ struct scsi_task {
|
|||||||
int expxferlen;
|
int expxferlen;
|
||||||
unsigned char cdb[SCSI_CDB_MAX_SIZE];
|
unsigned char cdb[SCSI_CDB_MAX_SIZE];
|
||||||
union {
|
union {
|
||||||
struct scsi_serviceactionin_params serviceactionin;
|
|
||||||
struct scsi_readtoc_params readtoc;
|
struct scsi_readtoc_params readtoc;
|
||||||
struct scsi_maintenancein_params maintenancein;
|
struct scsi_maintenancein_params maintenancein;
|
||||||
} params;
|
} params;
|
||||||
|
|||||||
@@ -488,6 +488,11 @@ scsi_cdb_release6(void)
|
|||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint8_t
|
||||||
|
scsi_serviceactionin_sa(const struct scsi_task *task)
|
||||||
|
{
|
||||||
|
return task->cdb[1];
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* service_action_in unmarshall
|
* service_action_in unmarshall
|
||||||
@@ -495,14 +500,10 @@ scsi_cdb_release6(void)
|
|||||||
static void *
|
static void *
|
||||||
scsi_serviceactionin_datain_unmarshall(struct scsi_task *task)
|
scsi_serviceactionin_datain_unmarshall(struct scsi_task *task)
|
||||||
{
|
{
|
||||||
struct scsi_readcapacity16 *rc16;
|
switch (scsi_serviceactionin_sa(task)) {
|
||||||
struct scsi_get_lba_status *gls;
|
case SCSI_READCAPACITY16: {
|
||||||
int32_t len;
|
struct scsi_readcapacity16 *rc16 = scsi_malloc(task,
|
||||||
int i;
|
sizeof(*rc16));
|
||||||
|
|
||||||
switch (task->params.serviceactionin.sa) {
|
|
||||||
case SCSI_READCAPACITY16:
|
|
||||||
rc16 = scsi_malloc(task, sizeof(struct scsi_readcapacity16));
|
|
||||||
if (rc16 == NULL) {
|
if (rc16 == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -517,20 +518,27 @@ scsi_serviceactionin_datain_unmarshall(struct scsi_task *task)
|
|||||||
rc16->lbprz = !!(task->datain.data[14] & 0x40);
|
rc16->lbprz = !!(task->datain.data[14] & 0x40);
|
||||||
rc16->lalba = ntohs(*(uint16_t *)&(task->datain.data[14])) & 0x3fff;
|
rc16->lalba = ntohs(*(uint16_t *)&(task->datain.data[14])) & 0x3fff;
|
||||||
return rc16;
|
return rc16;
|
||||||
case SCSI_GET_LBA_STATUS:
|
}
|
||||||
len = ntohl(*(uint32_t *)&(task->datain.data[0]));
|
case SCSI_GET_LBA_STATUS: {
|
||||||
|
struct scsi_get_lba_status *gls = scsi_malloc(task,
|
||||||
|
sizeof(*gls));
|
||||||
|
int32_t len = ntohl(*(uint32_t *)&(task->datain.data[0]));
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (gls == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (len > task->datain.size - 4) {
|
if (len > task->datain.size - 4) {
|
||||||
len = task->datain.size - 4;
|
len = task->datain.size - 4;
|
||||||
}
|
}
|
||||||
len = len / 16;
|
len = len / 16;
|
||||||
|
|
||||||
gls = scsi_malloc(task, sizeof(struct scsi_get_lba_status));
|
|
||||||
if (gls == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
gls->num_descriptors = len;
|
gls->num_descriptors = len;
|
||||||
gls->descriptors = scsi_malloc(task, sizeof(struct scsi_lba_status_descriptor) * gls->num_descriptors);
|
gls->descriptors = scsi_malloc(task,
|
||||||
|
sizeof(*gls->descriptors) * len);
|
||||||
if (gls->descriptors == NULL) {
|
if (gls->descriptors == NULL) {
|
||||||
|
free(gls);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,8 +554,9 @@ scsi_serviceactionin_datain_unmarshall(struct scsi_task *task)
|
|||||||
|
|
||||||
return gls;
|
return gls;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2056,8 +2065,6 @@ scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen)
|
|||||||
}
|
}
|
||||||
task->expxferlen = xferlen;
|
task->expxferlen = xferlen;
|
||||||
|
|
||||||
task->params.serviceactionin.sa = sa;
|
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2100,8 +2107,6 @@ scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len)
|
|||||||
}
|
}
|
||||||
task->expxferlen = alloc_len;
|
task->expxferlen = alloc_len;
|
||||||
|
|
||||||
task->params.serviceactionin.sa = SCSI_GET_LBA_STATUS;
|
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user