Add additional RPC sanity checks.

Patch by: meder
Review by: bobv

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5559 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/user/server/rpc/RPC.java b/user/src/com/google/gwt/user/server/rpc/RPC.java
index 5a6ffa7..80a2fe8 100644
--- a/user/src/com/google/gwt/user/server/rpc/RPC.java
+++ b/user/src/com/google/gwt/user/server/rpc/RPC.java
@@ -269,6 +269,9 @@
       String serviceMethodName = streamReader.readString();
 
       int paramCount = streamReader.readInt();
+      if (paramCount > streamReader.getNumberOfTokens()) {
+        throw new IncompatibleRemoteServiceException("Invalid number of parameters");
+      }
       Class<?>[] parameterTypes = new Class[paramCount];
 
       for (int i = 0; i < parameterTypes.length; i++) {
diff --git a/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java b/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java
index 92f7eaf..1c0be0a 100644
--- a/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java
+++ b/user/src/com/google/gwt/user/server/rpc/RemoteServiceServlet.java
@@ -177,6 +177,9 @@
    */
   public String processCall(String payload) throws SerializationException {
     try {
+      if (getPermutationStrongName() == null) {
+        throw new SecurityException("Blocked request without GWT permutation header(XSRF attack?)");
+      }
       RPCRequest rpcRequest = RPC.decodeRequest(payload, this.getClass(), this);
       onAfterRequestDeserialized(rpcRequest);
       return RPC.invokeAndEncodeResponse(this, rpcRequest.getMethod(),
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
index 4b55d54..7dbef17 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/ServerSerializationStreamReader.java
@@ -373,6 +373,10 @@
     }
   }
 
+  public int getNumberOfTokens() {
+    return tokenList.size();
+  }
+
   public SerializationPolicy getSerializationPolicy() {
     return serializationPolicy;
   }