Merge pull request #9131 from poettering/memory-startswith

add new memory_startswith() helper and make use of it everywhere
This commit is contained in:
Lennart Poettering 2018-05-31 11:21:43 +02:00 committed by GitHub
commit 49f733c053
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 49 additions and 39 deletions

View file

@ -1037,13 +1037,9 @@ int log_struct_iovec_internal(
return -error;
}
for (i = 0; i < n_input_iovec; i++) {
if (input_iovec[i].iov_len < STRLEN("MESSAGE="))
continue;
if (memcmp(input_iovec[i].iov_base, "MESSAGE=", STRLEN("MESSAGE=")) == 0)
for (i = 0; i < n_input_iovec; i++)
if (memory_startswith(input_iovec[i].iov_base, input_iovec[i].iov_len, "MESSAGE="))
break;
}
if (_unlikely_(i >= n_input_iovec)) /* Couldn't find MESSAGE=? */
return -error;

View file

@ -209,3 +209,21 @@ static inline size_t strlen_ptr(const char *s) {
return strlen(s);
}
/* Like startswith(), but operates on arbitrary memory blocks */
static inline void *memory_startswith(const void *p, size_t sz, const char *token) {
size_t n;
assert(token);
n = strlen(token);
if (sz < n)
return NULL;
assert(p);
if (memcmp(p, token, n) != 0)
return NULL;
return (uint8_t*) p + n;
}

View file

@ -852,21 +852,18 @@ static void map_context_fields(const struct iovec *iovec, const char* context[])
assert(context);
for (i = 0; i < ELEMENTSOF(context_field_names); i++) {
size_t l;
char *p;
if (!context_field_names[i])
continue;
l = strlen(context_field_names[i]);
if (iovec->iov_len < l)
continue;
if (memcmp(iovec->iov_base, context_field_names[i], l) != 0)
p = memory_startswith(iovec->iov_base, iovec->iov_len, context_field_names[i]);
if (!p)
continue;
/* Note that these strings are NUL terminated, because we made sure that a trailing NUL byte is in the
* buffer, though not included in the iov_len count. (see below) */
context[i] = (char*) iovec->iov_base + l;
context[i] = p;
break;
}
}

View file

@ -365,19 +365,14 @@ struct curl_slist *curl_slist_new(const char *first, ...) {
}
int curl_header_strdup(const void *contents, size_t sz, const char *field, char **value) {
const char *p = contents;
size_t l;
const char *p;
char *s;
l = strlen(field);
if (sz < l)
p = memory_startswith(contents, sz, field);
if (!p)
return 0;
if (memcmp(p, field, l) != 0)
return 0;
p += l;
sz -= l;
sz -= p - (const char*) contents;
if (memchr(p, 0, sz))
return 0;

View file

@ -248,16 +248,13 @@ static bool line_equals(const char *s, size_t m, const char *line) {
}
static bool line_begins(const char *s, size_t m, const char *word) {
size_t l;
const char *p;
l = strlen(word);
if (m < l)
p = memory_startswith(s, m, word);
if (!p)
return false;
if (memcmp(s, word, l) != 0)
return false;
return m == l || (m > l && s[l] == ' ');
return IN_SET(*p, 0, ' ');
}
static int verify_anonymous_token(sd_bus *b, const char *p, size_t l) {

View file

@ -353,10 +353,7 @@ int dns_label_undo_idna(const char *encoded, size_t encoded_size, char *decoded,
if (encoded_size <= 0 || encoded_size > DNS_LABEL_MAX)
return -EINVAL;
if (encoded_size < sizeof(IDNA_ACE_PREFIX)-1)
return 0;
if (memcmp(encoded, IDNA_ACE_PREFIX, sizeof(IDNA_ACE_PREFIX) -1) != 0)
if (!memory_startswith(encoded, encoded_size, IDNA_ACE_PREFIX))
return 0;
input = stringprep_utf8_to_ucs4(encoded, encoded_size, &input_size);

View file

@ -832,8 +832,7 @@ static int output_json(
char *n;
unsigned u;
if (length >= 9 &&
memcmp(data, "_BOOT_ID=", 9) == 0)
if (memory_startswith(data, length, "_BOOT_ID="))
continue;
eq = memchr(data, '=', length);
@ -882,10 +881,8 @@ static int output_json(
size_t m;
unsigned u;
/* We already printed the boot id, from the data in
* the header, hence let's suppress it here */
if (length >= 9 &&
memcmp(data, "_BOOT_ID=", 9) == 0)
/* We already printed the boot id, from the data in the header, hence let's suppress it here */
if (memory_startswith(data, length, "_BOOT_ID="))
continue;
eq = memchr(data, '=', length);

View file

@ -406,6 +406,18 @@ static void test_strlen_ptr(void) {
assert_se(strlen_ptr(NULL) == 0);
}
static void test_memory_startswith(void) {
assert_se(streq(memory_startswith("", 0, ""), ""));
assert_se(streq(memory_startswith("", 1, ""), ""));
assert_se(streq(memory_startswith("x", 2, ""), "x"));
assert_se(!memory_startswith("", 1, "x"));
assert_se(!memory_startswith("", 1, "xxxxxxxx"));
assert_se(streq(memory_startswith("xxx", 4, "x"), "xx"));
assert_se(streq(memory_startswith("xxx", 4, "xx"), "x"));
assert_se(streq(memory_startswith("xxx", 4, "xxx"), ""));
assert_se(!memory_startswith("xxx", 4, "xxxx"));
}
int main(int argc, char *argv[]) {
test_string_erase();
test_ascii_strcasecmp_n();
@ -433,6 +445,7 @@ int main(int argc, char *argv[]) {
test_split_pair();
test_first_word();
test_strlen_ptr();
test_memory_startswith();
return 0;
}