Loading fs/ceph/buffer.c +17 −0 Original line number Diff line number Diff line #include "ceph_debug.h" #include "buffer.h" #include "decode.h" struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp) { Loading Loading @@ -59,3 +60,19 @@ int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) return 0; } int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end) { size_t len; ceph_decode_need(p, end, sizeof(u32), bad); len = ceph_decode_32(p); dout("decode_buffer len %d\n", (int)len); ceph_decode_need(p, end, len, bad); *b = ceph_buffer_new(len, GFP_NOFS); if (!*b) return -ENOMEM; ceph_decode_copy(p, (*b)->vec.iov_base, len); return 0; bad: return -EINVAL; } fs/ceph/buffer.h +2 −0 Original line number Diff line number Diff line Loading @@ -34,4 +34,6 @@ static inline void ceph_buffer_put(struct ceph_buffer *b) kref_put(&b->kref, ceph_buffer_release); } extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end); #endif fs/ceph/decode.h +34 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #define __CEPH_DECODE_H #include <asm/unaligned.h> #include <linux/time.h> #include "types.h" Loading Loading @@ -65,6 +66,11 @@ static inline void ceph_decode_copy(void **p, void *pv, size_t n) ceph_decode_need(p, end, sizeof(u16), bad); \ v = ceph_decode_16(p); \ } while (0) #define ceph_decode_8_safe(p, end, v, bad) \ do { \ ceph_decode_need(p, end, sizeof(u8), bad); \ v = ceph_decode_8(p); \ } while (0) #define ceph_decode_copy_safe(p, end, pv, n, bad) \ do { \ Loading Loading @@ -156,5 +162,33 @@ static inline void ceph_encode_string(void **p, void *end, *p += len; } #define ceph_encode_need(p, end, n, bad) \ do { \ if (unlikely(*(p) + (n) > (end))) \ goto bad; \ } while (0) #define ceph_encode_64_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u64), bad); \ ceph_encode_64(p, v); \ } while (0) #define ceph_encode_32_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u32), bad); \ ceph_encode_32(p, v); \ } while (0) #define ceph_encode_16_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u16), bad); \ ceph_encode_16(p, v); \ } while (0) #define ceph_encode_copy_safe(p, end, pv, n, bad) \ do { \ ceph_encode_need(p, end, n, bad); \ ceph_encode_copy(p, pv, n); \ } while (0) #endif Loading
fs/ceph/buffer.c +17 −0 Original line number Diff line number Diff line #include "ceph_debug.h" #include "buffer.h" #include "decode.h" struct ceph_buffer *ceph_buffer_new(size_t len, gfp_t gfp) { Loading Loading @@ -59,3 +60,19 @@ int ceph_buffer_alloc(struct ceph_buffer *b, int len, gfp_t gfp) return 0; } int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end) { size_t len; ceph_decode_need(p, end, sizeof(u32), bad); len = ceph_decode_32(p); dout("decode_buffer len %d\n", (int)len); ceph_decode_need(p, end, len, bad); *b = ceph_buffer_new(len, GFP_NOFS); if (!*b) return -ENOMEM; ceph_decode_copy(p, (*b)->vec.iov_base, len); return 0; bad: return -EINVAL; }
fs/ceph/buffer.h +2 −0 Original line number Diff line number Diff line Loading @@ -34,4 +34,6 @@ static inline void ceph_buffer_put(struct ceph_buffer *b) kref_put(&b->kref, ceph_buffer_release); } extern int ceph_decode_buffer(struct ceph_buffer **b, void **p, void *end); #endif
fs/ceph/decode.h +34 −0 Original line number Diff line number Diff line Loading @@ -2,6 +2,7 @@ #define __CEPH_DECODE_H #include <asm/unaligned.h> #include <linux/time.h> #include "types.h" Loading Loading @@ -65,6 +66,11 @@ static inline void ceph_decode_copy(void **p, void *pv, size_t n) ceph_decode_need(p, end, sizeof(u16), bad); \ v = ceph_decode_16(p); \ } while (0) #define ceph_decode_8_safe(p, end, v, bad) \ do { \ ceph_decode_need(p, end, sizeof(u8), bad); \ v = ceph_decode_8(p); \ } while (0) #define ceph_decode_copy_safe(p, end, pv, n, bad) \ do { \ Loading Loading @@ -156,5 +162,33 @@ static inline void ceph_encode_string(void **p, void *end, *p += len; } #define ceph_encode_need(p, end, n, bad) \ do { \ if (unlikely(*(p) + (n) > (end))) \ goto bad; \ } while (0) #define ceph_encode_64_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u64), bad); \ ceph_encode_64(p, v); \ } while (0) #define ceph_encode_32_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u32), bad); \ ceph_encode_32(p, v); \ } while (0) #define ceph_encode_16_safe(p, end, v, bad) \ do { \ ceph_encode_need(p, end, sizeof(u16), bad); \ ceph_encode_16(p, v); \ } while (0) #define ceph_encode_copy_safe(p, end, pv, n, bad) \ do { \ ceph_encode_need(p, end, n, bad); \ ceph_encode_copy(p, pv, n); \ } while (0) #endif