diff options
Diffstat (limited to '')
-rw-r--r-- | LICENSE | 2 | ||||
-rw-r--r-- | internal.h | 2 | ||||
-rw-r--r-- | liberror-libc.h | 5 | ||||
-rw-r--r-- | recv.c | 39 | ||||
-rw-r--r-- | set_error_one_file.c | 2 |
5 files changed, 47 insertions, 3 deletions
@@ -1,6 +1,6 @@ ISC License -© 2019 Mattias Andrée <maandree@kth.se> +© 2019, 2021 Mattias Andrée <maandree@kth.se> Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -23,4 +23,4 @@ #define HIDDEN GCC_ATTRIBUTES(__visibility__("hidden")) -HIDDEN void liberror_libc_set_error_one_file(const char[256], const char[64], const char *, int, const char *); +HIDDEN void liberror_libc_set_error_one_file(const char *, const char *, const char *, int, const char *); diff --git a/liberror-libc.h b/liberror-libc.h index 9a67245..3ca2b67 100644 --- a/liberror-libc.h +++ b/liberror-libc.h @@ -7,6 +7,9 @@ #include <unistd.h> +#define LIBERROR_LIBC_ERRROR_SHORT_READ -1 + + int liberror_abs(int); void liberror_abs_failed(int); /* void *liberror_aligned_alloc(size_t, size_t); TODO */ @@ -31,7 +34,9 @@ void liberror_raise_failed(int); void *liberror_realloc(void *, size_t); void liberror_realloc_failed(void *, size_t); ssize_t liberror_recv(int, void *, size_t, int, const char *); +ssize_t liberror_recv_require(int, void *, size_t, int, size_t min, size_t max, const char *); void liberror_recv_failed(int, void *, size_t, int, const char *); +void liberror_recv_short(int, void *, size_t, int, size_t min, size_t max, ssize_t returned, const char *); /* void *liberror_posix_memalign(void **, size_t, size_t); TODO */ ssize_t liberror_send(int, const void *, size_t, int, const char *); void liberror_send_failed(int, const void *, size_t, int, const char *); @@ -112,6 +112,30 @@ liberror_recv_failed(int fd, void *buf, size_t n, int flags, const char *fname) } +void +liberror_recv_short(int fd, void *buf, size_t n, int flags, size_t min, size_t max, ssize_t returned, const char *fname) +{ + const char *desc; + struct liberror_error *error; + int saved_errno = errno; + liberror_save_backtrace(NULL); + if (returned < 0 || (size_t)returned < min) { + desc = "Received message was shorter than expected"; + } else if (returned > max) { + desc = "Received message was larger than expected"; + } else { + desc = "Received message was of an unexpected size"; + } + liberror_set_error(desc, "recv", "liberror-libc", LIBERROR_LIBC_ERRROR_SHORT_READ); + error = liberror_get_error(); + error->details_type = LIBERROR_DETAILS_ONE_FILE; + error->details.one_file.fd = fd; + error->details.one_file.name = fname ? strdup(fname) : NULL; + error->details.one_file.role = "Socket file"; + errno = saved_errno; +} + + ssize_t liberror_recv(int fd, void *buf, size_t n, int flags, const char *fname) { @@ -122,3 +146,18 @@ liberror_recv(int fd, void *buf, size_t n, int flags, const char *fname) liberror_recv_failed(fd, buf, n, flags, fname); return -1; } + + +ssize_t +liberror_recv_require(int fd, void *buf, size_t n, int flags, size_t min, size_t max, const char *fname) +{ + ssize_t r = recv(fd, buf, n, flags); + if (r >= min && r <= max) + return r; + liberror_save_backtrace(NULL); + if (r < 0) + liberror_recv_failed(fd, buf, n, flags, fname); + else + liberror_recv_short(fd, buf, n, flags, min, max, r, fname); + return -1; +} diff --git a/set_error_one_file.c b/set_error_one_file.c index b9b46d1..04fef36 100644 --- a/set_error_one_file.c +++ b/set_error_one_file.c @@ -3,7 +3,7 @@ void -liberror_libc_set_error_one_file(const char desc[256], const char source[64], const char *frole, int fd, const char *fname) +liberror_libc_set_error_one_file(const char *desc, const char *source, const char *frole, int fd, const char *fname) { struct liberror_error *error; int saved_errno = errno; |