struct vrequest *areq;
{
register struct dcache *tdc;
- register char *tp;
+ register char *tp, *rbuf;
afs_size_t offset, len;
afs_int32 tlen, alen;
register afs_int32 code;
}
if (avc->m.Mode & 0111) alen = len+1; /* regular link */
else alen = len; /* mt point */
- tp = afs_osi_Alloc(alen); /* make room for terminating null */
+ rbuf = (char *) osi_AllocLargeSpace(AFS_LRALLOCSIZ);
ObtainReadLock(&tdc->lock);
addr = afs_MemCacheOpen(tdc->f.inode);
tlen = len;
- code = afs_MemReadBlk(addr, 0, tp, tlen);
+ code = afs_MemReadBlk(addr, 0, rbuf, tlen);
afs_MemCacheClose(addr);
ReleaseReadLock(&tdc->lock);
- tp[alen-1] = 0;
afs_PutDCache(tdc);
+ rbuf[alen-1] = 0;
+ alen = strlen(rbuf) + 1;
+ tp = afs_osi_Alloc(alen); /* make room for terminating null */
+ memcpy(tp, rbuf, alen);
+ osi_FreeLargeSpace(rbuf);
if (code != len) {
afs_osi_Free(tp, alen);
return EIO;
struct vrequest *areq;
{
register struct dcache *tdc;
- register char *tp;
+ register char *tp, *rbuf;
char *tfile;
afs_size_t offset, len;
afs_int32 tlen, alen;
afs_PutDCache(tdc);
return EFAULT;
}
- ObtainReadLock(&tdc->lock);
- tfile = osi_UFSOpen (tdc->f.inode);
if (avc->m.Mode & 0111) alen = len+1; /* regular link */
else alen = len; /* mt point */
- tp = afs_osi_Alloc(alen); /* make room for terminating null */
+ rbuf = (char *) osi_AllocLargeSpace(AFS_LRALLOCSIZ);
tlen = len;
- code = afs_osi_Read(tfile, -1, tp, tlen);
- tp[alen-1] = 0;
+ ObtainReadLock(&tdc->lock);
+ tfile = osi_UFSOpen (tdc->f.inode);
+ code = afs_osi_Read(tfile, -1, rbuf, tlen);
osi_UFSClose(tfile);
ReleaseReadLock(&tdc->lock);
afs_PutDCache(tdc);
+ rbuf[alen-1] = '\0';
+ alen = strlen(rbuf) + 1;
+ tp = afs_osi_Alloc(alen); /* make room for terminating null */
+ memcpy(tp, rbuf, alen);
+ osi_FreeLargeSpace(rbuf);
if (code != tlen) {
afs_osi_Free(tp, alen);
return EIO;