Jakub Hrozek ce40dd2
From ae0a9312c562985838fdd9845ef95fe61e8aa3de Mon Sep 17 00:00:00 2001
Jakub Hrozek ce40dd2
From: Jakub Hrozek <jakub.hrozek@posteo.se>
Jakub Hrozek ce40dd2
Date: Sun, 1 Apr 2018 10:57:22 +0200
Jakub Hrozek ce40dd2
Subject: [PATCH 2/2] Watch for uint32_t overflows
Jakub Hrozek ce40dd2
9352022
Always use a function that we know will catch out-of-range values for UIDs and
9352022
GIDs, which are currently unsigned 32-bit numbers everywhere, and which won't
9352022
produce a result that'll silently be truncated if we store the result in a
9352022
uid_t or gid_t.
Jakub Hrozek ce40dd2
---
Jakub Hrozek ce40dd2
 nslcd/common.c | 28 ++++++++++++++++------------
Jakub Hrozek ce40dd2
 nslcd/common.h | 27 +++------------------------
Jakub Hrozek ce40dd2
 2 files changed, 19 insertions(+), 36 deletions(-)
Jakub Hrozek ce40dd2
Jakub Hrozek ce40dd2
diff --git a/nslcd/common.c b/nslcd/common.c
Jakub Hrozek ce40dd2
index 60be7773d2c809f3177744ced0dd0ba90c86e820..de640b47806757e0bb2e704b3b79f1ecb18bbc45 100644
Jakub Hrozek ce40dd2
--- a/nslcd/common.c
Jakub Hrozek ce40dd2
+++ b/nslcd/common.c
Jakub Hrozek ce40dd2
@@ -338,19 +338,23 @@ unsigned long int binsid2id(const char *binsid)
Jakub Hrozek ce40dd2
          ((((unsigned long int)binsid[i + 3]) & 0xff) << 24);
f92f860
 }
1e1125a
 
1e1125a
-#ifdef WANT_STRTOUI
9352022
-/* provide a strtoui() implementation, similar to strtoul() but returning
Jakub Hrozek ce40dd2
-   an range-checked unsigned int instead */
Jakub Hrozek ce40dd2
-unsigned int strtoui(const char *nptr, char **endptr, int base)
9352022
+/* provide a strtoid() implementation, similar to strtoul() but returning
Jakub Hrozek ce40dd2
+   an range-checked uint32_t instead */
9352022
+unsigned int strtoid(const char *nptr,char **endptr,int base)
1e1125a
 {
1e1125a
-  unsigned long val;
Jakub Hrozek ce40dd2
-  val = strtoul(nptr, endptr, base);
Jakub Hrozek ce40dd2
-  if (val > UINT_MAX)
f92f860
+  long long val;
9352022
+  /* use the fact that long long is 64-bit, even on 32-bit systems */
f92f860
+  val=strtoll(nptr,endptr,base);
f92f860
+  if (val>UINT32_MAX)
1e1125a
   {
Jakub Hrozek ce40dd2
-    errno = ERANGE;
1e1125a
-    return UINT_MAX;
Jakub Hrozek ce40dd2
+    errno=ERANGE;
f92f860
+    return UINT32_MAX;
1e1125a
   }
9352022
-  /* If errno was set by strtoul, we'll pass it back as-is */
1e1125a
-  return (unsigned int)val;
9352022
+  else if (val < 0)
f92f860
+  {
f92f860
+    errno=EINVAL;
f92f860
+    return UINT32_MAX;
f92f860
+  }
f92f860
+  /* If errno was set, we'll pass it back as-is */
9352022
+  return (uint32_t)val;
1e1125a
 }
1e1125a
-#endif /* WANT_STRTOUI */
Jakub Hrozek ce40dd2
diff --git a/nslcd/common.h b/nslcd/common.h
Jakub Hrozek ce40dd2
index 26fcf48ae2a6dc50bc97fab238ecc9a1879342ce..97d386eaf1f6881182729c5d8e46ce30d2d28eba 100644
Jakub Hrozek ce40dd2
--- a/nslcd/common.h
Jakub Hrozek ce40dd2
+++ b/nslcd/common.h
Jakub Hrozek ce40dd2
@@ -161,31 +161,10 @@ void invalidator_do(enum ldap_map_selector map);
Jakub Hrozek ce40dd2
 #define BUFLEN_HOSTNAME     256  /* host names or FQDN (and safe version) */
Jakub Hrozek ce40dd2
 #define BUFLEN_MESSAGE     1024  /* message strings */
f92f860
 
1e1125a
-/* provide strtouid() function alias */
1e1125a
-#if SIZEOF_UID_T == SIZEOF_UNSIGNED_LONG_INT
1e1125a
-#define strtouid (uid_t)strtoul
1e1125a
-#elif SIZEOF_UID_T == SIZEOF_UNSIGNED_LONG_LONG_INT
1e1125a
-#define strtouid (uid_t)strtoull
1e1125a
-#elif SIZEOF_UID_T == SIZEOF_UNSIGNED_INT
1e1125a
-#define WANT_STRTOUI 1
1e1125a
-#define strtouid (uid_t)strtoui
1e1125a
-#else
1e1125a
-#error unable to find implementation for strtouid()
1e1125a
-#endif
Jakub Hrozek ce40dd2
 
Jakub Hrozek ce40dd2
-/* provide strtogid() function alias */
1e1125a
-#if SIZEOF_GID_T == SIZEOF_UNSIGNED_LONG_INT
1e1125a
-#define strtogid (gid_t)strtoul
1e1125a
-#elif SIZEOF_GID_T == SIZEOF_UNSIGNED_LONG_LONG_INT
1e1125a
-#define strtogid (gid_t)strtoull
1e1125a
-#elif SIZEOF_GID_T == SIZEOF_UNSIGNED_INT
1e1125a
-#ifndef WANT_STRTOUI
1e1125a
-#define WANT_STRTOUI 1
1e1125a
-#endif
Jakub Hrozek ce40dd2
-#define strtogid (gid_t)strtoui
1e1125a
-#else
1e1125a
-#error unable to find implementation for strtogid()
1e1125a
-#endif
1e1125a
+uint32_t strtoid(const char *nptr,char **endptr,int base);
f92f860
+#define strtouid (uid_t)strtoid
9352022
+#define strtogid (gid_t)strtoid
1e1125a
 
1e1125a
 #ifdef WANT_STRTOUI
1e1125a
 /* provide a strtoui() if it is needed */
Jakub Hrozek ce40dd2
-- 
Jakub Hrozek ce40dd2
2.14.3
Jakub Hrozek ce40dd2