[patch 09/10] firedtv: fix string comparison and a few sparse warnings
Stefan Richter
stefanr at s5r6.in-berlin.de
Mon Sep 29 17:21:52 UTC 2008
Sparse found a bug:
while ((kv_buf + kv_len - 1) == '\0')
should have been
while (kv_buf[kv_len - 1] == '\0')
We fix it by a better implementation without a temporary copy.
Also fix sparse warnings of 0 instead of NULL and signedness mismatches.
Signed-off-by: Stefan Richter <stefanr at s5r6.in-berlin.de>
---
drivers/media/dvb/firesat/avc_api.c | 14 +++++++-------
drivers/media/dvb/firesat/avc_api.h | 6 +++---
drivers/media/dvb/firesat/firesat_1394.c | 23 +++++++----------------
drivers/media/dvb/firesat/firesat_dvb.c | 2 +-
4 files changed, 18 insertions(+), 27 deletions(-)
Index: linux/drivers/media/dvb/firesat/firesat_1394.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_1394.c
+++ linux/drivers/media/dvb/firesat/firesat_1394.c
@@ -146,8 +146,8 @@ static int firesat_probe(struct device *
struct firesat *firesat;
unsigned long flags;
int kv_len;
+ void *kv_str;
int i;
- char *kv_buf;
int err = -ENOMEM;
firesat = kzalloc(sizeof(*firesat), GFP_KERNEL);
@@ -169,20 +169,12 @@ static int firesat_probe(struct device *
/* Reading device model from ROM */
kv_len = (ud->model_name_kv->value.leaf.len - 2) * sizeof(quadlet_t);
- kv_buf = kmalloc((sizeof(quadlet_t) * kv_len), GFP_KERNEL);
- if (!kv_buf)
- goto fail_free;
- memcpy(kv_buf, CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv),
- kv_len);
- while ((kv_buf + kv_len - 1) == '\0')
- kv_len--;
- kv_buf[kv_len++] = '\0';
-
+ kv_str = CSR1212_TEXTUAL_DESCRIPTOR_LEAF_DATA(ud->model_name_kv);
for (i = ARRAY_SIZE(firedtv_model_names); --i;)
- if (strcmp(kv_buf, firedtv_model_names[i]) == 0)
+ if (strlen(firedtv_model_names[i]) <= kv_len &&
+ strncmp(kv_str, firedtv_model_names[i], kv_len) == 0)
break;
firesat->type = i;
- kfree(kv_buf);
INIT_LIST_HEAD(&firesat->list);
spin_lock_irqsave(&firesat_list_lock, flags);
@@ -191,20 +183,19 @@ static int firesat_probe(struct device *
err = AVCIdentifySubunit(firesat);
if (err)
- goto fail_unlist;
+ goto fail;
err = firesat_dvbdev_init(firesat, dev);
if (err)
- goto fail_unlist;
+ goto fail;
AVCRegisterRemoteControl(firesat);
return 0;
-fail_unlist:
+fail:
spin_lock_irqsave(&firesat_list_lock, flags);
list_del(&firesat->list);
spin_unlock_irqrestore(&firesat_list_lock, flags);
-fail_free:
kfree(firesat);
return err;
}
Index: linux/drivers/media/dvb/firesat/firesat_dvb.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/firesat_dvb.c
+++ linux/drivers/media/dvb/firesat/firesat_dvb.c
@@ -173,7 +173,7 @@ int firesat_stop_feed(struct dvb_demux_f
return -EINVAL;
demux->pids[dvbdmxfeed->pes_type] |= 0x8000;
- demux->pesfilter[dvbdmxfeed->pes_type] = 0;
+ demux->pesfilter[dvbdmxfeed->pes_type] = NULL;
}
if (!(dvbdmxfeed->ts_type & TS_DECODER &&
Index: linux/drivers/media/dvb/firesat/avc_api.c
===================================================================
--- linux.orig/drivers/media/dvb/firesat/avc_api.c
+++ linux/drivers/media/dvb/firesat/avc_api.c
@@ -880,7 +880,7 @@ static int get_ca_object_length(AVCRspFr
return RspFrm->operand[7];
}
-int avc_ca_app_info(struct firesat *firesat, char *app_info, int *length)
+int avc_ca_app_info(struct firesat *firesat, char *app_info, unsigned int *len)
{
AVCCmdFrm CmdFrm;
AVCRspFrm RspFrm;
@@ -912,12 +912,12 @@ int avc_ca_app_info(struct firesat *fire
app_info[3] = 6 + RspFrm.operand[pos + 4];
app_info[4] = 0x01;
memcpy(&app_info[5], &RspFrm.operand[pos], 5 + RspFrm.operand[pos + 4]);
- *length = app_info[3] + 4;
+ *len = app_info[3] + 4;
return 0;
}
-int avc_ca_info(struct firesat *firesat, char *app_info, int *length)
+int avc_ca_info(struct firesat *firesat, char *app_info, unsigned int *len)
{
AVCCmdFrm CmdFrm;
AVCRspFrm RspFrm;
@@ -948,7 +948,7 @@ int avc_ca_info(struct firesat *firesat,
app_info[3] = 2;
app_info[4] = app_info[5];
app_info[5] = app_info[6];
- *length = app_info[3] + 4;
+ *len = app_info[3] + 4;
return 0;
}
@@ -1178,7 +1178,7 @@ int avc_ca_enter_menu(struct firesat *fi
return 0;
}
-int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, int *length)
+int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, unsigned int *len)
{
AVCCmdFrm CmdFrm;
AVCRspFrm RspFrm;
@@ -1203,8 +1203,8 @@ int avc_ca_get_mmi(struct firesat *fires
if(AVCWrite(firesat,&CmdFrm,&RspFrm) < 0)
return -EIO;
- *length = get_ca_object_length(&RspFrm);
- memcpy(mmi_object, &RspFrm.operand[get_ca_object_pos(&RspFrm)], *length);
+ *len = get_ca_object_length(&RspFrm);
+ memcpy(mmi_object, &RspFrm.operand[get_ca_object_pos(&RspFrm)], *len);
return 0;
}
Index: linux/drivers/media/dvb/firesat/avc_api.h
===================================================================
--- linux.orig/drivers/media/dvb/firesat/avc_api.h
+++ linux/drivers/media/dvb/firesat/avc_api.h
@@ -434,12 +434,12 @@ int AVCLNBControl(struct firesat *firesa
void avc_remote_ctrl_work(struct work_struct *work);
int AVCRegisterRemoteControl(struct firesat *firesat);
int AVCTuner_Host2Ca(struct firesat *firesat);
-int avc_ca_app_info(struct firesat *firesat, char *app_info, int *length);
-int avc_ca_info(struct firesat *firesat, char *app_info, int *length);
+int avc_ca_app_info(struct firesat *firesat, char *app_info, unsigned int *len);
+int avc_ca_info(struct firesat *firesat, char *app_info, unsigned int *len);
int avc_ca_reset(struct firesat *firesat);
int avc_ca_pmt(struct firesat *firesat, char *app_info, int length);
int avc_ca_get_time_date(struct firesat *firesat, int *interval);
int avc_ca_enter_menu(struct firesat *firesat);
-int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, int *length);
+int avc_ca_get_mmi(struct firesat *firesat, char *mmi_object, unsigned int *len);
#endif /* _AVC_API_H */
--
Stefan Richter
-=====-==--- =--= ===-=
http://arcgraph.de/sr/
More information about the devel
mailing list