aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_udp.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-02-05 10:23:35 -0800
committerGarrett D'Amore <garrett@damore.org>2018-02-05 10:23:35 -0800
commit844ce972fed056e1c4e0517e43b814c62d68edce (patch)
treeadfa91e3f7188d268f3d081e80c14f7e8a609a87 /src/platform/posix/posix_udp.c
parentb893f8ff1f96dde567fa6a75f4b15bf69e53d6f5 (diff)
downloadnng-844ce972fed056e1c4e0517e43b814c62d68edce.tar.gz
nng-844ce972fed056e1c4e0517e43b814c62d68edce.tar.bz2
nng-844ce972fed056e1c4e0517e43b814c62d68edce.zip
fixes #228 aio iov should have larger limits (dynamically allocated)
Diffstat (limited to 'src/platform/posix/posix_udp.c')
-rw-r--r--src/platform/posix/posix_udp.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/src/platform/posix/posix_udp.c b/src/platform/posix/posix_udp.c
index e01f6883..cd7b0561 100644
--- a/src/platform/posix/posix_udp.c
+++ b/src/platform/posix/posix_udp.c
@@ -63,7 +63,7 @@ nni_posix_udp_dorecv(nni_plat_udp *udp)
// While we're able to recv, do so.
while ((aio = nni_list_first(q)) != NULL) {
struct iovec iov[4];
- int niov;
+ unsigned niov;
nni_iov * aiov;
struct sockaddr_storage ss;
nng_sockaddr * sa;
@@ -73,7 +73,7 @@ nni_posix_udp_dorecv(nni_plat_udp *udp)
nni_aio_get_iov(aio, &niov, &aiov);
- for (int i = 0; i < niov; i++) {
+ for (unsigned i = 0; i < niov; i++) {
iov[i].iov_base = aiov[i].iov_buf;
iov[i].iov_len = aiov[i].iov_len;
}
@@ -123,13 +123,28 @@ nni_posix_udp_dosend(nni_plat_udp *udp)
rv = NNG_EADDRINVAL;
} else {
struct msghdr hdr;
- struct iovec iov[4];
- int niov;
+ unsigned niov;
nni_iov * aiov;
+#ifdef NNG_HAVE_ALLOCA
+ struct iovec *iov;
+#else
+ struct iovec iov[16];
+#endif
nni_aio_get_iov(aio, &niov, &aiov);
+#ifdef NNG_HAVE_ALLOCA
+ if (niov > 64) {
+ rv = NNG_EINVAL;
+ } else {
+ iov = alloca(niov * sizeof(*iov));
+ }
+#else
+ if (niov > NNI_NUM_ELEMENTS(iov)) {
+ rv = NNG_EINVAL;
+ }
+#endif
- for (int i = 0; i < niov; i++) {
+ for (unsigned i = 0; i < niov; i++) {
iov[i].iov_base = aiov[i].iov_buf;
iov[i].iov_len = aiov[i].iov_len;
}