mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2025-02-25 23:21:38 +01:00
Replace use of strcmp_len() with new mem_eq_token().
The strcmp_len() function was somewhat misconceived, since we're only using it to test whether a length+extent string is equal to a NUL-terminated string or not. By simplifying it and making it inlined, we should be able to make it a little faster. (It *does* show up in profiles.) Closes ticket 28856.
This commit is contained in:
parent
f8dac5c900
commit
a0fad3981e
1 changed files with 16 additions and 5 deletions
|
@ -15,6 +15,7 @@
|
|||
#include "lib/string/printf.h"
|
||||
#include "lib/memarea/memarea.h"
|
||||
#include "lib/crypt_ops/crypto_rsa.h"
|
||||
#include "lib/ctime/di_ops.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
@ -251,6 +252,16 @@ token_check_object(memarea_t *area, const char *kwd,
|
|||
return tok;
|
||||
}
|
||||
|
||||
/** Return true iff the <b>memlen</b>-byte chunk of memory at
|
||||
* <b>memlen</b> is the same length as <b>token</b>, and their
|
||||
* contents are equal. */
|
||||
static bool
|
||||
mem_eq_token(const void *mem, size_t memlen, const char *token)
|
||||
{
|
||||
size_t len = strlen(token);
|
||||
return memlen == len && fast_memeq(mem, token, len);
|
||||
}
|
||||
|
||||
/** Helper function: read the next token from *s, advance *s to the end of the
|
||||
* token, and return the parsed token. Parse *<b>s</b> according to the list
|
||||
* of tokens in <b>table</b>.
|
||||
|
@ -290,7 +301,7 @@ get_next_token(memarea_t *area,
|
|||
|
||||
next = find_whitespace_eos(*s, eol);
|
||||
|
||||
if (!strcmp_len(*s, "opt", next-*s)) {
|
||||
if (mem_eq_token(*s, next-*s, "opt")) {
|
||||
/* Skip past an "opt" at the start of the line. */
|
||||
*s = eat_whitespace_eos_no_nl(next, eol);
|
||||
next = find_whitespace_eos(*s, eol);
|
||||
|
@ -301,7 +312,7 @@ get_next_token(memarea_t *area,
|
|||
/* Search the table for the appropriate entry. (I tried a binary search
|
||||
* instead, but it wasn't any faster.) */
|
||||
for (i = 0; table[i].t ; ++i) {
|
||||
if (!strcmp_len(*s, table[i].t, next-*s)) {
|
||||
if (mem_eq_token(*s, next-*s, table[i].t)) {
|
||||
/* We've found the keyword. */
|
||||
kwd = table[i].t;
|
||||
tok->tp = table[i].v;
|
||||
|
@ -354,7 +365,7 @@ get_next_token(memarea_t *area,
|
|||
|
||||
obstart = *s; /* Set obstart to start of object spec */
|
||||
if (eol - *s <= 16 || memchr(*s+11,'\0',eol-*s-16) || /* no short lines, */
|
||||
strcmp_len(eol-5, "-----", 5) || /* nuls or invalid endings */
|
||||
!mem_eq_token(eol-5, 5, "-----") || /* nuls or invalid endings */
|
||||
(eol-*s) > MAX_UNPARSED_OBJECT_SIZE) { /* name too long */
|
||||
RET_ERR("Malformed object: bad begin line");
|
||||
}
|
||||
|
@ -373,8 +384,8 @@ get_next_token(memarea_t *area,
|
|||
eol = eos;
|
||||
/* Validate the ending tag, which should be 9 + NAME + 5 + eol */
|
||||
if ((size_t)(eol-next) != 9+obname_len+5 ||
|
||||
strcmp_len(next+9, tok->object_type, obname_len) ||
|
||||
strcmp_len(eol-5, "-----", 5)) {
|
||||
!mem_eq_token(next+9, obname_len, tok->object_type) ||
|
||||
!mem_eq_token(eol-5, 5, "-----")) {
|
||||
tor_snprintf(ebuf, sizeof(ebuf), "Malformed object: mismatched end tag %s",
|
||||
tok->object_type);
|
||||
ebuf[sizeof(ebuf)-1] = '\0';
|
||||
|
|
Loading…
Add table
Reference in a new issue