Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8bfa79fc authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

libata: use ata_id_c_string()



There were several places where ATA ID strings are manually terminated
and in some places possibly unterminated strings were passed to string
functions which don't limit length like strstr().  This patch converts
all of them over to ata_id_c_string().

Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent a0cf733b
Loading
Loading
Loading
Loading
+6 −21
Original line number Diff line number Diff line
@@ -3325,35 +3325,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
	{ }
};

static int ata_strim(char *s, size_t len)
{
	len = strnlen(s, len);

	/* ATAPI specifies that empty space is blank-filled; remove blanks */
	while ((len > 0) && (s[len - 1] == ' ')) {
		len--;
		s[len] = 0;
	}
	return len;
}

unsigned long ata_device_blacklisted(const struct ata_device *dev)
{
	unsigned char model_num[ATA_ID_PROD_LEN];
	unsigned char model_rev[ATA_ID_FW_REV_LEN];
	unsigned int nlen, rlen;
	unsigned char model_num[ATA_ID_PROD_LEN + 1];
	unsigned char model_rev[ATA_ID_FW_REV_LEN + 1];
	const struct ata_blacklist_entry *ad = ata_device_blacklist;

	ata_id_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	ata_id_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
	nlen = ata_strim(model_num, sizeof(model_num));
	rlen = ata_strim(model_rev, sizeof(model_rev));
	ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));

	while (ad->model_num) {
		if (!strncmp(ad->model_num, model_num, nlen)) {
		if (!strcmp(ad->model_num, model_num)) {
			if (ad->model_rev == NULL)
				return ad->horkage;
			if (!strncmp(ad->model_rev, model_rev, rlen))
			if (!strcmp(ad->model_rev, model_rev))
				return ad->horkage;
		}
		ad++;
+2 −2
Original line number Diff line number Diff line
@@ -153,11 +153,11 @@ static void ali_early_error_handler(struct ata_port *ap)

static unsigned long ali_20_filter(const struct ata_port *ap, struct ata_device *adev, unsigned long mask)
{
	char model_num[ATA_ID_PROD_LEN];
	char model_num[ATA_ID_PROD_LEN + 1];
	/* No DMA on anything but a disk for now */
	if (adev->class != ATA_DEV_ATA)
		mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
	ata_id_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	if (strstr(model_num, "WDC"))
		return mask &= ~ATA_MASK_UDMA;
	return ata_pci_default_filter(ap, adev, mask);
+4 −14
Original line number Diff line number Diff line
@@ -151,23 +151,13 @@ static const char *bad_ata66_3[] = {

static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr, const char *list[])
{
	unsigned char model_num[ATA_ID_PROD_LEN];
	char *s;
	unsigned int len;
	unsigned char model_num[ATA_ID_PROD_LEN + 1];
	int i = 0;

	ata_id_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	s = &model_num[0];
	len = strnlen(s, sizeof(model_num));

	/* ATAPI specifies that empty space is blank-filled; remove blanks */
	while ((len > 0) && (s[len - 1] == ' ')) {
		len--;
		s[len] = 0;
	}
	ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));

	while (list[i] != NULL) {
		if (!strncmp(list[i], s, len)) {
		if (!strcmp(list[i], model_num)) {
			printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
				modestr, list[i]);
			return 1;
+4 −14
Original line number Diff line number Diff line
@@ -349,23 +349,13 @@ static u32 hpt37x_find_mode(struct ata_port *ap, int speed)

static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr, const char *list[])
{
	unsigned char model_num[ATA_ID_PROD_LEN];
	char *s;
	unsigned int len;
	unsigned char model_num[ATA_ID_PROD_LEN + 1];
	int i = 0;

	ata_id_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	s = &model_num[0];
	len = strnlen(s, sizeof(model_num));

	/* ATAPI specifies that empty space is blank-filled; remove blanks */
	while ((len > 0) && (s[len - 1] == ' ')) {
		len--;
		s[len] = 0;
	}
	ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));

	while (list[i] != NULL) {
		if (!strncmp(list[i], s, len)) {
		if (!strcmp(list[i], model_num)) {
			printk(KERN_WARNING DRV_NAME ": %s is not supported for %s.\n",
				modestr, list[i]);
			return 1;
+2 −15
Original line number Diff line number Diff line
@@ -531,22 +531,9 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused

static void it821x_dev_config(struct ata_port *ap, struct ata_device *adev)
{
	unsigned char model_num[ATA_ID_PROD_LEN];
	char *s;
	unsigned int len;
	unsigned char model_num[ATA_ID_PROD_LEN + 1];

	/* This block ought to be a library routine as it is in several
	   drivers now */

	ata_id_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));
	s = &model_num[0];
	len = strnlen(s, sizeof(model_num));

	/* ATAPI specifies that empty space is blank-filled; remove blanks */
	while ((len > 0) && (s[len - 1] == ' ')) {
		len--;
		s[len] = 0;
	}
	ata_id_c_string(adev->id, model_num, ATA_ID_PROD, sizeof(model_num));

	if (adev->max_sectors > 255)
		adev->max_sectors = 255;
Loading