Commit 97218a14 authored by Boaz Harrosh's avatar Boaz Harrosh Committed by James Bottomley

[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: default avatarBoaz Harrosh <bharrosh@panasas.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent c96952ed
...@@ -131,7 +131,7 @@ static int _osd_print_system_info(struct osd_dev *od, void *caps) ...@@ -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) ...@@ -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;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment