|
@@ -353,7 +353,7 @@ int venus_readlink(struct super_block *sb, struct CodaFid *fid,
|
|
char *result;
|
|
char *result;
|
|
|
|
|
|
insize = max_t(unsigned int,
|
|
insize = max_t(unsigned int,
|
|
- INSIZE(readlink), OUTSIZE(readlink)+ *length + 1);
|
|
|
|
|
|
+ INSIZE(readlink), OUTSIZE(readlink)+ *length);
|
|
UPARG(CODA_READLINK);
|
|
UPARG(CODA_READLINK);
|
|
|
|
|
|
inp->coda_readlink.VFid = *fid;
|
|
inp->coda_readlink.VFid = *fid;
|
|
@@ -361,8 +361,8 @@ int venus_readlink(struct super_block *sb, struct CodaFid *fid,
|
|
error = coda_upcall(coda_vcp(sb), insize, &outsize, inp);
|
|
error = coda_upcall(coda_vcp(sb), insize, &outsize, inp);
|
|
if (!error) {
|
|
if (!error) {
|
|
retlen = outp->coda_readlink.count;
|
|
retlen = outp->coda_readlink.count;
|
|
- if ( retlen > *length )
|
|
|
|
- retlen = *length;
|
|
|
|
|
|
+ if (retlen >= *length)
|
|
|
|
+ retlen = *length - 1;
|
|
*length = retlen;
|
|
*length = retlen;
|
|
result = (char *)outp + (long)outp->coda_readlink.data;
|
|
result = (char *)outp + (long)outp->coda_readlink.data;
|
|
memcpy(buffer, result, retlen);
|
|
memcpy(buffer, result, retlen);
|