unix, win: consistently null-terminate buffers
libuv has multiple functions which return buffers. Make them consistent with the following rules: the returned size *does not* include the null byte, but the buffer *is* null terminated. There is only one exception to the above: Linux abstract sockets, because null bytes are not used as string terminators in those. Refs: https://github.com/libuv/libuv/pull/674 PR-URL: https://github.com/libuv/libuv/pull/690 Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
This commit is contained in:
parent
e76e21389b
commit
e5f4b79809
@ -138,13 +138,14 @@ int uv_fs_poll_getpath(uv_fs_poll_t* handle, char* buffer, size_t* size) {
|
|||||||
assert(ctx != NULL);
|
assert(ctx != NULL);
|
||||||
|
|
||||||
required_len = strlen(ctx->path);
|
required_len = strlen(ctx->path);
|
||||||
if (required_len > *size) {
|
if (required_len >= *size) {
|
||||||
*size = required_len;
|
*size = required_len;
|
||||||
return UV_ENOBUFS;
|
return UV_ENOBUFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(buffer, ctx->path, required_len);
|
memcpy(buffer, ctx->path, required_len);
|
||||||
*size = required_len;
|
*size = required_len;
|
||||||
|
buffer[required_len] = '\0';
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -234,7 +234,7 @@ static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
|
|||||||
addrlen = strlen(sa.sun_path);
|
addrlen = strlen(sa.sun_path);
|
||||||
|
|
||||||
|
|
||||||
if (addrlen > *size) {
|
if (addrlen >= *size) {
|
||||||
*size = addrlen;
|
*size = addrlen;
|
||||||
return UV_ENOBUFS;
|
return UV_ENOBUFS;
|
||||||
}
|
}
|
||||||
@ -242,6 +242,10 @@ static int uv__pipe_getsockpeername(const uv_pipe_t* handle,
|
|||||||
memcpy(buffer, sa.sun_path, addrlen);
|
memcpy(buffer, sa.sun_path, addrlen);
|
||||||
*size = addrlen;
|
*size = addrlen;
|
||||||
|
|
||||||
|
/* only null-terminate if it's not an abstract socket */
|
||||||
|
if (buffer[0] != '\0')
|
||||||
|
buffer[addrlen] = '\0';
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -451,13 +451,14 @@ int uv_fs_event_getpath(uv_fs_event_t* handle, char* buffer, size_t* size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
required_len = strlen(handle->path);
|
required_len = strlen(handle->path);
|
||||||
if (required_len > *size) {
|
if (required_len >= *size) {
|
||||||
*size = required_len;
|
*size = required_len;
|
||||||
return UV_ENOBUFS;
|
return UV_ENOBUFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(buffer, handle->path, required_len);
|
memcpy(buffer, handle->path, required_len);
|
||||||
*size = required_len;
|
*size = required_len;
|
||||||
|
buffer[required_len] = '\0';
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2038,7 +2038,7 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
|
|||||||
*size = 0;
|
*size = 0;
|
||||||
err = uv_translate_sys_error(GetLastError());
|
err = uv_translate_sys_error(GetLastError());
|
||||||
goto error;
|
goto error;
|
||||||
} else if (pipe_prefix_len + addrlen > *size) {
|
} else if (pipe_prefix_len + addrlen >= *size) {
|
||||||
/* "\\\\.\\pipe" + name */
|
/* "\\\\.\\pipe" + name */
|
||||||
*size = pipe_prefix_len + addrlen;
|
*size = pipe_prefix_len + addrlen;
|
||||||
err = UV_ENOBUFS;
|
err = UV_ENOBUFS;
|
||||||
@ -2062,6 +2062,7 @@ static int uv__pipe_getname(const uv_pipe_t* handle, char* buffer, size_t* size)
|
|||||||
|
|
||||||
addrlen += pipe_prefix_len;
|
addrlen += pipe_prefix_len;
|
||||||
*size = addrlen;
|
*size = addrlen;
|
||||||
|
buffer[addrlen] = '\0';
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|||||||
@ -819,6 +819,7 @@ TEST_IMPL(fs_event_getpath) {
|
|||||||
r = uv_fs_event_getpath(&fs_event, buf, &len);
|
r = uv_fs_event_getpath(&fs_event, buf, &len);
|
||||||
ASSERT(r == 0);
|
ASSERT(r == 0);
|
||||||
ASSERT(buf[len - 1] != 0);
|
ASSERT(buf[len - 1] != 0);
|
||||||
|
ASSERT(buf[len] == '\0');
|
||||||
ASSERT(memcmp(buf, "watch_dir", len) == 0);
|
ASSERT(memcmp(buf, "watch_dir", len) == 0);
|
||||||
r = uv_fs_event_stop(&fs_event);
|
r = uv_fs_event_stop(&fs_event);
|
||||||
ASSERT(r == 0);
|
ASSERT(r == 0);
|
||||||
|
|||||||
@ -173,6 +173,7 @@ TEST_IMPL(fs_poll_getpath) {
|
|||||||
len = sizeof buf;
|
len = sizeof buf;
|
||||||
ASSERT(0 == uv_fs_poll_getpath(&poll_handle, buf, &len));
|
ASSERT(0 == uv_fs_poll_getpath(&poll_handle, buf, &len));
|
||||||
ASSERT(buf[len - 1] != 0);
|
ASSERT(buf[len - 1] != 0);
|
||||||
|
ASSERT(buf[len] == '\0');
|
||||||
ASSERT(0 == memcmp(buf, FIXTURE, len));
|
ASSERT(0 == memcmp(buf, FIXTURE, len));
|
||||||
|
|
||||||
uv_close((uv_handle_t*) &poll_handle, close_cb);
|
uv_close((uv_handle_t*) &poll_handle, close_cb);
|
||||||
|
|||||||
@ -114,6 +114,7 @@ TEST_IMPL(pipe_getsockname) {
|
|||||||
ASSERT(r == 0);
|
ASSERT(r == 0);
|
||||||
|
|
||||||
ASSERT(buf[len - 1] != 0);
|
ASSERT(buf[len - 1] != 0);
|
||||||
|
ASSERT(buf[len] == '\0');
|
||||||
ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0);
|
ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0);
|
||||||
|
|
||||||
len = sizeof buf;
|
len = sizeof buf;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user