From: Stephan Wiesand Date: Tue, 4 Aug 2015 14:05:06 +0000 (+0200) Subject: Revert "vlserver: Disable regex volume name processing in ListAttributesN2" X-Git-Tag: upstream/1.6.14^2~4 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=3803e6acbe625c3b298dde7a6f9d0fd560cfe635;p=packages%2Fo%2Fopenafs.git Revert "vlserver: Disable regex volume name processing in ListAttributesN2" This reverts commit 63087b338e3d0fbbb26ee183a039052bf07aaaec. Change-Id: I4bb759893224b8c53a1deb50f34e8395ed44fb4a Reviewed-on: http://gerrit.openafs.org/11971 Reviewed-by: Daria Brashear Tested-by: BuildBot Reviewed-by: Mark Vitale Reviewed-by: Stephan Wiesand --- diff --git a/src/vlserver/vlprocs.c b/src/vlserver/vlprocs.c index 1cd044171..4fb5db078 100644 --- a/src/vlserver/vlprocs.c +++ b/src/vlserver/vlprocs.c @@ -1446,10 +1446,11 @@ SVL_ListAttributesN2(struct rx_call *rxcall, afs_int32 blockindex = 0, count = 0, k, match; afs_int32 matchindex = 0; int serverindex = -1; /* no server found */ - int findserver = 0, findpartition = 0, findflag = 0; + int findserver = 0, findpartition = 0, findflag = 0, findname = 0; int pollcount = 0; int namematchRWBK, namematchRO, thismatch; int matchtype = 0; + char volumename[VL_MAXNAMELEN+2]; /* regex anchors */ char rxstr[AFS_RXINFO_LEN]; #ifdef HAVE_POSIX_REGEX regex_t re; @@ -1499,7 +1500,8 @@ SVL_ListAttributesN2(struct rx_call *rxcall, } /* Search each entry in the database and return all entries - * that match the request. It checks entry flags, server, and partition. + * that match the request. It checks volumename (with + * wildcarding), entry flags, server, and partition. */ else { /* Get the server index for matching server address */ @@ -1513,9 +1515,21 @@ SVL_ListAttributesN2(struct rx_call *rxcall, findpartition = ((attributes->Mask & VLLIST_PARTITION) ? 1 : 0); findflag = ((attributes->Mask & VLLIST_FLAG) ? 1 : 0); if (name && (strcmp(name, ".*") != 0) && (strcmp(name, "") != 0)) { - /* regex-matching code has been disabled for security reasons. */ - errorcode = VL_BADNAME; - goto done; + sprintf(volumename, "^%s$", name); +#ifdef HAVE_POSIX_REGEX + if (regcomp(&re, volumename, REG_NOSUB) != 0) { + errorcode = VL_BADNAME; + goto done; + } + need_regfree = 1; +#else + t = (char *)re_comp(volumename); + if (t) { + errorcode = VL_BADNAME; + goto done; + } +#endif + findname = 1; } /* Read each entry and see if it is the one we want */ @@ -1545,12 +1559,38 @@ SVL_ListAttributesN2(struct rx_call *rxcall, if (tentry.serverFlags[k] & VLSF_RWVOL) { /* Does the name match the RW name */ if (tentry.flags & VLF_RWEXISTS) { - thismatch = VLSF_RWVOL; + if (findname) { + sprintf(volumename, "%s", tentry.name); +#ifdef HAVE_POSIX_REGEX + if (regexec(&re, volumename, 0, NULL, 0) == 0) { + thismatch = VLSF_RWVOL; + } +#else + if (re_exec(volumename)) { + thismatch = VLSF_RWVOL; + } +#endif + } else { + thismatch = VLSF_RWVOL; + } } /* Does the name match the BK name */ if (!thismatch && (tentry.flags & VLF_BACKEXISTS)) { - thismatch = VLSF_BACKVOL; + if (findname) { + sprintf(volumename, "%s.backup", tentry.name); +#ifdef HAVE_POSIX_REGEX + if (regexec(&re, volumename, 0, NULL, 0) == 0) { + thismatch = VLSF_BACKVOL; + } +#else + if (re_exec(volumename)) { + thismatch = VLSF_BACKVOL; + } +#endif + } else { + thismatch = VLSF_BACKVOL; + } } namematchRWBK = (thismatch ? 1 : 2); @@ -1562,7 +1602,25 @@ SVL_ListAttributesN2(struct rx_call *rxcall, */ else { if (tentry.flags & VLF_ROEXISTS) { - thismatch = VLSF_ROVOL; + if (findname) { + if (namematchRO) { + thismatch = + ((namematchRO == 1) ? VLSF_ROVOL : 0); + } else { + sprintf(volumename, "%s.readonly", + tentry.name); +#ifdef HAVE_POSIX_REGEX + if (regexec(&re, volumename, 0, NULL, 0) == 0) { + thismatch = VLSF_ROVOL; + } +#else + if (re_exec(volumename)) + thismatch = VLSF_ROVOL; +#endif + } + } else { + thismatch = VLSF_ROVOL; + } } namematchRO = (thismatch ? 1 : 2); }