aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ses.c
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2014-12-30 17:46:14 -0500
committerChristoph Hellwig <hch@lst.de>2015-01-09 09:44:17 -0500
commited09dcc8bd7fe0991af7737e675996cbd022f38f (patch)
tree1d789e23989575d366b2bf657c7b7fbf89772733 /drivers/scsi/ses.c
parentacd6d73826224c20c44f505f56b0503f022d695c (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.c21
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;