diff --git a/configure.in b/configure.in
index 248c00dfcc0baf9e4cfcf3dde3db97c4270597c0..7981df8b17d5b38d9b8e7e1a5f03a5225aed2d11 100644
--- a/configure.in
+++ b/configure.in
@@ -153,8 +153,10 @@ AC_CHECK_SIZEOF(uint8_t)
 AC_CHECK_SIZEOF(uint16_t)
 AC_CHECK_SIZEOF(uint32_t)
 AC_CHECK_SIZEOF(uint64_t)
+AC_CHECK_SIZEOF(intptr_t)
+AC_CHECK_SIZEOF(uintptr_t)
 
-dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t])
+dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
 
 AC_CHECK_SIZEOF(char)
 AC_CHECK_SIZEOF(short)
@@ -162,6 +164,7 @@ AC_CHECK_SIZEOF(int)
 AC_CHECK_SIZEOF(long)
 AC_CHECK_SIZEOF(long long)
 AC_CHECK_SIZEOF(__int64)
+AC_CHECK_SIZEOF(void *)
 
 # Now, let's see about alignment requirements
 AC_CACHE_CHECK([whether unaligned int access is allowed], tor_cv_unaligned_ok,
diff --git a/src/common/torint.h b/src/common/torint.h
index 80ee48820df8ab163fdccb314eb385d9f8a84ed3..ce2d067ab43133e2eaa1f76d45097a6f1784aa82 100644
--- a/src/common/torint.h
+++ b/src/common/torint.h
@@ -44,6 +44,12 @@
 #if (SIZEOF_UINT64_T != 0)
 #define HAVE_UINT64_T
 #endif
+#if (SIZEOF_INTPTR_T != 0)
+#define HAVE_INTPTR_T
+#endif
+#if (SIZEOF_UINTPTR_T != 0)
+#define HAVE_UINTPTR_T
+#endif
 
 #if (SIZEOF_CHAR == 1)
 #ifndef HAVE_INT8_T
@@ -131,6 +137,23 @@ typedef unsigned __int64 uint64_t;
 #endif
 #endif
 
+#if (SIZEOF_VOID_P > 4 && SIZEOF_VOID_P <= 8)
+#ifndef HAVE_INTPTR_T
+typedef int64_t intptr_t;
+#endif
+#ifndef HAVE_UINTPTR_T
+typedef uint64_t uintptr_t;
+#endif
+#elif (SIZEOF_VOID_P > 2 && SIZEOF_VOID_P <= 4)
+#ifndef HAVE_INTPTR_T
+typedef int32_t intptr_t;
+#endif
+#ifndef HAVE_UINTPTR_T
+typedef uint32_t uintptr_t;
+#endif
+#else
+#error "void * is either >8 bytes or <= 2.  In either case, I am confused."
+#endif
 
 #ifndef HAVE_INT8_T
 #error "Missing type int8_t"