cap: fix format-string vulnerability
[akaros.git] / kern / drivers / dev / capability.c
index a59c7b6..f489e6f 100644 (file)
@@ -7,8 +7,6 @@
  * in the LICENSE file.
  */
 
-#include <vfs.h>
-#include <kfs.h>
 #include <slab.h>
 #include <kmalloc.h>
 #include <kref.h>
@@ -19,7 +17,7 @@
 #include <cpio.h>
 #include <pmap.h>
 #include <smp.h>
-#include <ip.h>
+#include <net/ip.h>
 
 #include <crypto/2crypto.h>
 #include <crypto/2hmac.h>
@@ -73,7 +71,7 @@ static struct chan *capattach(char *spec)
 }
 
 static struct walkqid *capwalk(struct chan *c, struct chan *nc, char **name,
-                               int nname)
+                               unsigned int nname)
 {
        return devwalk(c, nc, name, nname, capdir, ncapdir, devgen);
 }
@@ -86,7 +84,7 @@ static void capremove(struct chan *c)
                error(EPERM, "Permission denied");
 }
 
-static int32_t capstat(struct chan *c, uint8_t *db, int32_t n)
+static size_t capstat(struct chan *c, uint8_t *db, size_t n)
 {
        return devstat(c, db, n, capdir, ncapdir, devgen);
 }
@@ -108,7 +106,8 @@ static struct chan *capopen(struct chan *c, int omode)
        switch ((uint32_t)c->qid.path) {
        case Qhash:
                if (!iseve())
-                       error(EPERM, "Permission denied: only eve can open Qhash");
+                       error(EPERM,
+                             "Permission denied: only eve can open Qhash");
                break;
        }
 
@@ -185,7 +184,7 @@ static void capclose(struct chan *c)
 {
 }
 
-static long capread(struct chan *c, void *va, long n, int64_t m)
+static size_t capread(struct chan *c, void *va, size_t n, off64_t m)
 {
        switch ((uint32_t)c->qid.path) {
        case Qdir:
@@ -198,14 +197,13 @@ static long capread(struct chan *c, void *va, long n, int64_t m)
        return n;
 }
 
-static long capwrite(struct chan *c, void *va, long n, int64_t m)
+static size_t capwrite(struct chan *c, void *va, size_t n, off64_t m)
 {
        struct Caphash *p;
        char *cp;
        uint8_t hash[Hashlen + 1] = {0};
        char *hashstr = NULL;
        char *key, *from, *to;
-       char err[256];
        int ret;
        ERRSTACK(1);
 
@@ -222,7 +220,8 @@ static long capwrite(struct chan *c, void *va, long n, int64_t m)
                break;
 
        case Quse:
-               /* copy key to avoid a fault in hmac_xx */
+               /* copy key to avoid a fault in hmac_xx and so we can enforce
+                * null termination. */
                cp = NULL;
                if (waserror()) {
                        kfree(cp);
@@ -251,10 +250,8 @@ static long capwrite(struct chan *c, void *va, long n, int64_t m)
                        error(EINVAL, "hash is wrong length");
 
                p = remcap((uint8_t *)hashstr);
-               if (p == NULL) {
-                       snprintf(err, sizeof(err), "invalid capability %s@%s", from, key);
-                       error(EINVAL, err);
-               }
+               if (p == NULL)
+                       error(EINVAL, "invalid capability %s@%s", from, key);
 
                kfree(hashstr);
                hashstr = NULL;