diff options
author | Dan Williams <dan.j.williams@intel.com> | 2014-12-30 17:46:14 -0500 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2015-01-09 09:44:17 -0500 |
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, | |||
423 | type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) { | 423 | type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) { |
424 | 424 | ||
425 | if (create) | 425 | if (create) |
426 | ecomp = enclosure_component_register(edev, | 426 | ecomp = enclosure_component_alloc( |
427 | components++, | 427 | edev, |
428 | type_ptr[0], | 428 | components++, |
429 | name); | 429 | type_ptr[0], |
430 | name); | ||
430 | else | 431 | else |
431 | ecomp = &edev->component[components++]; | 432 | ecomp = &edev->component[components++]; |
432 | 433 | ||
433 | if (!IS_ERR(ecomp) && addl_desc_ptr) | 434 | if (!IS_ERR(ecomp)) { |
434 | ses_process_descriptor(ecomp, | 435 | if (addl_desc_ptr) |
435 | addl_desc_ptr); | 436 | ses_process_descriptor( |
437 | ecomp, | ||
438 | addl_desc_ptr); | ||
439 | if (create) | ||
440 | enclosure_component_register( | ||
441 | ecomp); | ||
442 | } | ||
436 | } | 443 | } |
437 | if (desc_ptr) | 444 | if (desc_ptr) |
438 | desc_ptr += len; | 445 | desc_ptr += len; |