From 019bb580da25ccfb414c9b71ce5c0743cf86d6fd Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 26 Mar 2017 16:45:34 +0200 Subject: devsd: check return value of ifc->enable(), don't leak unit name/user strings --- sys/src/9/port/devsd.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sys/src/9/port/devsd.c b/sys/src/9/port/devsd.c index 18684b3d7..dd1feeedf 100644 --- a/sys/src/9/port/devsd.c +++ b/sys/src/9/port/devsd.c @@ -293,30 +293,31 @@ sdgetunit(SDev* sdev, int subno) qunlock(&sdev->unitlock); return nil; } + if((unit = malloc(sizeof(SDunit))) == nil){ qunlock(&sdev->unitlock); return nil; } sdev->unitflg[subno] = 1; - snprint(buf, sizeof buf, "%s%x", sdev->name, subno); kstrdup(&unit->name, buf); kstrdup(&unit->user, eve); unit->perm = 0555; unit->subno = subno; unit->dev = sdev; - + if(sdev->enabled == 0 && sdev->ifc->enable) - sdev->ifc->enable(sdev); - sdev->enabled = 1; + sdev->enabled = sdev->ifc->enable(sdev); /* * No need to lock anything here as this is only * called before the unit is made available in the * sdunit[] array. */ - if(unit->dev->ifc->verify(unit) == 0){ + if(sdev->enabled == 0 || unit->dev->ifc->verify(unit) == 0){ qunlock(&sdev->unitlock); + free(unit->name); + free(unit->user); free(unit); return nil; } -- cgit v1.2.3