Blob Blame History Raw
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