Skip to content

Commit 9c93af7

Browse files
committed
content filter asan fixes
1 parent dc51c4a commit 9c93af7

File tree

18 files changed

+446
-373
lines changed

18 files changed

+446
-373
lines changed

src/core/ddsc/include/dds/dds.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1663,17 +1663,15 @@ struct dds_content_filter {
16631663
} filter; /**< Provide a filter implementation container */
16641664
};
16651665

1666-
DDS_EXPORT dds_return_t dds_expression_filter_init (const char *expression, dds_expression_content_filter_t **filter);
1667-
DDS_EXPORT void dds_expression_filter_fini (dds_expression_content_filter_t *filter);
1668-
1666+
DDS_EXPORT dds_return_t dds_expression_filter_create (const char *expression, dds_expression_content_filter_t **filter);
1667+
DDS_EXPORT void dds_expression_filter_free (dds_expression_content_filter_t *filter);
16691668
DDS_EXPORT dds_return_t dds_expression_filter_bind_integer (dds_expression_content_filter_t *filter, size_t id, int64_t param);
16701669
DDS_EXPORT dds_return_t dds_expression_filter_bind_real (dds_expression_content_filter_t *filter, size_t id, double param);
16711670
DDS_EXPORT dds_return_t dds_expression_filter_bind_string (dds_expression_content_filter_t *filter, size_t id, char *param);
16721671
DDS_EXPORT dds_return_t dds_expression_filter_bind_blob (dds_expression_content_filter_t *filter, size_t id, unsigned char *param, size_t param_sz);
16731672

1674-
DDS_EXPORT dds_return_t dds_function_filter_init (const dds_function_content_filter_mode_t mode, const dds_function_content_filter_fn_t fn, dds_function_content_filter_t **filter);
1675-
DDS_EXPORT void dds_function_filter_fini (dds_function_content_filter_t *filter);
1676-
1673+
DDS_EXPORT dds_return_t dds_function_filter_create (const dds_function_content_filter_mode_t mode, const dds_function_content_filter_fn_t fn, dds_function_content_filter_t **filter);
1674+
DDS_EXPORT void dds_function_filter_free (dds_function_content_filter_t *filter);
16771675
DDS_EXPORT dds_return_t dds_function_filter_bind_arg (dds_function_content_filter_t *filter, void *arg);
16781676

16791677
/**

src/core/ddsc/src/dds__content_filter.h

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@
1111
#ifndef DDS__CONTENT_FILTER_H
1212
#define DDS__CONTENT_FILTER_H
1313

14-
#include "dds/dds.h"
1514
#include "dds__sql_expr.h"
1615

1716
#if defined (__cplusplus)
1817
extern "C" {
1918
#endif
2019

21-
// FIXME: #define DDS_EXPR_FILTER_PARAM_UINTEGER DDS_SLQ_TK_UINT
20+
/* #define DDS_EXPR_FILTER_PARAM_UINTEGER DDS_SLQ_TK_UINT */
2221
#define DDS_EXPR_FILTER_PARAM_INTEGER DDS_SQL_TK_INTEGER
2322
#define DDS_EXPR_FILTER_PARAM_REAL DDS_SQL_TK_FLOAT
2423
#define DDS_EXPR_FILTER_PARAM_STRING DDS_SQL_TK_STRING
@@ -28,7 +27,7 @@ struct dds_expression_filter_param
2827
{
2928
int t;
3029
union {
31-
int64_t i; double d;;
30+
int64_t i; double d;
3231
} n;
3332
union {
3433
char *s;
@@ -44,14 +43,9 @@ struct dds_expression_content_filter
4443
struct dds_expression_filter_param *param;
4544
};
4645

47-
bool dds_content_filter_copy (
48-
const struct dds_content_filter *from, struct dds_content_filter *to);
49-
50-
bool dds_content_filter_compare (
51-
const struct dds_content_filter *a, const struct dds_content_filter *b);
52-
53-
bool dds_content_filter_validate (
54-
const struct dds_content_filter *filter);
46+
struct dds_content_filter *dds_content_filter_dup (const struct dds_content_filter *filter);
47+
void dds_content_filter_free (struct dds_content_filter *filter);
48+
bool dds_content_filter_valid (const struct dds_content_filter *filter);
5549

5650
#if defined (__cplusplus)
5751
}

src/core/ddsc/src/dds__filter.h

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,37 +17,11 @@
1717
extern "C" {
1818
#endif
1919

20-
dds_return_t
21-
dds_filter_init (
22-
dds_domainid_t domain_id,
23-
const struct dds_content_filter *filter,
24-
const struct ddsi_sertype *st,
25-
struct dds_filter **out);
26-
27-
void
28-
dds_filter_fini(
29-
struct dds_filter *filter);
30-
31-
dds_return_t
32-
dds_filter_update(
33-
const struct dds_content_filter *filter,
34-
const struct ddsi_sertype *st,
35-
struct dds_filter **out);
36-
37-
bool
38-
dds_filter_reader_accept(
39-
const struct dds_filter *filter,
40-
const struct dds_reader *rd,
41-
const struct ddsi_serdata *sd,
42-
const struct dds_sample_info *si
43-
);
44-
45-
bool
46-
dds_filter_writer_accept(
47-
const struct dds_filter *filter,
48-
const struct dds_writer *wr,
49-
const void *sample
50-
);
20+
dds_return_t dds_filter_create (dds_domainid_t domain_id, const struct dds_content_filter *filter, const struct ddsi_sertype *st, struct dds_filter **out);
21+
void dds_filter_free (struct dds_filter *filter);
22+
dds_return_t dds_filter_update (const struct dds_content_filter *filter, const struct ddsi_sertype *st, struct dds_filter *out);
23+
bool dds_filter_reader_accept (const struct dds_filter *filter, const struct dds_reader *rd, const struct ddsi_serdata *sd, const struct dds_sample_info *si);
24+
bool dds_filter_writer_accept (const struct dds_filter *filter, const struct dds_writer *wr, const void *sample);
5125

5226
#if defined (__cplusplus)
5327
}

src/core/ddsc/src/dds__types.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -438,10 +438,8 @@ typedef struct dds_writer {
438438
} dds_writer;
439439

440440
struct dds_filter_ops {
441-
dds_return_t (*init) (dds_domainid_t domain_id, const struct dds_content_filter *con_filter, const struct ddsi_sertype *st, struct dds_filter **filter);
442-
void (*fini) (struct dds_filter *filter);
443-
dds_return_t (*apply) (const dds_entity_t entity, const struct dds_filter *filter);
444-
bool(*reader_accept) (const dds_reader *rd, const struct dds_filter *filter, const struct ddsi_serdata *sample, const struct dds_sample_info *si);
441+
void (*free) (struct dds_filter *filter);
442+
bool (*reader_accept) (const dds_reader *rd, const struct dds_filter *filter, const struct ddsi_serdata *sample, const struct dds_sample_info *si);
445443
bool (*writer_accept) (const dds_writer *wr, const struct dds_filter *filter, const void *sample);
446444
};
447445

src/core/ddsc/src/dds_content_filter.c

Lines changed: 60 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
#include <stdlib.h>
1212
#include <string.h>
1313

14+
#include "dds/dds.h"
1415
#include "dds/ddsrt/heap.h"
1516
#include "dds/ddsrt/string.h"
1617

1718
#include "dds__content_filter.h"
1819

19-
dds_return_t dds_expression_filter_init(const char *expression, dds_expression_content_filter_t **filter)
20+
dds_return_t dds_expression_filter_create(const char *expression, dds_expression_content_filter_t **filter)
2021
{
2122
if (filter == NULL || expression == NULL)
2223
return DDS_RETCODE_BAD_PARAMETER;
@@ -28,8 +29,10 @@ dds_return_t dds_expression_filter_init(const char *expression, dds_expression_c
2829
return DDS_RETCODE_OK;
2930
}
3031

31-
void dds_expression_filter_fini(dds_expression_content_filter_t *filter)
32+
void dds_expression_filter_free(dds_expression_content_filter_t *filter)
3233
{
34+
if (filter == NULL)
35+
return;
3336
dds_expression_content_filter_t *ef = filter;
3437
ddsrt_free(ef->expression);
3538
ddsrt_free(ef->param);
@@ -48,28 +51,25 @@ static void filter_param_clean(struct dds_expression_filter_param *param)
4851

4952
static bool filter_param_copy(struct dds_expression_filter_param *from, struct dds_expression_filter_param *to)
5053
{
51-
if (from == NULL && to == NULL)
54+
if (from == NULL || to == NULL)
5255
return false;
5356
filter_param_clean (to);
5457
to->t = from->t;
5558
to->n = from->n;
5659
if ((to->sz = from->sz) != 0) {
5760
if (to->t == DDS_EXPR_FILTER_PARAM_STRING) to->s.s = ddsrt_strdup(from->s.s);
5861
else if (to->t == DDS_EXPR_FILTER_PARAM_BLOB) to->s.u = ddsrt_memdup(from->s.u, to->sz);
59-
else abort();
62+
else return false;
6063
}
6164
return true;
6265
}
6366

6467
static dds_return_t expression_filter_param_set (dds_expression_content_filter_t *filter, size_t id, struct dds_expression_filter_param p)
6568
{
66-
dds_return_t ret = DDS_RETCODE_OK;
6769
dds_expression_content_filter_t *ef = filter;
68-
if (id > ef->nparam || ef->param == NULL) return DDS_RETCODE_BAD_PARAMETER;
69-
70-
filter_param_copy(&p, &ef->param[id-1]);
71-
72-
return ret;
70+
if (id > ef->nparam || ef->param == NULL)
71+
return DDS_RETCODE_BAD_PARAMETER;
72+
return filter_param_copy(&p, &ef->param[id-1]) ? DDS_RETCODE_OK: DDS_RETCODE_BAD_PARAMETER;
7373
}
7474

7575
dds_return_t dds_expression_filter_bind_integer (dds_expression_content_filter_t *filter, size_t id, int64_t param)
@@ -96,7 +96,7 @@ dds_return_t dds_expression_filter_bind_blob (dds_expression_content_filter_t *f
9696
return expression_filter_param_set(filter, id, p);
9797
}
9898

99-
dds_return_t dds_function_filter_init(const dds_function_content_filter_mode_t mode, const dds_function_content_filter_fn_t fn, dds_function_content_filter_t **filter)
99+
dds_return_t dds_function_filter_create(const dds_function_content_filter_mode_t mode, const dds_function_content_filter_fn_t fn, dds_function_content_filter_t **filter)
100100
{
101101
if (filter == NULL)
102102
return DDS_RETCODE_BAD_PARAMETER;
@@ -108,8 +108,10 @@ dds_return_t dds_function_filter_init(const dds_function_content_filter_mode_t m
108108
return DDS_RETCODE_OK;
109109
}
110110

111-
void dds_function_filter_fini(dds_function_content_filter_t *filter)
111+
void dds_function_filter_free(dds_function_content_filter_t *filter)
112112
{
113+
if (filter == NULL)
114+
return;
113115
dds_function_content_filter_t *ff = filter;
114116
ddsrt_free(ff);
115117
}
@@ -136,45 +138,6 @@ static bool expression_filter_copy(const dds_expression_content_filter_t *from,
136138
return true;
137139
}
138140

139-
static bool expression_filter_param_cmp (const struct dds_expression_filter_param *a, const struct dds_expression_filter_param *b)
140-
{
141-
if (a == NULL || b == NULL)
142-
return false;
143-
if (a->t != b->t)
144-
return false;
145-
else if (memcmp (&a->n, &b->n, sizeof(a->n)))
146-
return false;
147-
else if (a->sz != 0 || b->sz != 0)
148-
{
149-
if (a->sz != b->sz)
150-
return false;
151-
else if (a->t == DDS_EXPR_FILTER_PARAM_STRING && (strcmp(a->s.s, b->s.s)))
152-
return false;
153-
else if (a->t == DDS_EXPR_FILTER_PARAM_BLOB && (memcmp(a->s.u, b->s.u, (size_t)a->n.i)))
154-
return false;
155-
}
156-
157-
return true;
158-
}
159-
160-
static bool expression_filter_cmp(const dds_expression_content_filter_t *a, const dds_expression_content_filter_t *b)
161-
{
162-
if (a == NULL || b == NULL)
163-
return false;
164-
if (strcmp (a->expression, b->expression))
165-
return false;
166-
else if (a->nparam != b->nparam)
167-
return false;
168-
else
169-
{
170-
size_t i = 0;
171-
for (i = 0; i < a->nparam && expression_filter_param_cmp (&a->param[i], &b->param[i]); i++) {}
172-
if (i != a->nparam - 1)
173-
return false;
174-
}
175-
return true;
176-
}
177-
178141
static bool function_filter_copy(const dds_function_content_filter_t *from, dds_function_content_filter_t *to)
179142
{
180143
if (from == NULL || to == NULL)
@@ -185,50 +148,65 @@ static bool function_filter_copy(const dds_function_content_filter_t *from, dds_
185148
return true;
186149
}
187150

188-
static bool function_filter_cmp(const dds_function_content_filter_t *a, const dds_function_content_filter_t *b)
151+
bool dds_content_filter_valid (const struct dds_content_filter *filter)
189152
{
190-
if (a == NULL || b == NULL)
191-
return false;
192-
if (a->mode != b->mode)
193-
return false;
194-
else if (!memcmp(&a->f, &b->f, sizeof(a->f)))
195-
return false;
196-
return true;
153+
if (filter == NULL)
154+
return true;
155+
156+
return filter->kind == DDS_CONTENT_FILTER_EXPRESSION? filter->filter.expr != NULL: filter->filter.func != NULL;
197157
}
198158

199-
bool dds_content_filter_copy (const struct dds_content_filter *from, struct dds_content_filter *to)
159+
void dds_content_filter_free (struct dds_content_filter *filter)
200160
{
201-
bool result = false;
202-
if (from == NULL || to == NULL)
203-
return result;
161+
if (filter == NULL)
162+
return;
204163

205-
to->kind = from->kind;
206-
switch (from->kind)
164+
switch (filter->kind)
207165
{
208166
case DDS_CONTENT_FILTER_EXPRESSION:
209-
to->filter.expr = (dds_expression_content_filter_t *) ddsrt_malloc(sizeof(*to->filter.expr));
210-
result = expression_filter_copy (from->filter.expr, to->filter.expr);
167+
dds_expression_filter_free (filter->filter.expr);
211168
break;
212169
case DDS_CONTENT_FILTER_FUNCTION:
213-
to->filter.func = (dds_function_content_filter_t *) ddsrt_malloc(sizeof(*to->filter.func));
214-
result = function_filter_copy (from->filter.func, to->filter.func);
170+
dds_function_filter_free (filter->filter.func);
215171
break;
216-
default:
217-
abort();
218172
}
219173

220-
return result;
174+
ddsrt_free (filter);
221175
}
222176

223-
bool dds_content_filter_compare(const struct dds_content_filter *a, const struct dds_content_filter *b)
177+
struct dds_content_filter *dds_content_filter_dup (const struct dds_content_filter *filter)
224178
{
225-
if (a == NULL || b == NULL)
226-
return false;
227-
else if (a->kind != b->kind)
228-
return false;
229-
else if (a->kind == DDS_CONTENT_FILTER_EXPRESSION && !expression_filter_cmp (a->filter.expr, b->filter.expr))
230-
return false;
231-
else if (a->kind == DDS_CONTENT_FILTER_FUNCTION && !function_filter_cmp (a->filter.func, b->filter.func))
232-
return false;
233-
return true;
179+
if (filter == NULL)
180+
return NULL;
181+
struct dds_content_filter *res = (struct dds_content_filter *) ddsrt_malloc(sizeof(*res));
182+
switch (filter->kind)
183+
{
184+
case DDS_CONTENT_FILTER_EXPRESSION:
185+
{
186+
dds_expression_content_filter_t *expr = (dds_expression_content_filter_t *) ddsrt_malloc(sizeof(*expr));
187+
if (!expression_filter_copy(filter->filter.expr, expr)) {
188+
ddsrt_free (expr);
189+
goto err_copy;
190+
}
191+
res->filter.expr = expr;
192+
break;
193+
}
194+
case DDS_CONTENT_FILTER_FUNCTION:
195+
{
196+
dds_function_content_filter_t *func = (dds_function_content_filter_t *) ddsrt_malloc(sizeof(*func));
197+
if (!function_filter_copy (filter->filter.func, func)) {
198+
ddsrt_free (func);
199+
goto err_copy;
200+
}
201+
res->filter.func = func;
202+
break;
203+
}
204+
}
205+
206+
res->kind = filter->kind;
207+
return res;
208+
209+
err_copy:
210+
ddsrt_free (res);
211+
return NULL;
234212
}

0 commit comments

Comments
 (0)