tcp: correct read of TFO keys on big endian systems
[linux-2.6-block.git] / net / ipv4 / sysctl_net_ipv4.c
index 5653e3b011bfd57e2f88130e726f868048a2c95c..54023a46db04720ac343549113dadd7fa6da9082 100644 (file)
@@ -301,24 +301,16 @@ static int proc_tcp_fastopen_key(struct ctl_table *table, int write,
        struct ctl_table tbl = { .maxlen = ((TCP_FASTOPEN_KEY_LENGTH *
                                            2 * TCP_FASTOPEN_KEY_MAX) +
                                            (TCP_FASTOPEN_KEY_MAX * 5)) };
-       struct tcp_fastopen_context *ctx;
-       u32 user_key[TCP_FASTOPEN_KEY_MAX * 4];
-       __le32 key[TCP_FASTOPEN_KEY_MAX * 4];
+       u32 user_key[TCP_FASTOPEN_KEY_BUF_LENGTH / sizeof(u32)];
+       __le32 key[TCP_FASTOPEN_KEY_BUF_LENGTH / sizeof(__le32)];
        char *backup_data;
-       int ret, i = 0, off = 0, n_keys = 0;
+       int ret, i = 0, off = 0, n_keys;
 
        tbl.data = kmalloc(tbl.maxlen, GFP_KERNEL);
        if (!tbl.data)
                return -ENOMEM;
 
-       rcu_read_lock();
-       ctx = rcu_dereference(net->ipv4.tcp_fastopen_ctx);
-       if (ctx) {
-               n_keys = tcp_fastopen_context_len(ctx);
-               memcpy(&key[0], &ctx->key[0], TCP_FASTOPEN_KEY_LENGTH * n_keys);
-       }
-       rcu_read_unlock();
-
+       n_keys = tcp_fastopen_get_cipher(net, NULL, (u64 *)key);
        if (!n_keys) {
                memset(&key[0], 0, TCP_FASTOPEN_KEY_LENGTH);
                n_keys = 1;