From: Carl Hetherington Date: Sun, 9 Jan 2022 21:24:06 +0000 (+0100) Subject: Fix crashes when using kdm_cli with a certificate instead of a cinema. X-Git-Tag: v2.15.183~4 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=3d40a861b4e77f04df7196cffda5b41b9852b2c7 Fix crashes when using kdm_cli with a certificate instead of a cinema. --- diff --git a/src/lib/kdm_cli.cc b/src/lib/kdm_cli.cc index e9a3651ba..e6ba600f4 100644 --- a/src/lib/kdm_cli.cc +++ b/src/lib/kdm_cli.cc @@ -354,8 +354,11 @@ from_dkdm ( continue; } - dcp::LocalTime begin(valid_from, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()); - dcp::LocalTime end(valid_to, i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()); + int const offset_hour = i->cinema ? i->cinema->utc_offset_hour() : 0; + int const offset_minute = i->cinema ? i->cinema->utc_offset_minute() : 0; + + dcp::LocalTime begin(valid_from, offset_hour, offset_minute); + dcp::LocalTime end(valid_to, offset_hour, offset_minute); auto const kdm = kdm_from_dkdm( dkdm, @@ -369,14 +372,14 @@ from_dkdm ( ); dcp::NameFormat::Map name_values; - name_values['c'] = i->cinema->name; + name_values['c'] = i->cinema ? i->cinema->name : ""; name_values['s'] = i->name; name_values['f'] = dkdm.annotation_text().get_value_or(""); name_values['b'] = begin.date() + " " + begin.time_of_day(true, false); name_values['e'] = end.date() + " " + end.time_of_day(true, false); name_values['i'] = kdm.cpl_id(); - kdms.push_back (make_shared(name_values, i->cinema.get(), i->cinema->emails, kdm)); + kdms.push_back (make_shared(name_values, i->cinema.get(), i->cinema ? i->cinema->emails : list(), kdm)); } write_files (kdms, zip, output, container_name_format, filename_format, verbose, out); if (email) { diff --git a/test/kdm_cli_test.cc b/test/kdm_cli_test.cc new file mode 100644 index 000000000..404f7f8d1 --- /dev/null +++ b/test/kdm_cli_test.cc @@ -0,0 +1,55 @@ +/* + Copyright (C) 2022 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + + +#include "lib/kdm_cli.h" +#include +#include + + +using std::string; +using std::vector; + + +BOOST_AUTO_TEST_CASE (kdm_cli_test_certificate) +{ + vector args = { + "kdm_cli", + "--verbose", + "--valid-from", "now", + "--valid-duration", "2 weeks", + "--certificate", "test/data/cert.pem", + "test/data/dkdm.xml" + }; + + char** argv = new char*[args.size()]; + for (auto i = 0U; i < args.size(); ++i) { + argv[i] = const_cast(args[i].c_str()); + } + + auto error = kdm_cli (args.size(), argv, [](string s) { std::cout << s << "\n"; }); + if (error) { + std::cout << *error << "\n"; + } + BOOST_CHECK (!error); + + delete[] argv; +} + diff --git a/test/wscript b/test/wscript index a5366b3ec..bb6484cd8 100644 --- a/test/wscript +++ b/test/wscript @@ -97,6 +97,7 @@ def build(bld): isdcf_name_test.cc j2k_bandwidth_test.cc job_manager_test.cc + kdm_cli_test.cc kdm_naming_test.cc low_bitrate_test.cc markers_test.cc