aboutsummaryrefslogtreecommitdiff
path: root/src/lib/string
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2018-07-02 11:50:17 -0400
committerNick Mathewson <nickm@torproject.org>2018-07-02 11:50:17 -0400
commitc8ccd028a78d154c3b82138f7827aec0e2de13dd (patch)
tree6cc5d2cbf3672b82db8e01029351a4ef9ddf9c34 /src/lib/string
parentcb1a3674ebb3826d9e1e56146210bd79cb4a42f0 (diff)
downloadtor-c8ccd028a78d154c3b82138f7827aec0e2de13dd.tar.gz
tor-c8ccd028a78d154c3b82138f7827aec0e2de13dd.zip
Don't redefine str(n)casecmp on windows unless they're missing
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.
Diffstat (limited to 'src/lib/string')
-rw-r--r--src/lib/string/compat_string.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/lib/string/compat_string.h b/src/lib/string/compat_string.h
index 24cd0f8b11..0a4ce01755 100644
--- a/src/lib/string/compat_string.h
+++ b/src/lib/string/compat_string.h
@@ -13,9 +13,20 @@
/* ===== String compatibility */
#ifdef _WIN32
-/* Windows names string functions differently from most other platforms. */
-#define strncasecmp _strnicmp
-#define strcasecmp _stricmp
+/* 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__