From 216f7febb4924ce5136b12a02d34941367dc0ceb Mon Sep 17 00:00:00 2001 From: Julien Desfossez Date: Thu, 20 Sep 2012 12:00:05 -0400 Subject: [PATCH] Fix ring buffer 32/64 bits compat The type of fields exchanged between kernel and userspace must be compat_ulong_t instead of unsigned long in case of compat where userspace is 32 bits and kernel is 64 bits. Signed-off-by: Julien Desfossez Signed-off-by: Mathieu Desnoyers --- lib/ringbuffer/ring_buffer_vfs.c | 26 +++++++++++++------------- lib/ringbuffer/vfs.h | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/lib/ringbuffer/ring_buffer_vfs.c b/lib/ringbuffer/ring_buffer_vfs.c index 034c6fdd..c69b64e1 100644 --- a/lib/ringbuffer/ring_buffer_vfs.c +++ b/lib/ringbuffer/ring_buffer_vfs.c @@ -280,14 +280,14 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EIO; switch (cmd) { - case RING_BUFFER_SNAPSHOT: + case RING_BUFFER_COMPAT_SNAPSHOT: return lib_ring_buffer_snapshot(buf, &buf->cons_snapshot, &buf->prod_snapshot); - case RING_BUFFER_SNAPSHOT_GET_CONSUMED: + case RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED: return compat_put_ulong(buf->cons_snapshot, arg); - case RING_BUFFER_SNAPSHOT_GET_PRODUCED: + case RING_BUFFER_COMPAT_SNAPSHOT_GET_PRODUCED: return compat_put_ulong(buf->prod_snapshot, arg); - case RING_BUFFER_GET_SUBBUF: + case RING_BUFFER_COMPAT_GET_SUBBUF: { __u32 uconsume; unsigned long consume; @@ -306,11 +306,11 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, } return ret; } - case RING_BUFFER_PUT_SUBBUF: + case RING_BUFFER_COMPAT_PUT_SUBBUF: lib_ring_buffer_put_subbuf(buf); return 0; - case RING_BUFFER_GET_NEXT_SUBBUF: + case RING_BUFFER_COMPAT_GET_NEXT_SUBBUF: { long ret; @@ -321,10 +321,10 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, } return ret; } - case RING_BUFFER_PUT_NEXT_SUBBUF: + case RING_BUFFER_COMPAT_PUT_NEXT_SUBBUF: lib_ring_buffer_put_next_subbuf(buf); return 0; - case RING_BUFFER_GET_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_SUBBUF_SIZE: { unsigned long data_size; @@ -333,7 +333,7 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EFBIG; return put_ulong(data_size, arg); } - case RING_BUFFER_GET_PADDED_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_PADDED_SUBBUF_SIZE: { unsigned long size; @@ -343,11 +343,11 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EFBIG; return put_ulong(size, arg); } - case RING_BUFFER_GET_MAX_SUBBUF_SIZE: + case RING_BUFFER_COMPAT_GET_MAX_SUBBUF_SIZE: if (chan->backend.subbuf_size > UINT_MAX) return -EFBIG; return put_ulong(chan->backend.subbuf_size, arg); - case RING_BUFFER_GET_MMAP_LEN: + case RING_BUFFER_COMPAT_GET_MMAP_LEN: { unsigned long mmap_buf_len; @@ -360,7 +360,7 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EFBIG; return put_ulong(mmap_buf_len, arg); } - case RING_BUFFER_GET_MMAP_READ_OFFSET: + case RING_BUFFER_COMPAT_GET_MMAP_READ_OFFSET: { unsigned long sb_bindex, read_offset; @@ -373,7 +373,7 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, return -EINVAL; return put_ulong(read_offset, arg); } - case RING_BUFFER_FLUSH: + case RING_BUFFER_COMPAT_FLUSH: lib_ring_buffer_switch_slow(buf, SWITCH_ACTIVE); return 0; default: diff --git a/lib/ringbuffer/vfs.h b/lib/ringbuffer/vfs.h index 4a3f92b0..ffeef449 100644 --- a/lib/ringbuffer/vfs.h +++ b/lib/ringbuffer/vfs.h @@ -72,30 +72,46 @@ long lib_ring_buffer_compat_ioctl(struct file *filp, unsigned int cmd, /* Get a snapshot of the current ring buffer producer and consumer positions */ #define RING_BUFFER_SNAPSHOT _IO(0xF6, 0x00) +#define RING_BUFFER_COMPAT_SNAPSHOT RING_BUFFER_SNAPSHOT /* Get the consumer position (iteration start) */ #define RING_BUFFER_SNAPSHOT_GET_CONSUMED _IOR(0xF6, 0x01, unsigned long) +#define RING_BUFFER_COMPAT_SNAPSHOT_GET_CONSUMED \ + _IOR(0xF6, 0x01, compat_ulong_t) /* Get the producer position (iteration end) */ #define RING_BUFFER_SNAPSHOT_GET_PRODUCED _IOR(0xF6, 0x02, unsigned long) +#define RING_BUFFER_COMPAT_SNAPSHOT_GET_PRODUCED \ + _IOR(0xF6, 0x02, compat_ulong_t) /* Get exclusive read access to the specified sub-buffer position */ #define RING_BUFFER_GET_SUBBUF _IOW(0xF6, 0x03, unsigned long) +#define RING_BUFFER_COMPAT_GET_SUBBUF _IOW(0xF6, 0x03, compat_ulong_t) /* Release exclusive sub-buffer access */ #define RING_BUFFER_PUT_SUBBUF _IO(0xF6, 0x04) +#define RING_BUFFER_COMPAT_PUT_SUBBUF RING_BUFFER_PUT_SUBBUF /* Get exclusive read access to the next sub-buffer that can be read. */ #define RING_BUFFER_GET_NEXT_SUBBUF _IO(0xF6, 0x05) +#define RING_BUFFER_COMPAT_GET_NEXT_SUBBUF RING_BUFFER_GET_NEXT_SUBBUF /* Release exclusive sub-buffer access, move consumer forward. */ #define RING_BUFFER_PUT_NEXT_SUBBUF _IO(0xF6, 0x06) +#define RING_BUFFER_COMPAT_PUT_NEXT_SUBBUF RING_BUFFER_PUT_NEXT_SUBBUF /* returns the size of the current sub-buffer, without padding (for mmap). */ #define RING_BUFFER_GET_SUBBUF_SIZE _IOR(0xF6, 0x07, unsigned long) +#define RING_BUFFER_COMPAT_GET_SUBBUF_SIZE _IOR(0xF6, 0x07, compat_ulong_t) /* returns the size of the current sub-buffer, with padding (for splice). */ #define RING_BUFFER_GET_PADDED_SUBBUF_SIZE _IOR(0xF6, 0x08, unsigned long) +#define RING_BUFFER_COMPAT_GET_PADDED_SUBBUF_SIZE \ + _IOR(0xF6, 0x08, compat_ulong_t) /* returns the maximum size for sub-buffers. */ #define RING_BUFFER_GET_MAX_SUBBUF_SIZE _IOR(0xF6, 0x09, unsigned long) +#define RING_BUFFER_COMPAT_GET_MAX_SUBBUF_SIZE _IOR(0xF6, 0x09, compat_ulong_t) /* returns the length to mmap. */ #define RING_BUFFER_GET_MMAP_LEN _IOR(0xF6, 0x0A, unsigned long) +#define RING_BUFFER_COMPAT_GET_MMAP_LEN _IOR(0xF6, 0x0A, compat_ulong_t) /* returns the offset of the subbuffer belonging to the mmap reader. */ #define RING_BUFFER_GET_MMAP_READ_OFFSET _IOR(0xF6, 0x0B, unsigned long) +#define RING_BUFFER_COMPAT_GET_MMAP_READ_OFFSET _IOR(0xF6, 0x0B, compat_ulong_t) /* flush the current sub-buffer */ #define RING_BUFFER_FLUSH _IO(0xF6, 0x0C) +#define RING_BUFFER_COMPAT_FLUSH RING_BUFFER_FLUSH #endif /* _LIB_RING_BUFFER_VFS_H */ -- 2.34.1