nss-pam-ldapd/nss-pam-ldapd-0.7.x-uid-overflow.patch

85 lines
2.5 KiB
Diff

diff -up ./nslcd/common.c.overflow ./nslcd/common.c
--- ./nslcd/common.c.overflow 2012-04-28 21:23:54.000000000 +0200
+++ ./nslcd/common.c 2012-04-28 21:38:03.263642985 +0200
@@ -148,19 +148,25 @@ int read_address(TFILE *fp,char *addr,in
return 0;
}
-#ifdef WANT_STRTOUI
+
/* provide a strtoui() implementation, similar to strtoul() but returning
an range-checked unsigned int instead */
-unsigned int strtoui(const char *nptr,char **endptr,int base)
+uint32_t strtoid(const char *nptr,char **endptr,int base)
{
- unsigned long val;
- val=strtoul(nptr,endptr,base);
- if (val>UINT_MAX)
+ long long val;
+
+ val=strtoll(nptr,endptr,base);
+ if (val>UINT32_MAX)
{
errno=ERANGE;
- return UINT_MAX;
+ return UINT32_MAX;
}
- /* If errno was set by strtoull, we'll pass it back as-is */
- return (unsigned int)val;
+ else if (val<0)
+ {
+ errno=EINVAL;
+ return UINT32_MAX;
+ }
+
+ /* If errno was set, we'll pass it back as-is */
+ return (uint32_t) val;
}
-#endif /* WANT_STRTOUI */
diff -up ./nslcd/common.h.overflow ./nslcd/common.h
--- ./nslcd/common.h.overflow 2012-04-28 21:39:08.670229101 +0200
+++ ./nslcd/common.h 2012-04-28 21:40:24.234750320 +0200
@@ -25,6 +25,7 @@
#define NSLCD__COMMON_H 1
#include <errno.h>
+#include <stdint.h>
#include "nslcd.h"
#include "common/nslcd-prot.h"
@@ -94,31 +95,9 @@ MYLDAP_ENTRY *uid2entry(MYLDAP_SESSION *
/* transforms the uid into a DN by doing an LDAP lookup */
MUST_USE char *uid2dn(MYLDAP_SESSION *session,const char *uid,char *buf,size_t buflen);
-/* provide strtouid() function alias */
-#if SIZEOF_UID_T == SIZEOF_UNSIGNED_LONG_INT
-#define strtouid (uid_t)strtoul
-#elif SIZEOF_UID_T == SIZEOF_UNSIGNED_LONG_LONG_INT
-#define strtouid (uid_t)strtoull
-#elif SIZEOF_UID_T == SIZEOF_UNSIGNED_INT
-#define WANT_STRTOUI 1
-#define strtouid (uid_t)strtoui
-#else
-#error unable to find implementation for strtouid()
-#endif
-
-/* provide strtouid() function alias */
-#if SIZEOF_GID_T == SIZEOF_UNSIGNED_LONG_INT
-#define strtogid (gid_t)strtoul
-#elif SIZEOF_GID_T == SIZEOF_UNSIGNED_LONG_LONG_INT
-#define strtogid (gid_t)strtoull
-#elif SIZEOF_GID_T == SIZEOF_UNSIGNED_INT
-#ifndef WANT_STRTOUI
-#define WANT_STRTOUI 1
-#endif
-#define strtogid (uid_t)strtoui
-#else
-#error unable to find implementation for strtogid()
-#endif
+uint32_t strtoid(const char *nptr,char **endptr,int base);
+#define strtouid (uid_t)strtoid
+#define strtogid (uid_t)strtoid
#ifdef WANT_STRTOUI
/* provide a strtoui() if it is needed */