]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/rxrpc/rxkad.c
Hibernation: Fix mark_nosave_pages()
[linux-2.6-omap-h63xx.git] / net / rxrpc / rxkad.c
index ac3cabdca78cb9e2ec3285cf3d6084315c336015..f48434adb7c242a5cae2e6cdbd074a43951aac1d 100644 (file)
@@ -135,9 +135,8 @@ static void rxkad_prime_packet_security(struct rxrpc_connection *conn)
        tmpbuf.x[2] = 0;
        tmpbuf.x[3] = htonl(conn->security_ix);
 
-       memset(sg, 0, sizeof(sg));
-       sg_set_buf(&sg[0], &tmpbuf, sizeof(tmpbuf));
-       sg_set_buf(&sg[1], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[0], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[1], &tmpbuf, sizeof(tmpbuf));
        crypto_blkcipher_encrypt_iv(&desc, &sg[0], &sg[1], sizeof(tmpbuf));
 
        memcpy(&conn->csum_iv, &tmpbuf.x[2], sizeof(conn->csum_iv));
@@ -180,9 +179,8 @@ static int rxkad_secure_packet_auth(const struct rxrpc_call *call,
        desc.info = iv.x;
        desc.flags = 0;
 
-       memset(sg, 0, sizeof(sg));
-       sg_set_buf(&sg[0], &tmpbuf, sizeof(tmpbuf));
-       sg_set_buf(&sg[1], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[0], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[1], &tmpbuf, sizeof(tmpbuf));
        crypto_blkcipher_encrypt_iv(&desc, &sg[0], &sg[1], sizeof(tmpbuf));
 
        memcpy(sechdr, &tmpbuf, sizeof(tmpbuf));
@@ -227,9 +225,8 @@ static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call,
        desc.info = iv.x;
        desc.flags = 0;
 
-       memset(sg, 0, sizeof(sg[0]) * 2);
-       sg_set_buf(&sg[0], sechdr, sizeof(rxkhdr));
-       sg_set_buf(&sg[1], &rxkhdr, sizeof(rxkhdr));
+       sg_init_one(&sg[0], sechdr, sizeof(rxkhdr));
+       sg_init_one(&sg[1], &rxkhdr, sizeof(rxkhdr));
        crypto_blkcipher_encrypt_iv(&desc, &sg[0], &sg[1], sizeof(rxkhdr));
 
        /* we want to encrypt the skbuff in-place */
@@ -240,6 +237,7 @@ static int rxkad_secure_packet_encrypt(const struct rxrpc_call *call,
        len = data_size + call->conn->size_align - 1;
        len &= ~(call->conn->size_align - 1);
 
+       sg_init_table(sg, nsg);
        skb_to_sgvec(skb, sg, 0, len);
        crypto_blkcipher_encrypt_iv(&desc, sg, sg, len);
 
@@ -286,13 +284,12 @@ static int rxkad_secure_packet(const struct rxrpc_call *call,
 
        /* calculate the security checksum */
        x = htonl(call->channel << (32 - RXRPC_CIDSHIFT));
-       x |= sp->hdr.seq & __constant_cpu_to_be32(0x3fffffff);
+       x |= sp->hdr.seq & cpu_to_be32(0x3fffffff);
        tmpbuf.x[0] = sp->hdr.callNumber;
        tmpbuf.x[1] = x;
 
-       memset(&sg, 0, sizeof(sg));
-       sg_set_buf(&sg[0], &tmpbuf, sizeof(tmpbuf));
-       sg_set_buf(&sg[1], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[0], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[1], &tmpbuf, sizeof(tmpbuf));
        crypto_blkcipher_encrypt_iv(&desc, &sg[0], &sg[1], sizeof(tmpbuf));
 
        x = ntohl(tmpbuf.x[1]);
@@ -332,19 +329,22 @@ static int rxkad_verify_packet_auth(const struct rxrpc_call *call,
        struct rxrpc_skb_priv *sp;
        struct blkcipher_desc desc;
        struct rxrpc_crypt iv;
-       struct scatterlist sg[2];
+       struct scatterlist sg[16];
        struct sk_buff *trailer;
        u32 data_size, buf;
        u16 check;
+       int nsg;
 
        _enter("");
 
        sp = rxrpc_skb(skb);
 
        /* we want to decrypt the skbuff in-place */
-       if (skb_cow_data(skb, 0, &trailer) < 0)
+       nsg = skb_cow_data(skb, 0, &trailer);
+       if (nsg < 0 || nsg > 16)
                goto nomem;
 
+       sg_init_table(sg, nsg);
        skb_to_sgvec(skb, sg, 0, 8);
 
        /* start the decryption afresh */
@@ -426,6 +426,7 @@ static int rxkad_verify_packet_encrypt(const struct rxrpc_call *call,
                        goto nomem;
        }
 
+       sg_init_table(sg, nsg);
        skb_to_sgvec(skb, sg, 0, skb->len);
 
        /* decrypt from the session key */
@@ -517,13 +518,12 @@ static int rxkad_verify_packet(const struct rxrpc_call *call,
 
        /* validate the security checksum */
        x = htonl(call->channel << (32 - RXRPC_CIDSHIFT));
-       x |= sp->hdr.seq & __constant_cpu_to_be32(0x3fffffff);
+       x |= sp->hdr.seq & cpu_to_be32(0x3fffffff);
        tmpbuf.x[0] = call->call_id;
        tmpbuf.x[1] = x;
 
-       memset(&sg, 0, sizeof(sg));
-       sg_set_buf(&sg[0], &tmpbuf, sizeof(tmpbuf));
-       sg_set_buf(&sg[1], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[0], &tmpbuf, sizeof(tmpbuf));
+       sg_init_one(&sg[1], &tmpbuf, sizeof(tmpbuf));
        crypto_blkcipher_encrypt_iv(&desc, &sg[0], &sg[1], sizeof(tmpbuf));
 
        x = ntohl(tmpbuf.x[1]);
@@ -690,16 +690,20 @@ static void rxkad_calc_response_checksum(struct rxkad_response *response)
 static void rxkad_sg_set_buf2(struct scatterlist sg[2],
                              void *buf, size_t buflen)
 {
+       int nsg = 1;
 
-       memset(sg, 0, sizeof(sg));
+       sg_init_table(sg, 2);
 
        sg_set_buf(&sg[0], buf, buflen);
        if (sg[0].offset + buflen > PAGE_SIZE) {
                /* the buffer was split over two pages */
                sg[0].length = PAGE_SIZE - sg[0].offset;
                sg_set_buf(&sg[1], buf + sg[0].length, buflen - sg[0].length);
+               nsg++;
        }
 
+       sg_mark_end(&sg[nsg - 1]);
+
        ASSERTCMP(sg[0].length + sg[1].length, ==, buflen);
 }
 
@@ -712,7 +716,7 @@ static void rxkad_encrypt_response(struct rxrpc_connection *conn,
 {
        struct blkcipher_desc desc;
        struct rxrpc_crypt iv;
-       struct scatterlist ssg[2], dsg[2];
+       struct scatterlist sg[2];
 
        /* continue encrypting from where we left off */
        memcpy(&iv, s2->session_key, sizeof(iv));
@@ -720,9 +724,8 @@ static void rxkad_encrypt_response(struct rxrpc_connection *conn,
        desc.info = iv.x;
        desc.flags = 0;
 
-       rxkad_sg_set_buf2(ssg, &resp->encrypted, sizeof(resp->encrypted));
-       memcpy(dsg, ssg, sizeof(dsg));
-       crypto_blkcipher_encrypt_iv(&desc, dsg, ssg, sizeof(resp->encrypted));
+       rxkad_sg_set_buf2(sg, &resp->encrypted, sizeof(resp->encrypted));
+       crypto_blkcipher_encrypt_iv(&desc, sg, sg, sizeof(resp->encrypted));
 }
 
 /*
@@ -817,7 +820,7 @@ static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
 {
        struct blkcipher_desc desc;
        struct rxrpc_crypt iv, key;
-       struct scatterlist ssg[1], dsg[1];
+       struct scatterlist sg[1];
        struct in_addr addr;
        unsigned life;
        time_t issue, now;
@@ -850,9 +853,8 @@ static int rxkad_decrypt_ticket(struct rxrpc_connection *conn,
        desc.info = iv.x;
        desc.flags = 0;
 
-       sg_init_one(&ssg[0], ticket, ticket_len);
-       memcpy(dsg, ssg, sizeof(dsg));
-       crypto_blkcipher_decrypt_iv(&desc, dsg, ssg, ticket_len);
+       sg_init_one(&sg[0], ticket, ticket_len);
+       crypto_blkcipher_decrypt_iv(&desc, sg, sg, ticket_len);
 
        p = ticket;
        end = p + ticket_len;
@@ -961,7 +963,7 @@ static void rxkad_decrypt_response(struct rxrpc_connection *conn,
                                   const struct rxrpc_crypt *session_key)
 {
        struct blkcipher_desc desc;
-       struct scatterlist ssg[2], dsg[2];
+       struct scatterlist sg[2];
        struct rxrpc_crypt iv;
 
        _enter(",,%08x%08x",
@@ -979,9 +981,8 @@ static void rxkad_decrypt_response(struct rxrpc_connection *conn,
        desc.info = iv.x;
        desc.flags = 0;
 
-       rxkad_sg_set_buf2(ssg, &resp->encrypted, sizeof(resp->encrypted));
-       memcpy(dsg, ssg, sizeof(dsg));
-       crypto_blkcipher_decrypt_iv(&desc, dsg, ssg, sizeof(resp->encrypted));
+       rxkad_sg_set_buf2(sg, &resp->encrypted, sizeof(resp->encrypted));
+       crypto_blkcipher_decrypt_iv(&desc, sg, sg, sizeof(resp->encrypted));
        mutex_unlock(&rxkad_ci_mutex);
 
        _leave("");
@@ -1020,6 +1021,7 @@ static int rxkad_verify_response(struct rxrpc_connection *conn,
 
        abort_code = RXKADINCONSISTENCY;
        if (version != RXKAD_VERSION)
+               goto protocol_error;
 
        abort_code = RXKADTICKETLEN;
        if (ticket_len < 4 || ticket_len > MAXKRB5TICKETLEN)