mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
c8ccd028a7
When we do redefine them, use inline functions instead of #define.
This fixes a latent code problem in our redefinition of these
functions, which was exposed by our refactoring: Previously, we
would #define strcasecmp after string.h was included, so nothing bad
would happen. But when we refactored, we would sometimes #define it
first, which was a problem on mingw, whose headers contain
(approximately):
inline int strcasecmp (const char *a, const char *b)
{ return _stricmp(a,b); }
Our define turned this into:
inline int _stricmp(const char *a, const char *b)
{ return _stricmp(a,b); }
And GCC would correctly infer that this function would loop forever,
rather than actually comparing anything. This caused bug 26594.
Fixes bug 26594; bug not in any released version of Tor.
58 lines
1.7 KiB
C
58 lines
1.7 KiB
C
/* Copyright (c) 2003-2004, Roger Dingledine
|
|
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
|
* Copyright (c) 2007-2018, The Tor Project, Inc. */
|
|
/* See LICENSE for licensing information */
|
|
|
|
#ifndef TOR_COMPAT_STRING_H
|
|
#define TOR_COMPAT_STRING_H
|
|
|
|
#include "orconfig.h"
|
|
#include "lib/cc/compat_compiler.h"
|
|
|
|
#include <stddef.h>
|
|
|
|
/* ===== String compatibility */
|
|
#ifdef _WIN32
|
|
/* Windows doesn't have str(n)casecmp, but mingw defines it: only define it
|
|
* ourselves if it's missing. */
|
|
#ifndef HAVE_STRNCASECMP
|
|
static inline int strncasecmp(const char *a, const char *b, size_t n);
|
|
static inline int strncasecmp(const char *a, const char *b, size_t n) {
|
|
return strncmpi(a,b);
|
|
}
|
|
#endif
|
|
#ifndef HAVE_STRCASECMP
|
|
static inline int strcasecmp(const char *a, const char *b, size_t n);
|
|
static inline int strcasecmp(const char *a, const char *b, size_t n) {
|
|
return strcmpi(a,b);
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
#if defined __APPLE__
|
|
/* On OSX 10.9 and later, the overlap-checking code for strlcat would
|
|
* appear to have a severe bug that can sometimes cause aborts in Tor.
|
|
* Instead, use the non-checking variants. This is sad.
|
|
*
|
|
* See https://trac.torproject.org/projects/tor/ticket/15205
|
|
*/
|
|
#undef strlcat
|
|
#undef strlcpy
|
|
#endif /* defined __APPLE__ */
|
|
|
|
#ifndef HAVE_STRLCAT
|
|
size_t strlcat(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
|
|
#endif
|
|
#ifndef HAVE_STRLCPY
|
|
size_t strlcpy(char *dst, const char *src, size_t siz) ATTR_NONNULL((1,2));
|
|
#endif
|
|
|
|
char *tor_strtok_r_impl(char *str, const char *sep, char **lasts);
|
|
#ifdef HAVE_STRTOK_R
|
|
#define tor_strtok_r(str, sep, lasts) strtok_r(str, sep, lasts)
|
|
#else
|
|
#define tor_strtok_r(str, sep, lasts) tor_strtok_r_impl(str, sep, lasts)
|
|
#endif
|
|
|
|
#endif
|