aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorvanhauser-thc <vh@thc.org>2022-04-22 10:28:14 +0200
committervanhauser-thc <vh@thc.org>2022-04-22 10:28:21 +0200
commit7f26d133458f5034499f40129e9a5517cee21cce (patch)
tree2cd01d3b019350de759c6f0478465197632bbab2 /include
parent5798c686b20ac47c4fc7f939c02ee211108c0f1f (diff)
downloadafl++-7f26d133458f5034499f40129e9a5517cee21cce.tar.gz
try repeating write
Diffstat (limited to 'include')
-rw-r--r--include/debug.h47
1 files changed, 33 insertions, 14 deletions
diff --git a/include/debug.h b/include/debug.h
index 31ebd0f2..e2ee16a8 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -355,20 +355,39 @@ static inline const char *colorfilter(const char *x) {
/* Error-checking versions of read() and write() that call RPFATAL() as
appropriate. */
-#define ck_write(fd, buf, len, fn) \
- do { \
- \
- int _fd = (fd); \
- \
- s32 _len = (s32)(len); \
- s32 _res = write(_fd, (buf), _len); \
- if (_res != _len) { \
- \
- RPFATAL(_res, "Short write to %s, fd %d (%d of %d bytes)", fn, _fd, \
- _res, _len); \
- \
- } \
- \
+#define ck_write(fd, buf, len, fn) \
+ do { \
+ \
+ if (len <= 0) break; \
+ int _fd = (fd); \
+ s32 _written = 0, _off = 0, _len = (s32)(len); \
+ \
+ do { \
+ \
+ s32 _res = write(_fd, (buf) + _off, _len); \
+ if (_res != _len && (_res > 0 && _written + _res != _len)) { \
+ \
+ if (_res > 0) { \
+ \
+ _written += _res; \
+ _len -= _res; \
+ _off += _res; \
+ \
+ } else { \
+ \
+ RPFATAL(_res, "Short write to %s, fd %d (%d of %d bytes)", fn, _fd, \
+ _res, _len); \
+ \
+ } \
+ \
+ } else { \
+ \
+ break; \
+ \
+ } \
+ \
+ } while (1); \
+ \
} while (0)
#define ck_read(fd, buf, len, fn) \