- size_t bufpos;
-
- for (bufpos = 0; bufpos < buflen; ) {
- size_t r = read(attrfd, buf + bufpos, buflen - bufpos);
- if (r <= 0) {
- if (r < 0)
+ STRUCT_STAT sb;
+ ssize_t ret;
+
+ if (fstat(attrfd, &sb) < 0)
+ ret = -1;
+ else if (sb.st_size > SSIZE_MAX) {
+ errno = ERANGE;
+ ret = -1;
+ } else if (buflen == 0)
+ ret = sb.st_size;
+ else if (sb.st_size > buflen) {
+ errno = ERANGE;
+ ret = -1;
+ } else {
+ size_t bufpos;
+ for (bufpos = 0; bufpos < sb.st_size; ) {
+ ssize_t cnt = read(attrfd, buf + bufpos, sb.st_size - bufpos);
+ if (cnt <= 0) {
+ if (cnt < 0 && errno == EINTR)
+ continue;