]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/scsi_devinfo.c
SCSI: fix bug in scsi_dev_info_list matching
[karo-tx-linux.git] / drivers / scsi / scsi_devinfo.c
index 2f49a224462d507f857642a48d0bc86d0324121e..2c1160c7ec92fdd48c078c4862a2dac7904edc31 100644 (file)
@@ -407,51 +407,52 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
        struct scsi_dev_info_list *devinfo;
        struct scsi_dev_info_list_table *devinfo_table =
                scsi_devinfo_lookup_by_key(key);
+       size_t vmax, mmax;
+       const char *vskip, *mskip;
 
        if (IS_ERR(devinfo_table))
                return (struct scsi_dev_info_list *) devinfo_table;
 
+       /* Prepare for "compatible" matches */
+
+       /*
+        * XXX why skip leading spaces? If an odd INQUIRY
+        * value, that should have been part of the
+        * scsi_static_device_list[] entry, such as "  FOO"
+        * rather than "FOO". Since this code is already
+        * here, and we don't know what device it is
+        * trying to work with, leave it as-is.
+        */
+       vmax = 8;       /* max length of vendor */
+       vskip = vendor;
+       while (vmax > 0 && *vskip == ' ') {
+               vmax--;
+               vskip++;
+       }
+       /* Also skip trailing spaces */
+       while (vmax > 0 && vskip[vmax - 1] == ' ')
+               --vmax;
+
+       mmax = 16;      /* max length of model */
+       mskip = model;
+       while (mmax > 0 && *mskip == ' ') {
+               mmax--;
+               mskip++;
+       }
+       while (mmax > 0 && mskip[mmax - 1] == ' ')
+               --mmax;
+
        list_for_each_entry(devinfo, &devinfo_table->scsi_dev_info_list,
                            dev_info_list) {
                if (devinfo->compatible) {
                        /*
                         * Behave like the older version of get_device_flags.
                         */
-                       size_t max;
-                       /*
-                        * XXX why skip leading spaces? If an odd INQUIRY
-                        * value, that should have been part of the
-                        * scsi_static_device_list[] entry, such as "  FOO"
-                        * rather than "FOO". Since this code is already
-                        * here, and we don't know what device it is
-                        * trying to work with, leave it as-is.
-                        */
-                       max = 8;        /* max length of vendor */
-                       while ((max > 0) && *vendor == ' ') {
-                               max--;
-                               vendor++;
-                       }
-                       /*
-                        * XXX removing the following strlen() would be
-                        * good, using it means that for a an entry not in
-                        * the list, we scan every byte of every vendor
-                        * listed in scsi_static_device_list[], and never match
-                        * a single one (and still have to compare at
-                        * least the first byte of each vendor).
-                        */
-                       if (memcmp(devinfo->vendor, vendor,
-                                   min(max, strlen(devinfo->vendor))))
+                       if (memcmp(devinfo->vendor, vskip, vmax) ||
+                                       devinfo->vendor[vmax])
                                continue;
-                       /*
-                        * Skip spaces again.
-                        */
-                       max = 16;       /* max length of model */
-                       while ((max > 0) && *model == ' ') {
-                               max--;
-                               model++;
-                       }
-                       if (memcmp(devinfo->model, model,
-                                  min(max, strlen(devinfo->model))))
+                       if (memcmp(devinfo->model, mskip, mmax) ||
+                                       devinfo->model[mmax])
                                continue;
                        return devinfo;
                } else {