From 44670dd88e75b313d1fe449d876749d98f6072f7 Mon Sep 17 00:00:00 2001
From: Andrew Hanushevsky <abh@stanford.edu>
Date: Tue, 17 Nov 2020 21:47:55 -0800
Subject: [PATCH] [Server] Correct version checking to prevent false negatives.
---
src/XrdApps/XrdPinls.cc | 2 +-
src/XrdSys/XrdSysPlugin.cc | 36 ++++++++++++++++++------------------
src/XrdVersionPlugin.hh | 7 +++----
3 files changed, 22 insertions(+), 23 deletions(-)
diff --git a/src/XrdApps/XrdPinls.cc b/src/XrdApps/XrdPinls.cc
index 55b470e61..10b9e41c3 100644
--- a/src/XrdApps/XrdPinls.cc
+++ b/src/XrdApps/XrdPinls.cc
@@ -77,7 +77,7 @@ void Display(const char *drctv, XrdVersionPlugin *vP)
// Establish minimum version
//
- if (vP->vMinLow > 99) snprintf(buff, sizeof(buff), "%2d.x ", vP->vMajLow);
+ if (vP->vMinLow < 0) snprintf(buff, sizeof(buff), "%2d.x ", vP->vMajLow);
else snprintf(buff, sizeof(buff), "%2d.%-2d", vP->vMajLow, vP->vMinLow);
// Output the line
diff --git a/src/XrdSys/XrdSysPlugin.cc b/src/XrdSys/XrdSysPlugin.cc
index 09ed94e41..abd84d08b 100644
--- a/src/XrdSys/XrdSysPlugin.cc
+++ b/src/XrdSys/XrdSysPlugin.cc
@@ -85,10 +85,12 @@ XrdSysPlugin::cvResult XrdSysPlugin::badVersion(XrdVersionInfo &urInfo,
const char *path;
char buff1[512], buff2[128];
- if (minv > 99) minv = 99;
+ if (minv < 0) strcpy(buff2, "y");
+ else sprintf(buff2, "%d", minv);
+
snprintf(buff1, sizeof(buff1), "version %s is incompatible with %s "
- "(must be %c= %d.%d.x)",
- myInfo->vStr, urInfo.vStr, mmv, majv, minv);
+ "(must be %c= %d.%s.x)",
+ myInfo->vStr, urInfo.vStr, mmv, majv, buff2);
path = msgSuffix(" in ", buff2, sizeof(buff2));
@@ -189,31 +191,29 @@ XrdSysPlugin::cvResult XrdSysPlugin::chkVersion(XrdVersionInfo &urInfo,
// The major version must always be compatible
//
- if ((vinP->vMajLow >= 0 && pMajor < vinP->vMajLow)
- || (vinP->vMajLow < 0 && pMajor != vMajor))
+ if (vinP->vMajLow >= 0 && pMajor < vinP->vMajLow)
return badVersion(urInfo, '>', vinP->vMajLow, vinP->vMinLow);
-// The major version may not be greater than our versin
-//
- if (pMajor > vMajor) return badVersion(urInfo, '<', vMajor, vMinor);
+ if (vinP->vMajLow < 0 && pMajor != vMajor)
+ return badVersion(urInfo, '=', vMajor, -1);
-// If we do not need to check minor versions then we are done
+// The plugin version may not be greater than our version)
//
- if (vinP->vMinLow > 99) return cvClean;
+ if (pMajor > vMajor || (pMajor == vMajor && pMinor > vMinor))
+ return badVersion(urInfo, '<', vMajor, vMinor);
-// In no case can the plug-in mnor version be greater than our version
+// If we do not need to check minor versions then we are done
//
- if (pMajor == vMajor && pMinor > vMinor)
- return badVersion(urInfo, '<', vMajor, vMinor);
+ if (vinP->vMinLow < 0) return cvClean;
// Verify compatible minor versions
//
- if ((vinP->vMinLow >= 0 && pMinor >= vinP->vMinLow)
- || (vinP->vMinLow < 0 && pMinor == vMinor)) return cvClean;
+ if (pMajor == vinP->vMajLow && pMinor < vinP->vMinLow)
+ return badVersion(urInfo, '>', vinP->vMajLow, vinP->vMinLow);
-// Incompatible versions
+// Compatible versions
//
- return badVersion(urInfo, '>', vinP->vMajLow, vinP->vMinLow);
+ return cvClean;
}
/******************************************************************************/
@@ -331,7 +331,7 @@ void *XrdSysPlugin::getPlugin(const char *pname, int optional, bool global)
msgSuffix(" from ", buff, sizeof(buff));
msgCnt--;
if (cvRC == cvClean)
- {const char *wTxt=(urInfo.vNum == XrdVNUMUNK ? "unreleased ":0);
+ {const char *wTxt=(urInfo.vNum == XrdVNUMUNK ? "unreleased ":"");
Inform("loaded ", wTxt, urInfo.vStr, buff, libPath);
}
else if (cvRC == cvMissing)
diff --git a/src/XrdVersionPlugin.hh b/src/XrdVersionPlugin.hh
index a481c3211..21133526e 100644
--- a/src/XrdVersionPlugin.hh
+++ b/src/XrdVersionPlugin.hh
@@ -40,7 +40,7 @@
char vSfxLen; //!< Generic rule suffix length for preceeding
int vProcess; //!< version: <0 skip, =0 optional, >0 required
short vMajLow; //!< Lowest compatible major version number
- short vMinLow; //!< Lowest compatible minor (>99 don't check).
+ short vMinLow; //!< Lowest compatible minor (< 0 don't check).
};
/* The rules are defined here because they apply to every class that uses a
@@ -74,9 +74,8 @@
>= 0: is the lowest valid major version number allowed.
minorVer: The required minor version number, It is check as follows:
- < 0: minor version numbers must be identical.
+ < 0: Do not check the minor version number, it's immaterial.
>= 0: the lowest valid minor version for the major number allowed.
- > 99: Do not check the minor version number, it's immaterial.
piSymbol: The plugin's object creator's unquoted function name. When this
symbol is looked-up, the defined version rule is applied.
@@ -87,7 +86,7 @@
*/
#define XrdVERSIONPLUGINRULES \
XrdVERSIONPLUGIN_Rule(Required, 5, 0, SecEntityPin )\
- XrdVERSIONPLUGIN_Rule(Required, 5, 0, TcpMonPin )\
+ XrdVERSIONPLUGIN_Rule(Required, 4, 8, TcpMonPin )\
XrdVERSIONPLUGIN_Rule(Required, 5, 0, XrdAccAuthorizeObject )\
XrdVERSIONPLUGIN_Rule(Required, 5, 0, XrdAccAuthorizeObjAdd )\
XrdVERSIONPLUGIN_Rule(Optional, 5, 0, XrdBwmPolicyObject )\
--
2.28.0