diff --git a/include/sane/sanei_tcp.h b/include/sane/sanei_tcp.h index 227e61315..a375c3949 100644 --- a/include/sane/sanei_tcp.h +++ b/include/sane/sanei_tcp.h @@ -31,7 +31,7 @@ extern SANE_Status sanei_tcp_open(const char *host, int port, int *fdp); extern void sanei_tcp_close(int fd); -extern ssize_t sanei_tcp_write(int fd, const u_char * buf, int count); -extern ssize_t sanei_tcp_read(int fd, u_char * buf, int count); +extern ssize_t sanei_tcp_write(int fd, const u_char * buf, size_t count); +extern ssize_t sanei_tcp_read(int fd, u_char * buf, size_t count); #endif /* sanei_tcp_h */ diff --git a/sanei/sanei_tcp.c b/sanei/sanei_tcp.c index 87a73d109..d6f8efe34 100644 --- a/sanei/sanei_tcp.c +++ b/sanei/sanei_tcp.c @@ -45,6 +45,11 @@ #include #include #include +#include + +#ifndef SSIZE_MAX +#define SSIZE_MAX LONG_MAX +#endif #ifdef HAVE_WINSOCK2_H #include @@ -115,15 +120,21 @@ sanei_tcp_close(int fd) } ssize_t -sanei_tcp_write(int fd, const u_char * buf, int count) +sanei_tcp_write(int fd, const u_char * buf, size_t count) { return send(fd, buf, count, 0); } ssize_t -sanei_tcp_read(int fd, u_char * buf, int count) +sanei_tcp_read(int fd, u_char * buf, size_t count) { - ssize_t bytes_recv = 0, rc = 1; + size_t bytes_recv = 0; + ssize_t rc = 1; + + if (count > SSIZE_MAX) { + errno = EINVAL; + return -1; + } while (bytes_recv < count && rc > 0) {