]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Allocate the exact string length needed for the string in symlink
authorNickolai Zeldovich <kolya@mit.edu>
Mon, 18 Mar 2002 03:24:10 +0000 (03:24 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Mon, 18 Mar 2002 03:24:10 +0000 (03:24 +0000)
contents, rather than assuming that symlink data never contains
nulls (or that it's of the length we expect).

(cherry picked from commit 209f1c22577c2314a896de997bd7939fab2e3d52)

src/afs/VNOPS/afs_vnop_symlink.c

index 4c9676723fc41d9581cf987fc56a732bb8568949..3fe6c993bdbdb8a25f992919d2c11a39c61d6fde 100644 (file)
@@ -224,7 +224,7 @@ afs_MemHandleLink(avc, areq)
      struct vrequest *areq;
   {
       register struct dcache *tdc;
-      register char *tp;
+      register char *tp, *rbuf;
       afs_int32 offset, len, alen;
       register afs_int32 code;
 
@@ -245,10 +245,14 @@ afs_MemHandleLink(avc, areq)
          }
          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);
           addr = afs_MemCacheOpen(tdc->f.inode);
-          code = afs_MemReadBlk(addr, 0, tp, len);
-         tp[alen-1] = 0;
+          code = afs_MemReadBlk(addr, 0, rbuf, len);
+         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);
          afs_PutDCache(tdc);
          if (code != len) {
              afs_osi_Free(tp, alen);
@@ -263,7 +267,7 @@ afs_UFSHandleLink(avc, areq)
     register struct vcache *avc;
     struct vrequest *areq; {
     register struct dcache *tdc;
-    register char *tp;
+    register char *tp, *rbuf;
     char *tfile;
     afs_int32 offset, len, alen;
     register afs_int32 code;
@@ -285,11 +289,15 @@ afs_UFSHandleLink(avc, areq)
        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 */
-       code = afs_osi_Read(tfile, -1, tp, len);
-       tp[alen-1] = 0;
+       rbuf = (char *) osi_AllocLargeSpace(AFS_LRALLOCSIZ);
+       code = afs_osi_Read(tfile, -1, rbuf, len);
+       rbuf[alen-1] = '\0';
        osi_UFSClose(tfile);
        afs_PutDCache(tdc);
+       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;