Merge pull request #8576 from keszybz/oss-fuzz
oss-fuzz adjustments and other cleanups
This commit is contained in:
@@ -1976,7 +1976,7 @@ int cg_slice_to_path(const char *unit, char **ret) {
|
||||
_cleanup_free_ char *escaped = NULL;
|
||||
char n[dash - p + sizeof(".slice")];
|
||||
|
||||
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
|
||||
#if HAS_FEATURE_MEMORY_SANITIZER
|
||||
/* msan doesn't instrument stpncpy, so it thinks
|
||||
* n is later used unitialized:
|
||||
* https://github.com/google/sanitizers/issues/926
|
||||
|
||||
@@ -63,6 +63,17 @@
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if !defined(HAS_FEATURE_MEMORY_SANITIZER)
|
||||
# if defined(__has_feature)
|
||||
# if __has_feature(memory_sanitizer)
|
||||
# define HAS_FEATURE_MEMORY_SANITIZER 1
|
||||
# endif
|
||||
# endif
|
||||
# if !defined(HAS_FEATURE_MEMORY_SANITIZER)
|
||||
# define HAS_FEATURE_MEMORY_SANITIZER 0
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Temporarily disable some warnings */
|
||||
#define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT \
|
||||
_Pragma("GCC diagnostic push"); \
|
||||
|
||||
+30
-35
@@ -24,6 +24,7 @@
|
||||
|
||||
#include "alloc-util.h"
|
||||
#include "strbuf.h"
|
||||
#include "util.h"
|
||||
|
||||
/*
|
||||
* Strbuf stores given strings in a single continuous allocated memory
|
||||
@@ -46,33 +47,31 @@
|
||||
struct strbuf *strbuf_new(void) {
|
||||
struct strbuf *str;
|
||||
|
||||
str = new0(struct strbuf, 1);
|
||||
str = new(struct strbuf, 1);
|
||||
if (!str)
|
||||
return NULL;
|
||||
*str = (struct strbuf) {
|
||||
.buf = new0(char, 1),
|
||||
.root = new0(struct strbuf_node, 1),
|
||||
.len = 1,
|
||||
.nodes_count = 1,
|
||||
};
|
||||
if (!str->buf || !str->root) {
|
||||
free(str->buf);
|
||||
free(str->root);
|
||||
return mfree(str);
|
||||
}
|
||||
|
||||
str->buf = new0(char, 1);
|
||||
if (!str->buf)
|
||||
goto err;
|
||||
str->len = 1;
|
||||
|
||||
str->root = new0(struct strbuf_node, 1);
|
||||
if (!str->root)
|
||||
goto err;
|
||||
str->nodes_count = 1;
|
||||
return str;
|
||||
err:
|
||||
free(str->buf);
|
||||
free(str->root);
|
||||
return mfree(str);
|
||||
}
|
||||
|
||||
static void strbuf_node_cleanup(struct strbuf_node *node) {
|
||||
static struct strbuf_node* strbuf_node_cleanup(struct strbuf_node *node) {
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < node->children_count; i++)
|
||||
strbuf_node_cleanup(node->children[i].child);
|
||||
free(node->children);
|
||||
free(node);
|
||||
return mfree(node);
|
||||
}
|
||||
|
||||
/* clean up trie data, leave only the string buffer */
|
||||
@@ -80,16 +79,12 @@ void strbuf_complete(struct strbuf *str) {
|
||||
if (!str)
|
||||
return;
|
||||
if (str->root)
|
||||
strbuf_node_cleanup(str->root);
|
||||
str->root = NULL;
|
||||
str->root = strbuf_node_cleanup(str->root);
|
||||
}
|
||||
|
||||
/* clean up everything */
|
||||
void strbuf_cleanup(struct strbuf *str) {
|
||||
if (!str)
|
||||
return;
|
||||
if (str->root)
|
||||
strbuf_node_cleanup(str->root);
|
||||
strbuf_complete(str);
|
||||
free(str->buf);
|
||||
free(str);
|
||||
}
|
||||
@@ -138,13 +133,15 @@ ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
|
||||
return -EINVAL;
|
||||
|
||||
/* search string; start from last character to find possibly matching tails */
|
||||
if (len == 0)
|
||||
return 0;
|
||||
|
||||
str->in_count++;
|
||||
if (len == 0) {
|
||||
str->dedup_count++;
|
||||
return 0;
|
||||
}
|
||||
str->in_len += len;
|
||||
|
||||
node = str->root;
|
||||
c = s[len-1];
|
||||
for (depth = 0; depth <= len; depth++) {
|
||||
struct strbuf_child_entry search;
|
||||
|
||||
@@ -158,15 +155,11 @@ ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
|
||||
|
||||
c = s[len - 1 - depth];
|
||||
|
||||
/* bsearch is not allowed on a NULL sequence */
|
||||
if (node->children_count == 0)
|
||||
break;
|
||||
|
||||
/* lookup child node */
|
||||
search.c = c;
|
||||
child = bsearch(&search, node->children, node->children_count,
|
||||
sizeof(struct strbuf_child_entry),
|
||||
(__compar_fn_t) strbuf_children_cmp);
|
||||
child = bsearch_safe(&search, node->children, node->children_count,
|
||||
sizeof(struct strbuf_child_entry),
|
||||
(__compar_fn_t) strbuf_children_cmp);
|
||||
if (!child)
|
||||
break;
|
||||
node = child->child;
|
||||
@@ -183,11 +176,13 @@ ssize_t strbuf_add_string(struct strbuf *str, const char *s, size_t len) {
|
||||
str->buf[str->len++] = '\0';
|
||||
|
||||
/* new node */
|
||||
node_child = new0(struct strbuf_node, 1);
|
||||
node_child = new(struct strbuf_node, 1);
|
||||
if (!node_child)
|
||||
return -ENOMEM;
|
||||
node_child->value_off = off;
|
||||
node_child->value_len = len;
|
||||
*node_child = (struct strbuf_node) {
|
||||
.value_off = off,
|
||||
.value_len = len,
|
||||
};
|
||||
|
||||
/* extend array, add new entry, sort for bisection */
|
||||
child = reallocarray(node->children, node->children_count + 1, sizeof(struct strbuf_child_entry));
|
||||
|
||||
@@ -91,6 +91,19 @@ void *xbsearch_r(const void *key, const void *base, size_t nmemb, size_t size,
|
||||
int (*compar) (const void *, const void *, void *),
|
||||
void *arg);
|
||||
|
||||
/**
|
||||
* Normal bsearch requires base to be nonnull. Here were require
|
||||
* that only if nmemb > 0.
|
||||
*/
|
||||
static inline void* bsearch_safe(const void *key, const void *base,
|
||||
size_t nmemb, size_t size, comparison_fn_t compar) {
|
||||
if (nmemb <= 0)
|
||||
return NULL;
|
||||
|
||||
assert(base);
|
||||
return bsearch(key, base, nmemb, size, compar);
|
||||
}
|
||||
|
||||
/**
|
||||
* Normal qsort requires base to be nonnull. Here were require
|
||||
* that only if nmemb > 0.
|
||||
|
||||
Reference in New Issue
Block a user