diff --git a/include/haproxy/pattern.h b/include/haproxy/pattern.h index 62fb5c04c..e689a134b 100644 --- a/include/haproxy/pattern.h +++ b/include/haproxy/pattern.h @@ -189,7 +189,7 @@ struct pat_ref *pat_ref_lookupid(int unique_id); struct pat_ref *pat_ref_new(const char *reference, const char *display, unsigned int flags); struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int flags); struct pat_ref_elt *pat_ref_find_elt(struct pat_ref *ref, const char *key); -int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line); +struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line); int pat_ref_add(struct pat_ref *ref, const char *pattern, const char *sample, char **err); int pat_ref_set(struct pat_ref *ref, const char *pattern, const char *sample, char **err); int pat_ref_set_by_id(struct pat_ref *ref, struct pat_ref_elt *refelt, const char *value, char **err); diff --git a/src/pattern.c b/src/pattern.c index 5de9de1ab..cdacefba0 100644 --- a/src/pattern.c +++ b/src/pattern.c @@ -1893,40 +1893,40 @@ struct pat_ref *pat_ref_newid(int unique_id, const char *display, unsigned int f return ref; } -/* This function adds entry to . It can failed with memory error. - * If the function fails, it returns 0. +/* This function adds entry to . It can fail on memory error. It returns + * the newly added element on success, or NULL on failure. The PATREF_LOCK on + * must be held. */ -int pat_ref_append(struct pat_ref *ref, char *pattern, char *sample, int line) +struct pat_ref_elt *pat_ref_append(struct pat_ref *ref, const char *pattern, const char *sample, int line) { struct pat_ref_elt *elt; elt = malloc(sizeof(*elt)); if (!elt) - return 0; + goto fail; elt->line = line; elt->pattern = strdup(pattern); - if (!elt->pattern) { - free(elt); - return 0; - } + if (!elt->pattern) + goto fail; if (sample) { elt->sample = strdup(sample); - if (!elt->sample) { - free(elt->pattern); - free(elt); - return 0; - } + if (!elt->sample) + goto fail; } else elt->sample = NULL; LIST_INIT(&elt->back_refs); LIST_ADDQ(&ref->head, &elt->list); - - return 1; + return elt; + fail: + if (elt) + free(elt->pattern); + free(elt); + return NULL; } /* This function create sample found in , parse the pattern also