diff options
author | Dan Williams <dan.j.williams@intel.com> | 2014-12-30 14:46:14 -0800 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2015-01-09 15:44:17 +0100 |
commit | ed09dcc8bd7fe0991af7737e675996cbd022f38f (patch) | |
tree | 1d789e23989575d366b2bf657c7b7fbf89772733 /drivers/scsi/ses.c | |
parent | acd6d73826224c20c44f505f56b0503f022d695c (diff) |
ses: close potential registration race
The slot and address fields have a small window of instability when
userspace can read them before initialization. Separate
enclosure_component
allocation from registration.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Song Liu <songliubraving@fb.com>
Reviewed-by: Jens Axboe <axboe@fb.com>
Cc: Hannes Reinecke <hare@suse.de>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi/ses.c')
-rw-r--r-- | drivers/scsi/ses.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index b7e79e7646ad..7dd9cf558380 100644 --- a/drivers/scsi/ses.c +++ b/drivers/scsi/ses.c @@ -423,16 +423,23 @@ static void ses_enclosure_data_process(struct enclosure_device *edev, type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) { if (create) - ecomp = enclosure_component_register(edev, - components++, - type_ptr[0], - name); + ecomp = enclosure_component_alloc( + edev, + components++, + type_ptr[0], + name); else ecomp = &edev->component[components++]; - if (!IS_ERR(ecomp) && addl_desc_ptr) - ses_process_descriptor(ecomp, - addl_desc_ptr); + if (!IS_ERR(ecomp)) { + if (addl_desc_ptr) + ses_process_descriptor( + ecomp, + addl_desc_ptr); + if (create) + enclosure_component_register( + ecomp); + } } if (desc_ptr) desc_ptr += len; |