afs: Replace strcpy &co by safer alternatives
[openafs.git] / src / afs / afs_dynroot.c
index 0acb448..3ebba4f 100644 (file)
@@ -354,8 +354,7 @@ afs_RebuildDynroot(void)
        dotLen = strlen(c->cellName) + 2;
        dotCell = afs_osi_Alloc(dotLen);
        osi_Assert(dotCell != NULL);
-       strcpy(dotCell, ".");
-       afs_strcat(dotCell, c->cellName);
+       osi_Assert(snprintf(dotCell, dotLen, ".%s", c->cellName) < dotLen);
 
        afs_dynroot_computeDirEnt(c->cellName, &curPage, &curChunk);
        afs_dynroot_computeDirEnt(dotCell, &curPage, &curChunk);
@@ -373,8 +372,7 @@ afs_RebuildDynroot(void)
        dotLen = strlen(ca->alias) + 2;
        dotCell = afs_osi_Alloc(dotLen);
        osi_Assert(dotCell != NULL);
-       strcpy(dotCell, ".");
-       afs_strcat(dotCell, ca->alias);
+       osi_Assert(snprintf(dotCell, dotLen, ".%s", ca->alias) < dotLen);
 
        afs_dynroot_computeDirEnt(ca->alias, &curPage, &curChunk);
        afs_dynroot_computeDirEnt(dotCell, &curPage, &curChunk);
@@ -434,8 +432,7 @@ afs_RebuildDynroot(void)
        dotLen = strlen(c->cellName) + 2;
        dotCell = afs_osi_Alloc(dotLen);
        osi_Assert(dotCell != NULL);
-       strcpy(dotCell, ".");
-       afs_strcat(dotCell, c->cellName);
+       osi_Assert(snprintf(dotCell, dotLen, ".%s", c->cellName) < dotLen);
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, c->cellName,
                              VNUM_FROM_CIDX_RW(cellidx, 0));
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, dotCell,
@@ -454,8 +451,7 @@ afs_RebuildDynroot(void)
        dotLen = strlen(ca->alias) + 2;
        dotCell = afs_osi_Alloc(dotLen);
        osi_Assert(dotCell != NULL);
-       strcpy(dotCell, ".");
-       afs_strcat(dotCell, ca->alias);
+       osi_Assert(snprintf(dotCell, dotLen, ".%s", ca->alias) < dotLen);
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, ca->alias,
                              VNUM_FROM_CAIDX_RW(aliasidx, 0));
        afs_dynroot_addDirEnt(dirHeader, &curPage, &curChunk, dotCell,
@@ -661,7 +657,8 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
                linklen = strlen(ts->target);
                avc->linkData = afs_osi_Alloc(linklen + 1);
                osi_Assert(avc->linkData != NULL);
-               strcpy(avc->linkData, ts->target);
+               osi_Assert(strlcpy(avc->linkData, ts->target, linklen + 1) <
+                                  linklen + 1);
 
                status->Length = linklen;
                status->UnixModeBits = 0755;
@@ -707,11 +704,12 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
                linklen = 7;
            } else {
                int namelen = strlen(realName);
+               char *prefix = rw ? "." : "";
                linklen = rw + namelen;
                avc->linkData = afs_osi_Alloc(linklen + 1);
                osi_Assert(avc->linkData != NULL);
-               strcpy(avc->linkData, rw ? "." : "");
-               afs_strcat(avc->linkData, realName);
+               osi_Assert(snprintf(avc->linkData, linklen + 1, "%s%s", prefix,
+                          realName) < linklen + 1);
            }
 
            status->UnixModeBits = 0755;
@@ -733,16 +731,16 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            linklen = 2 + namelen + strlen(bp);
            avc->linkData = afs_osi_Alloc(linklen + 1);
            osi_Assert(avc->linkData != NULL);
-           strcpy(avc->linkData, "%");
-           afs_strcat(avc->linkData, c->cellName);
-           afs_strcat(avc->linkData, ":");
-           afs_strcat(avc->linkData, bp);
+           osi_Assert(snprintf(avc->linkData, linklen + 1, "%%%s:%s",
+                      c->cellName, bp) < linklen + 1);
 
            status->UnixModeBits = 0644;
            status->ParentVnode = AFS_DYNROOT_MOUNT_VNODE;
            afs_PutCell(c, READ_LOCK);
 
        } else {
+           char *prefix = rw ? "%" : "#";
+
            c = afs_GetCellByIndex(cellidx, READ_LOCK);
            if (!c) {
                afs_warn("dynroot vnode inconsistency, can't find cell %d\n",
@@ -757,9 +755,8 @@ afs_DynrootNewVnode(struct vcache *avc, struct AFSFetchStatus *status)
            linklen = 1 + namelen + 10;
            avc->linkData = afs_osi_Alloc(linklen + 1);
            osi_Assert(avc->linkData != NULL);
-           strcpy(avc->linkData, rw ? "%" : "#");
-           afs_strcat(avc->linkData, c->cellName);
-           afs_strcat(avc->linkData, ":root.cell");
+           osi_Assert(snprintf(avc->linkData, linklen + 1, "%s%s:root.cell",
+                      prefix, c->cellName) < linklen + 1);
 
            status->UnixModeBits = 0644;
            afs_PutCell(c, READ_LOCK);
@@ -878,6 +875,7 @@ afs_DynrootVOPSymlink(struct vcache *avc, afs_ucred_t *acred,
                      char *aname, char *atargetName)
 {
     struct afs_dynSymlink *tps;
+    size_t len;
 
     if (afs_cr_uid(acred))
        return EPERM;
@@ -900,12 +898,14 @@ afs_DynrootVOPSymlink(struct vcache *avc, afs_ucred_t *acred,
     osi_Assert(tps != NULL);
     tps->index = afs_dynSymlinkIndex++;
     tps->next = afs_dynSymlinkBase;
-    tps->name = afs_osi_Alloc(strlen(aname) + 1);
+    len = strlen(aname) + 1;
+    tps->name = afs_osi_Alloc(len);
     osi_Assert(tps->name != NULL);
-    strcpy(tps->name, aname);
-    tps->target = afs_osi_Alloc(strlen(atargetName) + 1);
+    osi_Assert(strlcpy(tps->name, aname, len) < len);
+    len = strlen(atargetName) + 1;
+    tps->target = afs_osi_Alloc(len);
     osi_Assert(tps->target != NULL);
-    strcpy(tps->target, atargetName);
+    osi_Assert(strlcpy(tps->target, atargetName, len) < len);
     afs_dynSymlinkBase = tps;
     ReleaseWriteLock(&afs_dynSymlinkLock);