ref: 070c1522ef93f89cadbaabfccdcd65d3eb91ed98
parent: be15d4e806904f26f3541c6b3effad410085ad4c
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Fri May 26 18:08:53 EDT 2023
sdiahci, sdodin, sdide, devsd: get it right... previous commit was typoed, and the changes are even wrong. we actually need to allocate individual SDev's for the unregistration to happen. also, sdide's ataclear() was trying to free sdev->name, which isnt even dynamically allocated. the clear routine should only get rid of the controller specific stuff, not touch the sdev at all. devsd was also not freeing the unitflag and unit pointer arrays...
--- a/sys/src/9/pc/sdiahci.c
+++ b/sys/src/9/pc/sdiahci.c
@@ -170,7 +170,6 @@
};
static Ctlr iactlr[NCtlr];
-static SDev *sdevs;
static int niactlr;
static Drive *iadrive[NDrive];
@@ -2167,9 +2166,6 @@
}
memset(olds, 0xff, sizeof olds);
- sdevs = malloc(sizeof(SDev)*NCtlr);
- if(sdevs == nil)
- return nil;
p = nil;
while((p = pcimatch(p, 0, 0)) != nil){
if((type = didtype(p)) == -1)
@@ -2183,9 +2179,13 @@
break;
}
c = iactlr + niactlr;
- s = sdevs + niactlr;
- memset(c, 0, sizeof *c);
+ s = malloc(sizeof(SDev));
+ if(s == nil){
+ print("iapnp: %s: can't allocate SDev\n", tname[type]);
+ break;
+ }
memset(s, 0, sizeof *s);
+ memset(c, 0, sizeof *c);
c->mmio = vmap(io, p->mem[Abar].size);
if(c->mmio == nil){
print("%s: can't map %llux\n", Tname(c), io);
--- a/sys/src/9/pc/sdide.c
+++ b/sys/src/9/pc/sdide.c
@@ -782,12 +782,6 @@
free(ctlr->drive[0]);
if (ctlr->drive[1])
free(ctlr->drive[1]);
- if (sdev->name)
- free(sdev->name);
- if (sdev->unitflg)
- free(sdev->unitflg);
- if (sdev->unit)
- free(sdev->unit);
free(ctlr);
}
--- a/sys/src/9/pc/sdodin.c
+++ b/sys/src/9/pc/sdodin.c
@@ -543,7 +543,6 @@
};
static Ctlr msctlr[Nctlr];
-static SDev *sdevs;
static uint nmsctlr;
static Drive *msdrive[Ndrive];
static uint nmsdrive;
@@ -2646,9 +2645,6 @@
return nil;
s0 = nil;
ll = &s0;
- sdevs = malloc(sizeof(SDev)*NCtlr);
- if(sdevs == nil)
- return nil;
for(p = nil; (p = pcimatch(p, 0x11ab, 0x6485)) != nil; ){
if(nmsctlr == Nctlr){
print("sdodin: too many controllers\n");
@@ -2655,7 +2651,11 @@
break;
}
c = msctlr + nmsctlr;
- s = sdevs + nmsctlr;
+ s = malloc(sizeof(SDev));
+ if(s == nil){
+ print("sdodin: can't allocate SDev\n");
+ break;
+ }
memset(c, 0, sizeof *c);
memset(s, 0, sizeof *s);
if((c->reg = map(p, Mebar)) == nil){
--- a/sys/src/9/port/devsd.c
+++ b/sys/src/9/port/devsd.c
@@ -356,10 +356,10 @@
if(sdev->unit == nil || sdev->unitflg == nil){
print("sdadddevs: out of memory\n");
giveup:
- free(sdev->unit);
- free(sdev->unitflg);
if(sdev->ifc->clear)
sdev->ifc->clear(sdev);
+ free(sdev->unit);
+ free(sdev->unitflg);
free(sdev);
continue;
}
@@ -1630,6 +1630,10 @@
if(sdev->enabled && sdev->ifc->disable)
sdev->ifc->disable(sdev);
+ /* free controller specific info */
+ if(sdev->ifc->clear)
+ sdev->ifc->clear(sdev);
+
for(i = 0; i < sdev->nunit; i++){
if((unit = sdev->unit[i]) != nil){
free(unit->name);
@@ -1637,10 +1641,8 @@
free(unit);
}
}
-
- if(sdev->ifc->clear)
- sdev->ifc->clear(sdev);
-
+ free(sdev->unit);
+ free(sdev->unitflg);
free(sdev);
return 0;
}
--
⑨