[mythtv-commits] Ticket #13466: mythzmserver stdlib assumptions

MythTV noreply at mythtv.org
Thu Jul 4 04:55:23 UTC 2019


#13466: mythzmserver stdlib assumptions
-----------------------------------------+--------------------------
     Reporter:  dscoular                 |      Owner:  (none)
         Type:  Bug Report - Crash       |     Status:  new
     Priority:  minor                    |  Milestone:  needs_triage
    Component:  Plugin - MythZoneminder  |    Version:  v30-fixes
     Severity:  medium                   |   Keywords:  mythzmserver
Ticket locked:  0                        |
-----------------------------------------+--------------------------
 zmserver.cpp makes assumptions that the row being returned from the
 zoneminder database has fields which are not NULL.
 In my case, my zoneminder database has cameras where there is no "host"
 defined because they are defined as ffmpeg cameras which have a "source
 path" rather than a "host" defined.
 {{{
 mysql> SELECT Id, Name, Type, Device, Host, Channel, Function, Enabled
 FROM Monitors;
 +----+----------+--------+-------------+---------------------+---------+----------+---------+
 | Id | Name     | Type   | Device      | Host                | Channel |
 Function | Enabled |
 +----+----------+--------+-------------+---------------------+---------+----------+---------+
 |  1 | Dericam  | Remote | /dev/video0 | camera.thepoint.org |       0 |
 Modect   |       1 |
 |  2 | Fisheye  | Ffmpeg | /dev/video0 | NULL                |       0 |
 Modect   |       1 |
 |  3 | Backdoor | Ffmpeg | /dev/video0 | NULL                |       0 |
 Modect   |       1 |
 |  4 | Lounge   | Ffmpeg | /dev/video0 | NULL                |       0 |
 Modect   |       0 |
 +----+----------+--------+-------------+---------------------+---------+----------+---------+
 4 rows in set (0.00 sec)
 }}}
 This means that, for example, when row[4] is assigned to the host string
 variable for camera 2, 3 or 4 it is set to NULL (0x0) which causes an
 exception on the first assignment attempt. See
 https://stackoverflow.com/questions/11617552/c-assigning-null-
 to-a-string/53785687 for more about assigning NULL to strings.

 Here's my simplistic patch just for the "host" string field:
 {{{
 # git --no-pager diff zmserver.cpp
 diff --git a/mythplugins/mythzoneminder/mythzmserver/zmserver.cpp
 b/mythplugins/mythzoneminder/mythzmserver/zmserver.cpp
 index 96365f3468..0dd1f8d5e2 100644
 --- a/mythplugins/mythzoneminder/mythzmserver/zmserver.cpp
 +++ b/mythplugins/mythzoneminder/mythzmserver/zmserver.cpp
 @@ -986,7 +986,10 @@ void ZMServer::handleGetMonitorStatus(void)
              string id = row[0];
              string type = row[2];
              string device = row[3];
 -            string host = row[4];
 +           string host = "";
 +           if (row[4]) {       // Dug FIXME.
 +             host = row[4];
 +           }
              string channel = row[5];
              string function = row[6];
              string enabled = row[7];
 @@ -1734,7 +1737,7 @@ void ZMServer::getMonitorList(void)
              m->m_function = row[8];
              m->m_enabled = atoi(row[9]);
              m->m_device = row[10];
 -            m->m_host = row[11];
 +            m->m_host = row[11] || ""; // Dug FIXME.
              m->m_controllable = atoi(row[12]);
              m->m_trackMotion = atoi(row[13]);
 }}}

 With the above fix in place all my cameras work in mythzoneminder and
 mythzmserver happily runs in the background.

 Again, I'm no C++ programmer but the above lame fix stopped zmserver.cpp
 giving a segmentation fault on startup.

 I'm not even sure how to submit fixes to mythtv. I think all the fields
 from the database should be checked that they are not NULL or the query
 itself could, perhaps, be altered to use IFNULL('field', \'\').

 Cheers,

 Doug

-- 
Ticket URL: <https://code.mythtv.org/trac/ticket/13466>
MythTV <http://www.mythtv.org>
MythTV Media Center


More information about the mythtv-commits mailing list