From: Dominik Brodowski Check for invalid crc32 hashes in drivers' id_tables if CONFIG_PCMCIA_DEBUG is set. Signed-off-by: Dominik Brodowski Signed-off-by: Andrew Morton --- 25-akpm/drivers/pcmcia/ds.c | 37 +++++++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+) diff -puN drivers/pcmcia/ds.c~pcmcia-check-for-invalid-crc32-hashes-in-id_tables drivers/pcmcia/ds.c --- 25/drivers/pcmcia/ds.c~pcmcia-check-for-invalid-crc32-hashes-in-id_tables Sun Mar 6 17:28:06 2005 +++ 25-akpm/drivers/pcmcia/ds.c Sun Mar 6 17:28:06 2005 @@ -260,6 +260,41 @@ void cs_error(client_handle_t handle, in } EXPORT_SYMBOL(cs_error); +#ifdef CONFIG_PCMCIA_DEBUG + + +static void pcmcia_check_driver(struct pcmcia_driver *p_drv) +{ + struct pcmcia_device_id *did = p_drv->id_table; + unsigned int i; + u32 hash; + + while (did && did->match_flags) { + for (i=0; i<4; i++) { + if (!did->prod_id[i]) + continue; + + hash = crc32(0, did->prod_id[i], strlen(did->prod_id[i])); + if (hash == did->prod_id_hash[i]) + continue; + + printk(KERN_DEBUG "pcmcia: %s: invalid hash for " + "product string \"%s\": is 0x%x, should " + "be 0x%x\n", p_drv->drv.name, did->prod_id[i], + did->prod_id_hash[i], hash); + } + did++; + } + + return; +} + +#else +static inline void pcmcia_check_driver(struct pcmcia_driver *p_drv) { + return; +} +#endif + /*======================================================================*/ static struct pcmcia_driver * get_pcmcia_driver (dev_info_t *dev_info); @@ -296,6 +331,8 @@ int pcmcia_register_driver(struct pcmcia if (!driver) return -EINVAL; + pcmcia_check_driver(driver); + /* initialize common fields */ driver->drv.bus = &pcmcia_bus_type; driver->drv.owner = driver->owner; _