From: Nickolai Zeldovich Date: Sun, 21 Apr 2002 22:01:36 +0000 (+0000) Subject: Verify that name lengths are at most AFSNAMEMAX and symlink X-Git-Tag: openafs-stable-1_2_4~35 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=e92a51fc0f3bef08c9951802db9e66f27e5c91f8;p=packages%2Fo%2Fopenafs.git 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. (cherry picked from commit 41f047edf69ad7c6c83cfa94f410f0daa9bb91fd) --- diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c index 37ca0ff15..ede5d7667 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 10ebcfaca..daf33b738 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; @@ -198,6 +203,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 5c9de0676..2a727c918 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 ad65b6c0f..3bdb16cfd 100644 --- a/src/afs/VNOPS/afs_vnop_remove.c +++ b/src/afs/VNOPS/afs_vnop_remove.c @@ -253,6 +253,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 7c86a1557..e056df0b1 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 5a0cf7e38..be105aefc 100644 --- a/src/afs/VNOPS/afs_vnop_symlink.c +++ b/src/afs/VNOPS/afs_vnop_symlink.c @@ -78,6 +78,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;