diff options
| author | Garrett D'Amore <garrett@damore.org> | 2018-02-05 10:23:35 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2018-02-05 10:23:35 -0800 |
| commit | 844ce972fed056e1c4e0517e43b814c62d68edce (patch) | |
| tree | adfa91e3f7188d268f3d081e80c14f7e8a609a87 /src/platform/posix | |
| parent | b893f8ff1f96dde567fa6a75f4b15bf69e53d6f5 (diff) | |
| download | nng-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')
| -rw-r--r-- | src/platform/posix/posix_pipedesc.c | 58 | ||||
| -rw-r--r-- | src/platform/posix/posix_udp.c | 25 |
2 files changed, 66 insertions, 17 deletions
diff --git a/src/platform/posix/posix_pipedesc.c b/src/platform/posix/posix_pipedesc.c index 23d69e51..f387c60c 100644 --- a/src/platform/posix/posix_pipedesc.c +++ b/src/platform/posix/posix_pipedesc.c @@ -69,14 +69,32 @@ nni_posix_pipedesc_dowrite(nni_posix_pipedesc *pd) nni_aio *aio; while ((aio = nni_list_first(&pd->writeq)) != NULL) { - int i; - int n; - struct iovec iovec[4]; - int niov; - int naiov; - nni_iov * aiov; + unsigned i; + int n; + int niov; + unsigned naiov; + nni_iov *aiov; +#ifdef NNG_HAVE_ALLOCA + struct iovec *iovec; +#else + struct iovec iovec[16]; +#endif nni_aio_get_iov(aio, &naiov, &aiov); + +#ifdef NNG_HAVE_ALLOCA + if (naiov > 64) { + nni_posix_pipedesc_finish(aio, NNG_EINVAL); + continue; + } + iovec = alloca(naiov * sizeof(*iovec)); +#else + if (naiov > NNI_NUM_ELEMENTS(iovec)) { + nni_posix_pipedesc_finish(aio, NNG_EINVAL); + continue; + } +#endif + for (niov = 0, i = 0; i < naiov; i++) { if (aiov[i].iov_len > 0) { iovec[niov].iov_len = aiov[i].iov_len; @@ -112,14 +130,30 @@ nni_posix_pipedesc_doread(nni_posix_pipedesc *pd) nni_aio *aio; while ((aio = nni_list_first(&pd->readq)) != NULL) { - int i; - int n; - struct iovec iovec[4]; - int niov; - int naiov; - nni_iov * aiov; + unsigned i; + int n; + int niov; + unsigned naiov; + nni_iov *aiov; +#ifdef NNG_HAVE_ALLOCA + struct iovec *iovec; +#else + struct iovec iovec[16]; +#endif nni_aio_get_iov(aio, &naiov, &aiov); +#ifdef NNG_HAVE_ALLOCA + if (naiov > 64) { + nni_posix_pipedesc_finish(aio, NNG_EINVAL); + continue; + } + iovec = alloca(naiov * sizeof(*iovec)); +#else + if (naiov > NNI_NUM_ELEMENTS(iovec)) { + nni_posix_pipedesc_finish(aio, NNG_EINVAL); + continue; + } +#endif for (niov = 0, i = 0; i < naiov; i++) { if (aiov[i].iov_len != 0) { iovec[niov].iov_len = aiov[i].iov_len; 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; } |
