/* XXX: locks have to be checked before each stream of consecutive
* ad_reads to prevent a denial in the middle from causing
* problems. */
-ssize_t ad_read( struct adouble *ad, const u_int32_t eid, off_t off, char *buf, const size_t buflen)
+ssize_t ad_read( struct adouble *ad, const uint32_t eid, off_t off, char *buf, const size_t buflen)
{
ssize_t cc;
}
}
} else { /* AD_VERSION_EA */
- if ((off + buflen) > ad->ad_rlen) {
+ if (off > ad->ad_rlen) {
errno = ERANGE;
return -1;
}
- memcpy(buf, ad->ad_resforkbuf + off, buflen);
- cc = buflen;
+ if (ad->ad_rlen == 0)
+ return 0;
+ if ((off + buflen) > ad->ad_rlen)
+ cc = ad->ad_rlen;
+ memcpy(buf, ad->ad_resforkbuf + off, cc);
}
}