solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit 37014180e7913cc44cdbac5c2ae9872c10530d5c
parent 3ad13eabb7d163ed1c82b48d636c85ec7782a602
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Mon, 19 Sep 2016 18:22:03 +0200

BugFix: leak if sun spectrum set twice

Diffstat:
Msrc/ssol_sun.c | 4++++
Msrc/test_ssol_sun.c | 5+++++
2 files changed, 9 insertions(+), 0 deletions(-)

diff --git a/src/ssol_sun.c b/src/ssol_sun.c @@ -139,6 +139,10 @@ ssol_sun_set_spectrum(struct ssol_sun* sun, struct ssol_spectrum* spectrum) { if (!sun || !spectrum) return RES_BAD_ARG; + if (spectrum == sun->spectrum) /* no change */ + return RES_OK; + if (sun->spectrum) + SSOL(spectrum_ref_put(sun->spectrum)); SSOL(spectrum_ref_get(spectrum)); sun->spectrum = spectrum; return RES_OK; diff --git a/src/test_ssol_sun.c b/src/test_ssol_sun.c @@ -25,6 +25,7 @@ main(int argc, char** argv) struct mem_allocator allocator; struct ssol_device* dev; struct ssol_spectrum* spectrum; + struct ssol_spectrum* spectrum2; struct ssol_sun* sun; double dir0[3] = { 0, 0, 0 }; double dir[3] = { 1, 0, 0 }; @@ -41,6 +42,7 @@ main(int argc, char** argv) (&logger, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev), RES_OK); CHECK(ssol_spectrum_create(dev, &spectrum), RES_OK); + CHECK(ssol_spectrum_create(dev, &spectrum2), RES_OK); CHECK(ssol_sun_create_directional(NULL, &sun), RES_BAD_ARG); CHECK(ssol_sun_create_directional(dev, NULL), RES_BAD_ARG); @@ -86,6 +88,8 @@ main(int argc, char** argv) CHECK(ssol_sun_set_spectrum(NULL, spectrum), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, NULL), RES_BAD_ARG); CHECK(ssol_sun_set_spectrum(sun, spectrum), RES_OK); + CHECK(ssol_sun_set_spectrum(sun, spectrum2), RES_OK); + CHECK(ssol_sun_set_spectrum(sun, spectrum2), RES_OK); CHECK(ssol_sun_set_direction(NULL, dir), RES_BAD_ARG); CHECK(ssol_sun_set_direction(sun, NULL), RES_BAD_ARG); @@ -140,6 +144,7 @@ main(int argc, char** argv) CHECK(ssol_sun_ref_put(sun), RES_OK); CHECK(ssol_spectrum_ref_put(spectrum), RES_OK); + CHECK(ssol_spectrum_ref_put(spectrum2), RES_OK); CHECK(ssol_device_ref_put(dev), RES_OK); logger_release(&logger);