malformed software package entries not added to package list during configuration...
authorVictor Kirhenshtein <victor@netxms.org>
Tue, 3 Oct 2017 19:56:45 +0000 (22:56 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Tue, 3 Oct 2017 19:56:45 +0000 (22:56 +0300)
include/nms_util.h
src/libnetxms/table.cpp
src/server/core/node.cpp
src/server/core/swpkg.cpp
src/server/include/nms_objects.h

index ac209c8..8704473 100644 (file)
@@ -1411,10 +1411,10 @@ public:
    void addAll(Table *src);
    void copyRow(Table *src, int row);
 
-   int getNumRows() { return m_data->size(); }
+   int getNumRows() const { return m_data->size(); }
    int getNumColumns() const { return m_columns->size(); }
-       const TCHAR *getTitle() { return CHECK_NULL_EX(m_title); }
-   int getSource() { return m_source; }
+       const TCHAR *getTitle() const { return CHECK_NULL_EX(m_title); }
+   int getSource() const { return m_source; }
 
    bool isExtendedFormat() { return m_extendedFormat; }
    void setExtendedFormat(bool ext) { m_extendedFormat = ext; }
@@ -1459,14 +1459,14 @@ public:
    void setStatusAt(int row, int col, int status);
    void setStatus(int col, int status) { setStatusAt(getNumRows() - 1, col, status); }
 
-   const TCHAR *getAsString(int nRow, int nCol, const TCHAR *defaultValue = NULL);
-   INT32 getAsInt(int nRow, int nCol);
-   UINT32 getAsUInt(int nRow, int nCol);
-   INT64 getAsInt64(int nRow, int nCol);
-   UINT64 getAsUInt64(int nRow, int nCol);
-   double getAsDouble(int nRow, int nCol);
+   const TCHAR *getAsString(int nRow, int nCol, const TCHAR *defaultValue = NULL) const;
+   INT32 getAsInt(int nRow, int nCol) const;
+   UINT32 getAsUInt(int nRow, int nCol) const;
+   INT64 getAsInt64(int nRow, int nCol) const;
+   UINT64 getAsUInt64(int nRow, int nCol) const;
+   double getAsDouble(int nRow, int nCol) const;
 
-   int getStatus(int nRow, int nCol);
+   int getStatus(int nRow, int nCol) const;
 
    void buildInstanceString(int row, TCHAR *buffer, size_t bufLen);
    int findRowByInstance(const TCHAR *instance);
@@ -1484,10 +1484,10 @@ public:
    int getBaseRow(int row) const { const TableRow *r = m_data->get(row); return (r != NULL) ? r->getBaseRow() : 0; }
 
    static Table *createFromXML(const char *xml);
-   TCHAR *createXML();
+   TCHAR *createXML() const;
 
    static Table *createFromPackedXML(const char *packedXml);
-   char *createPackedXML();
+   char *createPackedXML() const;
 };
 
 /**
index 1e14457..7df3fd0 100644 (file)
@@ -350,7 +350,7 @@ Table *Table::createFromPackedXML(const char *packedXml)
 /**
  * Create XML document from table
  */
-TCHAR *Table::createXML()
+TCHAR *Table::createXML() const
 {
    String xml;
    xml.appendFormattedString(_T("<table extendedFormat=\"%s\" source=\"%d\"  name=\"%s\">\r\n"), m_extendedFormat ? _T("true") : _T("false"), m_source,
@@ -408,7 +408,7 @@ TCHAR *Table::createXML()
 /**
  * Create packed XML document
  */
-char *Table::createPackedXML()
+char *Table::createPackedXML() const
 {
    TCHAR *xml = createXML();
    if (xml == NULL)
@@ -708,32 +708,28 @@ void Table::setAt(int nRow, int nCol, double dData)
 /**
  * Get data from position
  */
-const TCHAR *Table::getAsString(int nRow, int nCol, const TCHAR *defaultValue)
+const TCHAR *Table::getAsString(int nRow, int nCol, const TCHAR *defaultValue) const
 {
-   TableRow *r = m_data->get(nRow);
+   const TableRow *r = m_data->get(nRow);
    if (r == NULL)
       return defaultValue;
    const TCHAR *v = r->getValue(nCol);
    return (v != NULL) ? v : defaultValue;
 }
 
-INT32 Table::getAsInt(int nRow, int nCol)
+INT32 Table::getAsInt(int nRow, int nCol) const
 {
-   const TCHAR *pszVal;
-
-   pszVal = getAsString(nRow, nCol);
+   const TCHAR *pszVal = getAsString(nRow, nCol);
    return pszVal != NULL ? _tcstol(pszVal, NULL, 0) : 0;
 }
 
-UINT32 Table::getAsUInt(int nRow, int nCol)
+UINT32 Table::getAsUInt(int nRow, int nCol) const
 {
-   const TCHAR *pszVal;
-
-   pszVal = getAsString(nRow, nCol);
+   const TCHAR *pszVal = getAsString(nRow, nCol);
    return pszVal != NULL ? _tcstoul(pszVal, NULL, 0) : 0;
 }
 
-INT64 Table::getAsInt64(int nRow, int nCol)
+INT64 Table::getAsInt64(int nRow, int nCol) const
 {
    const TCHAR *pszVal;
 
@@ -741,19 +737,15 @@ INT64 Table::getAsInt64(int nRow, int nCol)
    return pszVal != NULL ? _tcstoll(pszVal, NULL, 0) : 0;
 }
 
-UINT64 Table::getAsUInt64(int nRow, int nCol)
+UINT64 Table::getAsUInt64(int nRow, int nCol) const
 {
-   const TCHAR *pszVal;
-
-   pszVal = getAsString(nRow, nCol);
+   const TCHAR *pszVal = getAsString(nRow, nCol);
    return pszVal != NULL ? _tcstoull(pszVal, NULL, 0) : 0;
 }
 
-double Table::getAsDouble(int nRow, int nCol)
+double Table::getAsDouble(int nRow, int nCol) const
 {
-   const TCHAR *pszVal;
-
-   pszVal = getAsString(nRow, nCol);
+   const TCHAR *pszVal = getAsString(nRow, nCol);
    return pszVal != NULL ? _tcstod(pszVal, NULL) : 0;
 }
 
@@ -772,9 +764,9 @@ void Table::setStatusAt(int row, int col, int status)
 /**
  * Get status of given cell
  */
-int Table::getStatus(int nRow, int nCol)
+int Table::getStatus(int nRow, int nCol) const
 {
-   TableRow *r = m_data->get(nRow);
+   const TableRow *r = m_data->get(nRow);
    return (r != NULL) ? r->getStatus(nCol) : -1;
 }
 
index 6d843a5..6aade38 100644 (file)
@@ -2248,7 +2248,11 @@ bool Node::updateSoftwarePackages(PollerInfo *poller, UINT32 requestId)
 
    ObjectArray<SoftwarePackage> *packages = new ObjectArray<SoftwarePackage>(table->getNumRows(), 16, true);
    for(int i = 0; i < table->getNumRows(); i++)
-      packages->add(new SoftwarePackage(table, i));
+   {
+      SoftwarePackage *pkg = SoftwarePackage::createFromTableRow(table, i);
+      if (pkg != NULL)
+         packages->add(pkg);
+   }
    packages->sort(PackageNameComparator);
    delete table;
    sendPollerMsg(requestId, POLLER_INFO _T("Got information about %d installed software packages\r\n"), packages->size());
index 5e5824e..3525b71 100644 (file)
@@ -1,6 +1,6 @@
 /* 
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2013 Victor Kirhenshtein
+** Copyright (C) 2003-2017 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
                if (!_tcsicmp(table->getColumnName(i), _T(name))) \
                { \
                        const TCHAR *value = table->getAsString(row, i); \
-                       field = (value != NULL) ? _tcsdup(value) : NULL; \
+                       pkg->field = _tcsdup_ex(value); \
                        continue; \
                } \
        }
 
 /**
+ * Create from agent table
+ *
+ * @param table table received from agent
+ * @param row row number in a table
+ * @return new object on success, NULL on parse error
+ */
+SoftwarePackage *SoftwarePackage::createFromTableRow(const Table *table, int row)
+{
+   SoftwarePackage *pkg = new SoftwarePackage();
+   for(int i = 0; i < table->getNumColumns(); i++)
+   {
+      EXTRACT_VALUE("NAME", m_name);
+      EXTRACT_VALUE("VERSION", m_version);
+      EXTRACT_VALUE("VENDOR", m_vendor);
+      EXTRACT_VALUE("URL", m_url);
+      EXTRACT_VALUE("DESCRIPTION", m_description);
+
+      if (!_tcsicmp(table->getColumnName(i), _T("DATE")))
+         pkg->m_date = (time_t)table->getAsInt(row, i);
+   }
+
+   if (pkg->m_name == NULL)
+   {
+      delete pkg;
+      return NULL;
+   }
+   return pkg;
+}
+
+/**
  * Constructor
  *
  * @param table table received from agent
  * @param row row number in a table
  */
-SoftwarePackage::SoftwarePackage(Table *table, int row)
+SoftwarePackage::SoftwarePackage()
 {
        m_name = NULL;
        m_version = NULL;
@@ -49,18 +79,6 @@ SoftwarePackage::SoftwarePackage(Table *table, int row)
        m_date = 0;
        m_url = NULL;
        m_description = NULL;
-
-       for(int i = 0; i < table->getNumColumns(); i++)
-       {
-               EXTRACT_VALUE("NAME", m_name);
-               EXTRACT_VALUE("VERSION", m_version);
-               EXTRACT_VALUE("VENDOR", m_vendor);
-               EXTRACT_VALUE("URL", m_url);
-               EXTRACT_VALUE("DESCRIPTION", m_description);
-               
-               if (!_tcsicmp(table->getColumnName(i), _T("DATE")))
-                       m_date = (time_t)table->getAsInt(row, i);
-       }
 }
 
 /**
@@ -68,11 +86,11 @@ SoftwarePackage::SoftwarePackage(Table *table, int row)
  */
 SoftwarePackage::~SoftwarePackage()
 {
-       safe_free(m_name);
-       safe_free(m_version);
-       safe_free(m_vendor);
-       safe_free(m_url);
-       safe_free(m_description);
+       free(m_name);
+       free(m_version);
+       free(m_vendor);
+       free(m_url);
+       free(m_description);
 }
 
 /**
index 68d5fd2..fb162d4 100644 (file)
@@ -342,14 +342,17 @@ private:
        TCHAR *m_url;
        TCHAR *m_description;
 
+       SoftwarePackage();
+
 public:
-       SoftwarePackage(Table *table, int row);
        ~SoftwarePackage();
 
        void fillMessage(NXCPMessage *msg, UINT32 baseId) const;
 
        const TCHAR *getName() const { return m_name; }
        const TCHAR *getVersion() const { return m_version; }
+
+       static SoftwarePackage *createFromTableRow(const Table *table, int row);
 };
 
 /**