diff options
-rw-r--r-- | cmds/keystore/netkeystore.c | 1 | ||||
-rw-r--r-- | cmds/keystore/netkeystore.h | 8 | ||||
-rw-r--r-- | keystore/java/android/security/ServiceCommand.java | 31 |
3 files changed, 24 insertions, 16 deletions
diff --git a/cmds/keystore/netkeystore.c b/cmds/keystore/netkeystore.c index 637e0d8..bdd5960 100644 --- a/cmds/keystore/netkeystore.c +++ b/cmds/keystore/netkeystore.c @@ -242,6 +242,7 @@ static int set_read_timeout(int socket) { struct timeval tv; tv.tv_sec = READ_TIMEOUT; + tv.tv_usec = 0; if (setsockopt(socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof tv)) { LOGE("setsockopt failed"); diff --git a/cmds/keystore/netkeystore.h b/cmds/keystore/netkeystore.h index a87a667..d80ddae 100644 --- a/cmds/keystore/netkeystore.h +++ b/cmds/keystore/netkeystore.h @@ -19,6 +19,7 @@ #define __NETKEYSTORE_H__ #include <stdio.h> +#include <arpa/inet.h> #include <cutils/sockets.h> #include <cutils/log.h> @@ -68,6 +69,8 @@ static inline int read_marshal(int s, LPC_MARSHAL *cmd) LOGE("failed to read header\n"); return -1; } + cmd->len = ntohl(cmd->len); + cmd->opcode = ntohl(cmd->opcode); if (cmd->len > BUFFER_MAX) { LOGE("invalid size %d\n", cmd->len); return -1; @@ -82,11 +85,14 @@ static inline int read_marshal(int s, LPC_MARSHAL *cmd) static inline int write_marshal(int s, LPC_MARSHAL *cmd) { + int len = cmd->len; + cmd->len = htonl(cmd->len); + cmd->opcode = htonl(cmd->opcode); if (writex(s, cmd, 2 * sizeof(uint32_t))) { LOGE("failed to write marshal header\n"); return -1; } - if (writex(s, cmd->data, cmd->len)) { + if (writex(s, cmd->data, len)) { LOGE("failed to write marshal data\n"); return -1; } diff --git a/keystore/java/android/security/ServiceCommand.java b/keystore/java/android/security/ServiceCommand.java index dddf654..cefae40 100644 --- a/keystore/java/android/security/ServiceCommand.java +++ b/keystore/java/android/security/ServiceCommand.java @@ -121,15 +121,16 @@ public class ServiceCommand { Reply reply = new Reply(); if (!readBytes(buf, 4)) return null; - reply.len = (((int) buf[0]) & 0xff) | ((((int) buf[1]) & 0xff) << 8) | - ((((int) buf[2]) & 0xff) << 16) | - ((((int) buf[3]) & 0xff) << 24); + reply.len = ((((int) buf[0]) & 0xff) << 24) | + ((((int) buf[1]) & 0xff) << 16) | + ((((int) buf[2]) & 0xff) << 8) | + (((int) buf[3]) & 0xff); if (!readBytes(buf, 4)) return null; - reply.returnCode = (((int) buf[0]) & 0xff) | - ((((int) buf[1]) & 0xff) << 8) | - ((((int) buf[2]) & 0xff) << 16) | - ((((int) buf[3]) & 0xff) << 24); + reply.returnCode = ((((int) buf[0]) & 0xff) << 24) | + ((((int) buf[1]) & 0xff) << 16) | + ((((int) buf[2]) & 0xff) << 8) | + (((int) buf[3]) & 0xff); if (reply.len > BUFFER_LENGTH) { Log.e(mTag,"invalid reply length (" + reply.len + ")"); @@ -145,15 +146,15 @@ public class ServiceCommand { byte[] data = (_data == null) ? new byte[0] : _data.getBytes(); int len = data.length; // the length of data - buf[0] = (byte) (len & 0xff); - buf[1] = (byte) ((len >> 8) & 0xff); - buf[2] = (byte) ((len >> 16) & 0xff); - buf[3] = (byte) ((len >> 24) & 0xff); + buf[0] = (byte) ((len >> 24) & 0xff); + buf[1] = (byte) ((len >> 16) & 0xff); + buf[2] = (byte) ((len >> 8) & 0xff); + buf[3] = (byte) (len & 0xff); // the opcode of the command - buf[4] = (byte) (cmd & 0xff); - buf[5] = (byte) ((cmd >> 8) & 0xff); - buf[6] = (byte) ((cmd >> 16) & 0xff); - buf[7] = (byte) ((cmd >> 24) & 0xff); + buf[4] = (byte) ((cmd >> 24) & 0xff); + buf[5] = (byte) ((cmd >> 16) & 0xff); + buf[6] = (byte) ((cmd >> 8) & 0xff); + buf[7] = (byte) (cmd & 0xff); try { mOut.write(buf, 0, 8); mOut.write(data, 0, len); |