From abf583d37240b2a8f2002d09eaadbf15ed16ec31 Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Mon, 25 Mar 2019 18:39:57 +0200 Subject: [PATCH 1/6] try to fix bug in EN_getdemandname --- src/epanet.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/epanet.c b/src/epanet.c index 29462bc..0a57aa7 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -2751,7 +2751,9 @@ int DLLEXPORT EN_getdemandname(EN_Project p, int nodeIndex, int demandIndex, for (d = p->network.Node[nodeIndex].D; n < demandIndex && d->next != NULL; d = d->next) n++; if (n != demandIndex) return 253; - strcpy(demandName, d->Name); + + if (d->Name) strcpy(demandName, d->Name); + else demandName[0] = '\0'; return 0; } From 060ca241718f44cad424e1f82200f32bdddc37da Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Tue, 26 Mar 2019 12:40:18 +0200 Subject: [PATCH 2/6] Update epanet2_2.h --- include/epanet2_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/epanet2_2.h b/include/epanet2_2.h index c7774d3..fcbd099 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -998,7 +998,7 @@ typedef struct Project *EN_Project; @param[out] demandName The name of the selected category. @return an error code. - `demandName` must be sized to contain at least @ref EN_MAXID characters. + `demandName` must be sized to contain at least @ref EN_MAXMSG characters. */ int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *demandName); @@ -1010,7 +1010,7 @@ typedef struct Project *EN_Project; @param demandName the new name assigned to the category. @return Error code. - The category name must contain no more than @ref EN_MAXID characters. + The category name must contain no more than @ref EN_MAXMSG characters. */ int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, char *demandName); From 8c5e3836921666ed02077147cac9957a69ad3459 Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Tue, 26 Mar 2019 17:06:32 +0200 Subject: [PATCH 3/6] Revert "Update epanet2_2.h" This reverts commit 060ca241718f44cad424e1f82200f32bdddc37da. --- include/epanet2_2.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/epanet2_2.h b/include/epanet2_2.h index fcbd099..c7774d3 100644 --- a/include/epanet2_2.h +++ b/include/epanet2_2.h @@ -998,7 +998,7 @@ typedef struct Project *EN_Project; @param[out] demandName The name of the selected category. @return an error code. - `demandName` must be sized to contain at least @ref EN_MAXMSG characters. + `demandName` must be sized to contain at least @ref EN_MAXID characters. */ int DLLEXPORT EN_getdemandname(EN_Project ph, int nodeIndex, int demandIndex, char *demandName); @@ -1010,7 +1010,7 @@ typedef struct Project *EN_Project; @param demandName the new name assigned to the category. @return Error code. - The category name must contain no more than @ref EN_MAXMSG characters. + The category name must contain no more than @ref EN_MAXID characters. */ int DLLEXPORT EN_setdemandname(EN_Project ph, int nodeIndex, int demandIdx, char *demandName); From 08799eb276cb1aa3c3dcf005dfb005843de8519d Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Tue, 26 Mar 2019 17:19:08 +0200 Subject: [PATCH 4/6] updates replaced MAXMSG with MAXID added a check if demandName is too long --- src/epanet.c | 7 +++++-- src/input3.c | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/epanet.c b/src/epanet.c index 0a57aa7..c715b47 100644 --- a/src/epanet.c +++ b/src/epanet.c @@ -1234,7 +1234,7 @@ int DLLEXPORT EN_setoption(EN_Project p, int option, double value) if (demand->Pat == tmpPat) { demand->Pat = pat; - demand->Name = xstrcpy(&demand->Name, "", MAXMSG); + demand->Name = xstrcpy(&demand->Name, "", MAXID); } } } @@ -2776,11 +2776,14 @@ int DLLEXPORT EN_setdemandname(EN_Project p, int nodeIndex, int demandIndex, if (!p->Openflag) return 102; if (nodeIndex <= 0 || nodeIndex > p->network.Njuncs) return 203; + // Check that demandName is not too long + if (strlen(demandName) > MAXID) return 250; + // Locate demand category record and assign demandName to it for (d = p->network.Node[nodeIndex].D; n < demandIndex && d->next != NULL; d = d->next) n++; if (n != demandIndex) return 253; - d->Name = xstrcpy(&d->Name, demandName, MAXMSG); + d->Name = xstrcpy(&d->Name, demandName, MAXID); return 0; } diff --git a/src/input3.c b/src/input3.c index fb35da2..2608f75 100644 --- a/src/input3.c +++ b/src/input3.c @@ -742,7 +742,7 @@ int demanddata(Project *pr) // with what is specified in this section demand->Base = y; demand->Pat = p; - demand->Name = xstrcpy(&demand->Name, parser->Comment, MAXMSG); + demand->Name = xstrcpy(&demand->Name, parser->Comment, MAXID); hyd->NodeDemand[j] = MISSING; // marker - next iteration will append a new category. } @@ -755,7 +755,7 @@ int demanddata(Project *pr) if (demand == NULL) return 101; demand->Base = y; demand->Pat = p; - demand->Name = xstrcpy(&demand->Name, parser->Comment, MAXMSG); + demand->Name = xstrcpy(&demand->Name, parser->Comment, MAXID); demand->next = NULL; cur_demand->next = demand; } From 73f8499f548b569b6cf9ccedf41b6fbc46da5418 Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Tue, 26 Mar 2019 17:29:25 +0200 Subject: [PATCH 5/6] Update input1.c --- src/input1.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input1.c b/src/input1.c index fe606d9..e1cbcdf 100644 --- a/src/input1.c +++ b/src/input1.c @@ -334,7 +334,7 @@ void adjustdata(Project *pr) if (demand->Pat == 0) { demand->Pat = hyd->DefPat; - xstrcpy(&demand->Name, "", MAXMSG); + xstrcpy(&demand->Name, "", MAXID); } } } From bd8a21d23c636f23137d606969a4767d22915cbd Mon Sep 17 00:00:00 2001 From: mariosmsk Date: Wed, 27 Mar 2019 22:02:34 +0200 Subject: [PATCH 6/6] Update test_demand.cpp --- tests/test_demand.cpp | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/tests/test_demand.cpp b/tests/test_demand.cpp index 2955079..9a02ff7 100644 --- a/tests/test_demand.cpp +++ b/tests/test_demand.cpp @@ -20,7 +20,7 @@ BOOST_AUTO_TEST_SUITE (test_demand) BOOST_AUTO_TEST_CASE(test_categories_save) { - int error = 0; + int error = 0; int Nindex, ndem; EN_Project ph = NULL; @@ -34,15 +34,19 @@ BOOST_AUTO_TEST_CASE(test_categories_save) BOOST_REQUIRE(error == 0); BOOST_CHECK(ndem == 1); - error = EN_setdemandname(ph, Nindex, ndem, (char *)"Demand category name"); + char demname[31]; + error = EN_getdemandname(ph, Nindex, ndem, demname); + BOOST_REQUIRE(error == 0); + + error = EN_setdemandname(ph, Nindex, ndem, (char *)"Demand category name"); BOOST_REQUIRE(error == 0); error = EN_saveinpfile(ph, "net1_dem_cat.inp"); BOOST_REQUIRE(error == 0); error = EN_close(ph); - BOOST_REQUIRE(error == 0); - error = EN_deleteproject(&ph); - BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(error == 0); + error = EN_deleteproject(&ph); + BOOST_REQUIRE(error == 0); } BOOST_AUTO_TEST_CASE(test_categories_reopen, * boost::unit_test::depends_on("test_demand/test_categories_save")) @@ -52,11 +56,11 @@ BOOST_AUTO_TEST_CASE(test_categories_reopen, * boost::unit_test::depends_on("tes EN_Project ph = NULL; - BOOST_TEST_CHECKPOINT("Reopening saved input file"); + BOOST_TEST_CHECKPOINT("Reopening saved input file"); error = EN_createproject(&ph); - BOOST_REQUIRE(error == 0); - error = EN_open(ph, "net1_dem_cat.inp", DATA_PATH_RPT, DATA_PATH_OUT); - BOOST_REQUIRE(error == 0); + BOOST_REQUIRE(error == 0); + error = EN_open(ph, "net1_dem_cat.inp", DATA_PATH_RPT, DATA_PATH_OUT); + BOOST_REQUIRE(error == 0); error = EN_getnodeindex(ph, (char *)"12", &Nindex); BOOST_REQUIRE(error == 0); @@ -64,16 +68,16 @@ BOOST_AUTO_TEST_CASE(test_categories_reopen, * boost::unit_test::depends_on("tes BOOST_REQUIRE(error == 0); BOOST_CHECK(ndem == 1); - char demname[80]; - error = EN_getdemandname(ph, Nindex, ndem, demname); + char demname[31]; + error = EN_getdemandname(ph, Nindex, ndem, demname); BOOST_REQUIRE(error == 0); BOOST_CHECK(check_string(demname, "Demand category name")); - error = EN_close(ph); - BOOST_REQUIRE(error == 0); - error = EN_deleteproject(&ph); - BOOST_REQUIRE(error == 0); + error = EN_close(ph); + BOOST_REQUIRE(error == 0); + error = EN_deleteproject(&ph); + BOOST_REQUIRE(error == 0); } BOOST_AUTO_TEST_SUITE_END()