summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorDimitri Staessens <[email protected]>2018-03-17 14:55:46 +0100
committerSander Vrijders <[email protected]>2018-03-19 10:29:21 +0100
commit4230103ff633904c69cc18d861bf42781f57bb64 (patch)
tree9b21ca4a648456863af30e21ea4c7b55ba3ddf77 /src/lib
parentc9747304271f63064687178938bf2a4060ef0180 (diff)
downloadouroboros-4230103ff633904c69cc18d861bf42781f57bb64.tar.gz
ouroboros-4230103ff633904c69cc18d861bf42781f57bb64.zip
lib: Allow disabling partial read
This allows disabling partial reads. It adds a flag FLOWFRNOPART that disables partial reads. Partial read is different from partial delivery (FRCTFPARTIAL), which allows delivery of fragments of an incomplete packet and thus potentially corrupted data. FLOWFRNOPART will never deliver corrupted data (unless FRCTFPARTIAL is also set). If FLOWFRNOPART is set and the buffer provided to flow_read is too small for the SDU, that SDU will be discarded and -EMSGSIZE is returned; Signed-off-by: Dimitri Staessens <[email protected]> Signed-off-by: Sander Vrijders <[email protected]>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dev.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lib/dev.c b/src/lib/dev.c
index 115cd565..d0766783 100644
--- a/src/lib/dev.c
+++ b/src/lib/dev.c
@@ -897,6 +897,7 @@ ssize_t flow_read(int fd,
struct timespec * abstime = NULL;
struct flow * flow;
bool noblock;
+ bool partrd;
if (fd < 0 || fd > PROG_MAX_FLOWS)
return -EBADF;
@@ -919,6 +920,7 @@ ssize_t flow_read(int fd,
rb = flow->rx_rb;
noblock = flow->oflags & FLOWFRNOBLOCK;
+ partrd = !(flow->oflags & FLOWFRNOPART);
if (ai.flows[fd].rcv_timesout) {
ts_add(&abs, &flow->rcv_timeo, &abs);
@@ -948,14 +950,20 @@ ssize_t flow_read(int fd,
if (n <= (ssize_t) count) {
memcpy(buf, sdu, n);
shm_rdrbuff_remove(ai.rdrb, idx);
- flow->part_idx = (n == (ssize_t) count) ? DONE_PART : NO_PART;
+ flow->part_idx = (partrd && n == (ssize_t) count) ?
+ DONE_PART : NO_PART;
return n;
} else {
- memcpy(buf, sdu, count);
- sdb = shm_rdrbuff_get(ai.rdrb, idx);
- shm_du_buff_head_release(sdb, n);
- flow->part_idx = idx;
- return count;
+ if (partrd) {
+ memcpy(buf, sdu, count);
+ sdb = shm_rdrbuff_get(ai.rdrb, idx);
+ shm_du_buff_head_release(sdb, n);
+ flow->part_idx = idx;
+ return count;
+ } else {
+ shm_rdrbuff_remove(ai.rdrb, idx);
+ return -EMSGSIZE;
+ }
}
}