[SCSI] libosd: Fix NULL dereference BUG when target is not OSD conformant

Very old OSC's Target had a BUG in the Get/Set attributes where
it was looking in the wrong places for attribute lists length.
If used with the open-osd initiator, the initiator would dereference
a NULL pointer when retrieving system_information attributes.

Checks are added that retrieval of each attribute is successful
before accessing its value.

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
Boaz Harrosh 2009-02-08 18:02:22 +02:00 committed by James Bottomley
parent c96952ed70
commit 97218a1499
1 changed files with 7 additions and 4 deletions

View File

@ -131,7 +131,7 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;
OSD_INFO("OSD_ATTR_RI_PRODUCT_REVISION_LEVEL [%u]\n", OSD_INFO("OSD_ATTR_RI_PRODUCT_REVISION_LEVEL [%u]\n",
get_unaligned_be32(pFirst)); pFirst ? get_unaligned_be32(pFirst) : ~0U);
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;
OSD_INFO("OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER [%s]\n", OSD_INFO("OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER [%s]\n",
@ -143,15 +143,18 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps)
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;
OSD_INFO("OSD_ATTR_RI_TOTAL_CAPACITY [0x%llx]\n", OSD_INFO("OSD_ATTR_RI_TOTAL_CAPACITY [0x%llx]\n",
_LLU(get_unaligned_be64(pFirst))); pFirst ? _LLU(get_unaligned_be64(pFirst)) : ~0ULL);
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;
OSD_INFO("OSD_ATTR_RI_USED_CAPACITY [0x%llx]\n", OSD_INFO("OSD_ATTR_RI_USED_CAPACITY [0x%llx]\n",
_LLU(get_unaligned_be64(pFirst))); pFirst ? _LLU(get_unaligned_be64(pFirst)) : ~0ULL);
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;
OSD_INFO("OSD_ATTR_RI_NUMBER_OF_PARTITIONS [%llu]\n", OSD_INFO("OSD_ATTR_RI_NUMBER_OF_PARTITIONS [%llu]\n",
_LLU(get_unaligned_be64(pFirst))); pFirst ? _LLU(get_unaligned_be64(pFirst)) : ~0ULL);
if (a >= nelem)
goto out;
/* FIXME: Where are the time utilities */ /* FIXME: Where are the time utilities */
pFirst = get_attrs[a++].val_ptr; pFirst = get_attrs[a++].val_ptr;