Hello,
when I tried to call pdf_fp_func_destroy in any of the test functions I
get a crash. The reason is that when a type 4 function is created the
pointers passed for domain and range are used internally like follows:
pdf_status_t
pdf_fp_func_4_new (pdf_u32_t m,
pdf_u32_t n,
pdf_real_t domain[],
pdf_real_t range[],
pdf_char_t *code,
pdf_size_t code_size,
pdf_size_t *error_at,
pdf_fp_func_t *function)
{
[...]
f->range = range;
f->domain = domain;
[...]
However when destroying the function object pdf_dealloc is called on
those values:
pdf_fp_func_destroy (pdf_fp_func_t t)
{
[...]
pdf_dealloc (t->domain);
pdf_dealloc (t->range);
[...]
I think pdf_fp_func_destroy should not free memory that has not been
allocated by pdf_fp_func[0-4]_new. A safe solution would be to
(pdf_)allocate the needed storage for f->range and f->domain on calling
pdf_fp_func[0-4]_new. The included patch applies this solution and also
includes a test to exercise the pdf_fp_func_destroy function.
Or maybe I missed the intention behind the current design?
Johannes
--
Johannes Tax
[email protected]
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: johan...@lapjoh-20100401082223-zf1eidejhz978tfi
# target_branch: http://bzr.savannah.gnu.org/r/pdf/libgnupdf/trunk/
# testament_sha1: 6bee2487249a5d106fdbf3f3269434fd39e4d30e
# timestamp: 2010-04-01 10:22:39 +0200
# base_revision_id: jema...@termi-20100331193046-z12c005e6wbgpvry
#
# Begin patch
=== modified file 'src/base/pdf-fp-func.c'
--- src/base/pdf-fp-func.c 2010-03-22 20:16:53 +0000
+++ src/base/pdf-fp-func.c 2010-04-01 08:22:23 +0000
@@ -405,6 +405,8 @@
pdf_u32_t (*debug_off)[2];
pdf_size_t debug_size;
pdf_size_t debug_alloc;
+ size_t s_domain = sizeof(pdf_real_t)*m*2;
+ size_t s_range = sizeof(pdf_real_t)*n*2;
pdf_stm_t reader_stm;
pdf_token_reader_t reader;
@@ -413,9 +415,11 @@
f = pdf_alloc (sizeof(struct pdf_fp_func_s));
f->m = m;
f->n = n;
- f->range = range;
- f->domain = domain;
f->type = 4;
+ f->domain = pdf_alloc (s_domain);
+ f->range = pdf_alloc (s_range);
+ memcpy (f->domain, domain, s_domain);
+ memcpy (f->range, range, s_range);
/* Specific data */
beg_pos = 0;
=== modified file 'torture/unit/base/fp/pdf-fp-func-4-new.c'
--- torture/unit/base/fp/pdf-fp-func-4-new.c 2010-02-20 16:02:07 +0000
+++ torture/unit/base/fp/pdf-fp-func-4-new.c 2010-04-01 08:22:23 +0000
@@ -237,7 +237,43 @@
}
END_TEST
-
+/*
+ * Test: pdf_fp_func_4_new_006
+ * Description:
+ * Create and destroy a correct function.
+ * Success condition:
+ * Creation and destruction routines should return PDF_OK.
+ */
+
+START_TEST(pdf_fp_func_4_new_006)
+{
+ pdf_fp_func_t func;
+ pdf_size_t prog_size;
+ pdf_char_t prog[] =
+ "{ pop }";
+
+ pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0};
+ pdf_real_t range[2] = {-1.0, 1.0};
+ pdf_real_t in[2];
+ pdf_real_t out[1];
+
+ pdf_init();
+
+ prog_size = strlen(prog);
+
+ /* Create the function */
+ fail_if (pdf_fp_func_4_new (2, 1,
+ domain,
+ range,
+ prog,
+ prog_size,
+ NULL,
+ &func) != PDF_OK);
+
+ /* Destroy the function */
+ fail_if (pdf_fp_func_destroy (func) != PDF_OK);
+}
+END_TEST
/*
@@ -252,6 +288,7 @@
tcase_add_test(tc, pdf_fp_func_4_new_003);
tcase_add_test(tc, pdf_fp_func_4_new_004);
tcase_add_test(tc, pdf_fp_func_4_new_005);
+ tcase_add_test(tc, pdf_fp_func_4_new_006);
return tc;
}
# Begin bundle
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
XYNZeP+LuSKcKEgUaQMDgA==