From 1889aa50c3727e7c09da16cacfbfecd72860511b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 26 Mar 2017 16:43:32 +0200 Subject: sdvirtio: return 1 for success in vioenable()/viodisable() --- sys/src/9/pc/sdvirtio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/src/9/pc/sdvirtio.c b/sys/src/9/pc/sdvirtio.c index 6bb6c1162..ecda11778 100644 --- a/sys/src/9/pc/sdvirtio.c +++ b/sys/src/9/pc/sdvirtio.c @@ -579,7 +579,7 @@ vioenable(SDev *sd) snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name); intrenable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name); outb(vd->port+Status, inb(vd->port+Status) | DriverOk); - return 0; + return 1; } static int @@ -591,7 +591,7 @@ viodisable(SDev *sd) vd = sd->ctlr; snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name); intrdisable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name); - return 0; + return 1; } static SDev* -- cgit v1.2.3 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