Re: [RFC/PATCH] ignore memcmp() overreading in bsearch() callback
- From
René Scharfe <rene.scharfe@lsrfire.ath.cx>
- Date
- Jan 16, 2013, 01:08 UTC
- Message-ID
- <50F5FD80.1000808@lsrfire.ath.cx>
- In-Reply-To
- <m2libunqdj.fsf@igel.home>
Am 15.01.2013 21:27, schrieb Andreas Schwab:
Show 6 quoted lines
> René Scharfe <rene.scharfe@lsrfire.ath.cx> writes: > >> + return '\0' - ent->name[key->len]; > > You need to cast to unsigned char first to make it consistent with > memcmp and strcmp.
Thanks for catching this!
-- >8 -- Subject: [PATCH] refs: use strncmp() instead of strlen() and memcmp()
Simplify ref_entry_cmp_sslice() by using strncmp() to compare the length-limited key and a NUL-terminated entry. While we're at it, retain the const attribute of the input pointers.
Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> --- refs.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/refs.c b/refs.c index 541fec2..5129da0 100644 --- a/refs.c +++ b/refs.c @@ -333,14 +333,12 @@ struct string_slice { static int ref_entry_cmp_sslice(const void *key_, const void *ent_) { - struct string_slice *key = (struct string_slice *)key_; - struct ref_entry *ent = *(struct ref_entry **)ent_; - int entlen = strlen(ent->name); - int cmplen = key->len < entlen ? key->len : entlen; - int cmp = memcmp(key->str, ent->name, cmplen); + const struct string_slice *key = key_; + const struct ref_entry *ent = *(const struct ref_entry * const *)ent_; + int cmp = strncmp(key->str, ent->name, key->len); if (cmp) return cmp; - return key->len - entlen; + return '\0' - (unsigned char)ent->name[key->len]; } /*
-- 1.8.0