From 1c91d2a630d7197697838fa65099c967ffa02ea3 Mon Sep 17 00:00:00 2001 From: Trevor Norris Date: Tue, 28 Feb 2017 21:58:44 -0700 Subject: [PATCH] win,unix: uv_buf_init() accepts size_t Change the signature of uv_buf_init() from (char*, unsigned int) to (char*, size_t). This is to accommodate the fact that the "len" property of uv_buf_t is a size_t, and fixes a problem where "len" is truncated for large "base". Fixes: https://github.com/libuv/libuv/issues/1233 Refs: https://github.com/libuv/libuv/pull/1236 PR-URL: https://github.com/libuv/libuv/pull/1806 Reviewed-By: Colin Ihrig Reviewed-By: Santiago Gimeno Reviewed-By: Ben Noordhuis --- Makefile.am | 1 + checksparse.sh | 1 + include/uv.h | 2 +- src/unix/core.c | 9 --------- src/uv-common.c | 2 +- test/test-buf.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ test/test-list.h | 2 ++ test/test.gyp | 1 + 8 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 test/test-buf.c diff --git a/Makefile.am b/Makefile.am index 2605aff2..f8b61c61 100644 --- a/Makefile.am +++ b/Makefile.am @@ -153,6 +153,7 @@ test_run_tests_SOURCES = test/blackhole-server.c \ test/test-async.c \ test/test-async-null-cb.c \ test/test-barrier.c \ + test/test-buf.c \ test/test-callback-order.c \ test/test-callback-stack.c \ test/test-close-fd.c \ diff --git a/checksparse.sh b/checksparse.sh index 691833eb..d312aa27 100755 --- a/checksparse.sh +++ b/checksparse.sh @@ -86,6 +86,7 @@ test/task.h test/test-active.c test/test-async.c test/test-barrier.c +test/test-buf.c test/test-callback-order.c test/test-callback-stack.c test/test-condvar.c diff --git a/include/uv.h b/include/uv.h index e550b417..7fe8a842 100644 --- a/include/uv.h +++ b/include/uv.h @@ -445,7 +445,7 @@ UV_EXTERN int uv_recv_buffer_size(uv_handle_t* handle, int* value); UV_EXTERN int uv_fileno(const uv_handle_t* handle, uv_os_fd_t* fd); -UV_EXTERN uv_buf_t uv_buf_init(char* base, unsigned int len); +UV_EXTERN uv_buf_t uv_buf_init(char* base, size_t len); /* diff --git a/src/unix/core.c b/src/unix/core.c index 0149b73e..1a823533 100644 --- a/src/unix/core.c +++ b/src/unix/core.c @@ -98,15 +98,6 @@ static int uv__run_pending(uv_loop_t* loop); -/* Verify that uv_buf_t is ABI-compatible with struct iovec. */ -STATIC_ASSERT(sizeof(uv_buf_t) == sizeof(struct iovec)); -STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->base) == - sizeof(((struct iovec*) 0)->iov_base)); -STATIC_ASSERT(sizeof(&((uv_buf_t*) 0)->len) == - sizeof(((struct iovec*) 0)->iov_len)); -STATIC_ASSERT(offsetof(uv_buf_t, base) == offsetof(struct iovec, iov_base)); -STATIC_ASSERT(offsetof(uv_buf_t, len) == offsetof(struct iovec, iov_len)); - uint64_t uv_hrtime(void) { return uv__hrtime(UV_CLOCK_PRECISE); diff --git a/src/uv-common.c b/src/uv-common.c index 786d52f1..4579f4a8 100644 --- a/src/uv-common.c +++ b/src/uv-common.c @@ -137,7 +137,7 @@ size_t uv_loop_size(void) { } -uv_buf_t uv_buf_init(char* base, unsigned int len) { +uv_buf_t uv_buf_init(char* base, size_t len) { uv_buf_t buf; buf.base = base; buf.len = len; diff --git a/test/test-buf.c b/test/test-buf.c new file mode 100644 index 00000000..7889df5c --- /dev/null +++ b/test/test-buf.c @@ -0,0 +1,47 @@ +/* Copyright libuv contributors. All rights reserved. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "uv.h" +#include "task.h" + +#include + +TEST_IMPL(buf_large) { + uv_buf_t buf; + + buf = uv_buf_init(NULL, SIZE_MAX); + ASSERT(buf.len == SIZE_MAX); +#ifdef _WIN32 + WSABUF* wbuf; + + wbuf = (WSABUF*) &buf; + ASSERT(wbuf->len == buf.len); +#else + struct iovec* iobuf; + + iobuf = (struct iovec*) &buf; + ASSERT(iobuf->iov_len == buf.len); + + /* Verify that uv_buf_t is ABI-compatible with struct iovec. */ + ASSERT(sizeof(uv_buf_t) == sizeof(struct iovec)); + ASSERT(sizeof(&((uv_buf_t*) 0)->base) == + sizeof(((struct iovec*) 0)->iov_base)); + ASSERT(sizeof(&((uv_buf_t*) 0)->len) == sizeof(((struct iovec*) 0)->iov_len)); + ASSERT(offsetof(uv_buf_t, base) == offsetof(struct iovec, iov_base)); + ASSERT(offsetof(uv_buf_t, len) == offsetof(struct iovec, iov_len)); +#endif + + return 0; +} diff --git a/test/test-list.h b/test/test-list.h index e46e2fda..2396e4e2 100644 --- a/test/test-list.h +++ b/test/test-list.h @@ -37,6 +37,7 @@ TEST_DECLARE (default_loop_close) TEST_DECLARE (barrier_1) TEST_DECLARE (barrier_2) TEST_DECLARE (barrier_3) +TEST_DECLARE (buf_large) TEST_DECLARE (condvar_1) TEST_DECLARE (condvar_2) TEST_DECLARE (condvar_3) @@ -456,6 +457,7 @@ TASK_LIST_START TEST_ENTRY (barrier_1) TEST_ENTRY (barrier_2) TEST_ENTRY (barrier_3) + TEST_ENTRY (buf_large) TEST_ENTRY (condvar_1) TEST_ENTRY (condvar_2) TEST_ENTRY (condvar_3) diff --git a/test/test.gyp b/test/test.gyp index 7ac1fa26..bb477b20 100644 --- a/test/test.gyp +++ b/test/test.gyp @@ -125,6 +125,7 @@ 'test-mutexes.c', 'test-thread.c', 'test-barrier.c', + 'test-buf.c', 'test-condvar.c', 'test-timer-again.c', 'test-timer-from-check.c',