2011-02-15 04:39:04

by Anton Blanchard

[permalink] [raw]
Subject: RxRPC: Fix v1 keys


commit 339412841d7 (RxRPC: Allow key payloads to be passed in XDR form)
broke klog for me. I notice the v1 key struct had a kif_version field
added:

-struct rxkad_key {
- u16 security_index; /* RxRPC header security index */
- u16 ticket_len; /* length of ticket[] */
- u32 expiry; /* time at which expires */
- u32 kvno; /* key version number */
- u8 session_key[8]; /* DES session key */
- u8 ticket[0]; /* the encrypted ticket */
-};

+struct rxrpc_key_data_v1 {
+ u32 kif_version; /* 1 */
+ u16 security_index;
+ u16 ticket_length;
+ u32 expiry; /* time_t */
+ u32 kvno;
+ u8 session_key[8];
+ u8 ticket[0];
+};

However the code in rxrpc_instantiate strips it away:

data += sizeof(kver);
datalen -= sizeof(kver);

Removing kif_version fixes my problem.

Signed-off-by: Anton Blanchard <[email protected]>
---

Index: linux-2.6/include/keys/rxrpc-type.h
===================================================================
--- linux-2.6.orig/include/keys/rxrpc-type.h 2011-02-14 12:12:21.874546332 +1100
+++ linux-2.6/include/keys/rxrpc-type.h 2011-02-14 12:12:26.615010317 +1100
@@ -99,7 +99,6 @@ struct rxrpc_key_token {
* structure of raw payloads passed to add_key() or instantiate key
*/
struct rxrpc_key_data_v1 {
- u32 kif_version; /* 1 */
u16 security_index;
u16 ticket_length;
u32 expiry; /* time_t */


2011-02-15 04:42:17

by Anton Blanchard

[permalink] [raw]
Subject: afs: Fix oops in afs_unlink_writeback

To: David Howells <[email protected]>
Cc: [email protected], [email protected]
Subject: afs: Fix oops in afs_unlink_writeback

I'm seeing the following oops when testing afs:

Unable to handle kernel paging request for data at address 0x00000008
...
NIP [c0000000003393b0] .afs_unlink_writeback+0x38/0xc0
LR [c00000000033987c] .afs_put_writeback+0x98/0xec
Call Trace:
[c00000000345f600] [c00000000033987c] .afs_put_writeback+0x98/0xec
[c00000000345f690] [c00000000033ae80] .afs_write_begin+0x6a4/0x75c
[c00000000345f790] [c00000000012b77c] .generic_file_buffered_write+0x148/0x320
[c00000000345f8d0] [c00000000012e1b8] .__generic_file_aio_write+0x37c/0x3e4
[c00000000345f9d0] [c00000000012e2a8] .generic_file_aio_write+0x88/0xfc
[c00000000345fa90] [c0000000003390a8] .afs_file_write+0x10c/0x178
[c00000000345fb40] [c000000000188788] .do_sync_write+0xc4/0x128
[c00000000345fcc0] [c000000000189658] .vfs_write+0xe8/0x1d8
[c00000000345fd70] [c000000000189884] .SyS_write+0x68/0xb0
[c00000000345fe30] [c000000000008564] syscall_exit+0x0/0x40

afs_write_begin hits an error and calls afs_unlink_writeback. In there
we do list_del_init on an uninitialised list.

The patch below initialises ->link when creating the afs_writeback struct.

Signed-off-by: Anton Blanchard <[email protected]>
---

Index: linux-2.6/fs/afs/write.c
===================================================================
--- linux-2.6.orig/fs/afs/write.c 2011-02-15 08:57:38.941571526 +1100
+++ linux-2.6/fs/afs/write.c 2011-02-15 13:50:34.793404142 +1100
@@ -144,6 +144,7 @@ int afs_write_begin(struct file *file, s
candidate->first = candidate->last = index;
candidate->offset_first = from;
candidate->to_last = to;
+ INIT_LIST_HEAD(&candidate->link);
candidate->usage = 1;
candidate->state = AFS_WBACK_PENDING;
init_waitqueue_head(&candidate->waitq);

2011-02-25 15:49:47

by David Howells

[permalink] [raw]
Subject: Re: RxRPC: Fix v1 keys

Anton Blanchard <[email protected]> wrote:

> commit 339412841d7 (RxRPC: Allow key payloads to be passed in XDR form)
> broke klog for me. I notice the v1 key struct had a kif_version field
> added:

Hmmm... I published a new version of klog at the same time, so just removing
kif_version will break that:-/

I'll have to come up with a way of detecting which you're doing. But first, I
need to attempt to resuscitate my OpenAFS server.

David

2011-02-28 14:19:45

by David Howells

[permalink] [raw]
Subject: Re: RxRPC: Fix v1 keys

David Howells <[email protected]> wrote:

> Anton Blanchard <[email protected]> wrote:
>
> > commit 339412841d7 (RxRPC: Allow key payloads to be passed in XDR form)
> > broke klog for me. I notice the v1 key struct had a kif_version field
> > added:
>
> Hmmm... I published a new version of klog at the same time, so just removing
> kif_version will break that:-/
>
> I'll have to come up with a way of detecting which you're doing. But first,
> I need to attempt to resuscitate my OpenAFS server.

You're right. Patch signed off and sent on.

David