struct fw_device *device = client->device;
        struct fw_cdev_send_request *request = buffer;
        struct response *response;
+       int ret;
 
        /* What is the biggest size we'll accept, really? */
        if (request->length > 4096)
        if (request->data &&
            copy_from_user(response->response.data,
                           u64_to_uptr(request->data), request->length)) {
-               kfree(response);
-               return -EFAULT;
+               ret = -EFAULT;
+               goto err;
+       }
+
+       switch (request->tcode) {
+       case TCODE_WRITE_QUADLET_REQUEST:
+       case TCODE_WRITE_BLOCK_REQUEST:
+       case TCODE_READ_QUADLET_REQUEST:
+       case TCODE_READ_BLOCK_REQUEST:
+       case TCODE_LOCK_MASK_SWAP:
+       case TCODE_LOCK_COMPARE_SWAP:
+       case TCODE_LOCK_FETCH_ADD:
+       case TCODE_LOCK_LITTLE_ADD:
+       case TCODE_LOCK_BOUNDED_ADD:
+       case TCODE_LOCK_WRAP_ADD:
+       case TCODE_LOCK_VENDOR_DEPENDENT:
+               break;
+       default:
+               ret = -EINVAL;
+               goto err;
        }
 
        response->resource.release = release_transaction;
                return sizeof(request) + request->length;
        else
                return sizeof(request);
+ err:
+       kfree(response);
+
+       return ret;
 }
 
 struct address_handler {