KEYS: Don't write out to userspace while holding key semaphore
[linux-2.6-microblaze.git] / net / rxrpc / key.c
index 6c3f35f..0c98313 100644 (file)
@@ -31,7 +31,7 @@ static void rxrpc_free_preparse_s(struct key_preparsed_payload *);
 static void rxrpc_destroy(struct key *);
 static void rxrpc_destroy_s(struct key *);
 static void rxrpc_describe(const struct key *, struct seq_file *);
-static long rxrpc_read(const struct key *, char __user *, size_t);
+static long rxrpc_read(const struct key *, char *, size_t);
 
 /*
  * rxrpc defined keys take an arbitrary string as the description and an
@@ -1042,12 +1042,12 @@ EXPORT_SYMBOL(rxrpc_get_null_key);
  * - this returns the result in XDR form
  */
 static long rxrpc_read(const struct key *key,
-                      char __user *buffer, size_t buflen)
+                      char *buffer, size_t buflen)
 {
        const struct rxrpc_key_token *token;
        const struct krb5_principal *princ;
        size_t size;
-       __be32 __user *xdr, *oldxdr;
+       __be32 *xdr, *oldxdr;
        u32 cnlen, toksize, ntoks, tok, zero;
        u16 toksizes[AFSTOKEN_MAX];
        int loop;
@@ -1124,30 +1124,25 @@ static long rxrpc_read(const struct key *key,
        if (!buffer || buflen < size)
                return size;
 
-       xdr = (__be32 __user *) buffer;
+       xdr = (__be32 *)buffer;
        zero = 0;
 #define ENCODE(x)                              \
        do {                                    \
-               __be32 y = htonl(x);            \
-               if (put_user(y, xdr++) < 0)     \
-                       goto fault;             \
+               *xdr++ = htonl(x);              \
        } while(0)
 #define ENCODE_DATA(l, s)                                              \
        do {                                                            \
                u32 _l = (l);                                           \
                ENCODE(l);                                              \
-               if (copy_to_user(xdr, (s), _l) != 0)                    \
-                       goto fault;                                     \
-               if (_l & 3 &&                                           \
-                   copy_to_user((u8 __user *)xdr + _l, &zero, 4 - (_l & 3)) != 0) \
-                       goto fault;                                     \
+               memcpy(xdr, (s), _l);                                   \
+               if (_l & 3)                                             \
+                       memcpy((u8 *)xdr + _l, &zero, 4 - (_l & 3));    \
                xdr += (_l + 3) >> 2;                                   \
        } while(0)
 #define ENCODE64(x)                                    \
        do {                                            \
                __be64 y = cpu_to_be64(x);              \
-               if (copy_to_user(xdr, &y, 8) != 0)      \
-                       goto fault;                     \
+               memcpy(xdr, &y, 8);                     \
                xdr += 8 >> 2;                          \
        } while(0)
 #define ENCODE_STR(s)                          \
@@ -1238,8 +1233,4 @@ static long rxrpc_read(const struct key *key,
        ASSERTCMP((char __user *) xdr - buffer, ==, size);
        _leave(" = %zu", size);
        return size;
-
-fault:
-       _leave(" = -EFAULT");
-       return -EFAULT;
 }