You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2015/01/31 01:37:10 UTC

trafficserver git commit: TS-3340: Coverity fixes: CID #1022050

Repository: trafficserver
Updated Branches:
  refs/heads/master b37266a9e -> f83d6f2d7


TS-3340: Coverity fixes: CID #1022050

Fixed unchecked-return-value issues in the build number generation.
Validated input date and time format and generated a fixed-size
build number if not set by the builder.

This closes #167


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/f83d6f2d
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/f83d6f2d
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/f83d6f2d

Branch: refs/heads/master
Commit: f83d6f2d7391690ad97f5c52431c6acd5e2eefd8
Parents: b37266a
Author: Gancho Tenev <gt...@gmail.com>
Authored: Wed Jan 28 22:03:28 2015 -0800
Committer: James Peach <jp...@apache.org>
Committed: Fri Jan 30 16:36:53 2015 -0800

----------------------------------------------------------------------
 lib/ts/Version.cc | 71 ++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/f83d6f2d/lib/ts/Version.cc
----------------------------------------------------------------------
diff --git a/lib/ts/Version.cc b/lib/ts/Version.cc
index 8bb377b..19fc201 100644
--- a/lib/ts/Version.cc
+++ b/lib/ts/Version.cc
@@ -47,21 +47,24 @@ AppVersionInfo::setup(const char *pkg_name, const char *app_name, const char *ap
 {
   char month_name[8];
   int year, month, day, hour, minute, second;
+  bool invalid_datetime;
 
   static const char *months[] = {
     "Jan", "Feb", "Mar", "Apr", "May", "Jun",
     "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "???"
   };
 
-  // coverity[secure_coding]
-  sscanf(build_time, "%d:%d:%d", &hour, &minute, &second);
-  // coverity[secure_coding]
-  sscanf(build_date, "%3s %d %d", month_name, &day, &year);
+  invalid_datetime =
+      sscanf(build_time, "%d:%d:%d", &hour, &minute, &second) < 3;
+  invalid_datetime |=
+      sscanf(build_date, "%3s %d %d", month_name, &day, &year) < 3;
 
+  // Jan=1, Feb=2 ... Dec=12, ???=13
   for (month = 0; month < 11; month++) {
     if (strcasecmp(months[month], month_name) == 0)
       break;
   }
+  month ++;
 
   ///////////////////////////////////////////
   // now construct the version information //
@@ -70,11 +73,14 @@ AppVersionInfo::setup(const char *pkg_name, const char *app_name, const char *ap
   ink_strlcpy(AppStr, app_name, sizeof(AppStr));
   snprintf(VersionStr, sizeof(VersionStr), "%s", app_version);
 
-  // If the builder set a build number, use that. Otherwise take the build timestamp.
-  if (strlen(BUILD_NUMBER) == 0) {
-    snprintf(BldNumStr, sizeof(BldNumStr), "%d%d%d", month, day, hour);
-  } else {
+  // If the builder set a build number, use that.
+  // Otherwise take the build timestamp ("??????" if invalid).
+  if (0 != strlen(BUILD_NUMBER)) {
     snprintf(BldNumStr, sizeof(BldNumStr), "%s", BUILD_NUMBER);
+  } else if (! invalid_datetime) {
+    snprintf(BldNumStr, sizeof(BldNumStr), "%02d%02d%02d", month, day, hour);
+  } else {
+    snprintf(BldNumStr, sizeof(BldNumStr), "??????");
   }
 
   snprintf(BldTimeStr, sizeof(BldTimeStr), "%s", build_time);
@@ -113,3 +119,52 @@ AppVersionInfo::setup(const char *pkg_name, const char *app_name, const char *ap
 
   defined = 1;
 }
+
+
+#if TS_HAS_TESTS
+#include <ts/TestBox.h>
+
+/**
+ * AppVersionInfo class test.
+ */
+REGRESSION_TEST(AppVersionInfo)(RegressionTest* t, int /* atype ATS_UNUSED */,
+    int*  pstatus)
+{
+  *pstatus = REGRESSION_TEST_PASSED;
+
+  AppVersionInfo info;
+
+  TestBox tb(t, pstatus);
+
+  const char * errMsgFormat = "wrong build number, expected '%s', got '%s'";
+  const char * bench[][3] =
+  {
+      // date, time, resulting build number
+      {"Oct  4 1957", "19:28:34", BUILD_NUMBER},
+      {"Oct  4 1957", "19:28:34", "100419"},
+      {"Apr  4 1957", "09:08:04", "040409"},
+      {" 4 Apr 1957", "09:08:04", "??????"},
+      {"Apr  4 1957", "09-08-04", "??????"}
+  };
+
+  int benchSize = sizeof(bench) / sizeof(bench[0]);
+
+  if (0 != strlen(BUILD_NUMBER)) {
+    // Since BUILD_NUMBER is defined by a #define directive, it is not
+    // possible to change the version value from inside the regression test.
+    // If not empty BUILD_NUMBER overrides any result, in this case run only
+    // this test (the rest will always fail).
+    info.setup("Apache Traffic Server", "traffic_server", "5.2.1",
+        bench[0][0], bench[0][1], "build_slave", "builder", "");
+    tb.check(0 == strcmp(info.BldNumStr, bench[0][2]), errMsgFormat,
+        bench[0][2], info.BldNumStr);
+  } else {
+    for (int i = 1; i < benchSize; i++) {
+      info.setup("Apache Traffic Server", "traffic_server", "5.2.1",
+          bench[i][0], bench[i][1], "build_slave", "builder", "");
+      tb.check(0 == strcmp(info.BldNumStr, bench[i][2]), errMsgFormat,
+          bench[i][2], info.BldNumStr);
+    }
+  }
+}
+#endif