diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-27 23:23:29 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-27 23:23:29 +0200 |
commit | 244d2ee84b1367ee7eb60395f75a5cb9bc5616a6 (patch) | |
tree | 1f156378ee37bc581e2e8f67a6e4a1e0e0f88976 | |
parent | 5e37e6361c8294da8bc311e626cad3fe781e3e67 (diff) |
devkbd: fix wrong refcount on open error
only decrement refcount when file was successfully opend
on clunk, fix refcount when devopen() errors.
-rw-r--r-- | sys/src/9/pc/devkbd.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/src/9/pc/devkbd.c b/sys/src/9/pc/devkbd.c index 978a48247..361dde7b0 100644 --- a/sys/src/9/pc/devkbd.c +++ b/sys/src/9/pc/devkbd.c @@ -339,10 +339,15 @@ kbdopen(Chan *c, int omode) if(!iseve()) error(Eperm); if(c->qid.path == Qscancode){ - if(incref(&kbd.ref) != 1){ + if(waserror()){ decref(&kbd.ref); - error(Einuse); + nexterror(); } + if(incref(&kbd.ref) != 1) + error(Einuse); + c = devopen(c, omode, kbdtab, nelem(kbdtab), devgen); + poperror(); + return c; } return devopen(c, omode, kbdtab, nelem(kbdtab), devgen); } @@ -350,7 +355,7 @@ kbdopen(Chan *c, int omode) static void kbdclose(Chan *c) { - if(c->qid.path == Qscancode) + if((c->flag & COPEN) && c->qid.path == Qscancode) decref(&kbd.ref); } |