From 41f047edf69ad7c6c83cfa94f410f0daa9bb91fd Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Sun, 24 Mar 2002 19:21:35 +0000 Subject: [PATCH] Verify that name lengths are at most AFSNAMEMAX and symlink contents are at most AFSPATHMAX (notably, the Linux kernel doesn't check this for us); bug report by nneul@umr.edu. --- src/afs/VNOPS/afs_vnop_create.c | 5 +++++ src/afs/VNOPS/afs_vnop_dirops.c | 10 ++++++++++ src/afs/VNOPS/afs_vnop_link.c | 4 ++++ src/afs/VNOPS/afs_vnop_remove.c | 7 +++++++ src/afs/VNOPS/afs_vnop_rename.c | 5 +++++ src/afs/VNOPS/afs_vnop_symlink.c | 5 +++++ 6 files changed, 36 insertions(+) diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c index dc7c7134d..8e3eb3278 100644 --- a/src/afs/VNOPS/afs_vnop_create.c +++ b/src/afs/VNOPS/afs_vnop_create.c @@ -94,6 +94,11 @@ afs_create(OSI_VC_ARG(adp), aname, attrs, aexcl, amode, avcp, acred) } #endif + if (strlen(aname) > AFSNAMEMAX) { + code = ENAMETOOLONG; + goto done; + } + if (!afs_ENameOK(aname)) { code = EINVAL; goto done; diff --git a/src/afs/VNOPS/afs_vnop_dirops.c b/src/afs/VNOPS/afs_vnop_dirops.c index 3f8dce80f..7dcb41b66 100644 --- a/src/afs/VNOPS/afs_vnop_dirops.c +++ b/src/afs/VNOPS/afs_vnop_dirops.c @@ -72,6 +72,11 @@ afs_mkdir(OSI_VC_ARG(adp), aname, attrs, avcp, acred) if (code = afs_InitReq(&treq, acred)) goto done2; + if (strlen(aname) > AFSNAMEMAX) { + code = ENAMETOOLONG; + goto done; + } + if (!afs_ENameOK(aname)) { code = EINVAL; goto done; @@ -200,6 +205,11 @@ afs_rmdir(adp, aname, acred) if (code = afs_InitReq(&treq, acred)) goto done2; + if (strlen(aname) > AFSNAMEMAX) { + code = ENAMETOOLONG; + goto done; + } + code = afs_VerifyVCache(adp, &treq); if (code) goto done; diff --git a/src/afs/VNOPS/afs_vnop_link.c b/src/afs/VNOPS/afs_vnop_link.c index 493363cef..29e482958 100644 --- a/src/afs/VNOPS/afs_vnop_link.c +++ b/src/afs/VNOPS/afs_vnop_link.c @@ -70,6 +70,10 @@ afs_link(avc, OSI_VC_ARG(adp), aname, acred) code = EXDEV; goto done; } + if (strlen(aname) > AFSNAMEMAX) { + code = ENAMETOOLONG; + goto done; + } code = afs_VerifyVCache(adp, &treq); if (code) goto done; diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c index f946b3d66..243830125 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -257,6 +257,13 @@ afs_remove(OSI_VC_ARG(adp), aname, acred) #endif return code; } + if (strlen(aname) > AFSNAMEMAX) { +#ifdef AFS_OSF_ENV + afs_PutVCache(adp, 0); + afs_PutVCache(tvc, 0); +#endif + return ENAMETOOLONG; + } tagain: code = afs_VerifyVCache(adp, &treq); #ifdef AFS_OSF_ENV diff --git a/src/afs/VNOPS/afs_vnop_rename.c b/src/afs/VNOPS/afs_vnop_rename.c index 4e60bc720..f1db55072 100644 --- a/src/afs/VNOPS/afs_vnop_rename.c +++ b/src/afs/VNOPS/afs_vnop_rename.c @@ -55,6 +55,11 @@ afsrename(aodp, aname1, andp, aname2, acred) if (code = afs_InitReq(&treq, acred)) return code; + if (strlen(aname1) > AFSNAMEMAX || strlen(aname2) > AFSNAMEMAX) { + code = ENAMETOOLONG; + goto done; + } + /* verify the latest versions of the stat cache entries */ tagain: code = afs_VerifyVCache(aodp, &treq); diff --git a/src/afs/VNOPS/afs_vnop_symlink.c b/src/afs/VNOPS/afs_vnop_symlink.c index 678b0a778..637eb8323 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -79,6 +79,11 @@ afs_symlink afs_Trace2(afs_iclSetp, CM_TRACE_SYMLINK, ICL_TYPE_POINTER, adp, ICL_TYPE_STRING, aname); + if (strlen(aname) > AFSNAMEMAX || strlen(atargetName) > AFSPATHMAX) { + code = ENAMETOOLONG; + goto done2; + } + if (afs_IsDynroot(adp)) { code = afs_DynrootVOPSymlink(adp, acred, aname, atargetName); goto done2; -- 2.39.5