summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2010-10-25 14:57:35 +0200
committerStephen Gallagher <sgallagh@redhat.com>2010-10-26 08:01:43 -0400
commit4228c4d88c1be62542a532dbd295317dbb9f6ce3 (patch)
treef08bdebd330888cb2096d46d37f2d3806c92c6fa
parent59216d82123688ae360757bf8c5eb77236555416 (diff)
downloadsssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.tar.gz
sssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.tar.xz
sssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.zip
Always use uint32_t for UID/GID numbers
-rw-r--r--src/Makefile.am1
-rw-r--r--src/db/sysdb.c15
-rw-r--r--src/db/sysdb.h4
-rw-r--r--src/providers/ldap/ldap_id.c11
-rw-r--r--src/providers/ldap/sdap_async_accounts.c43
-rw-r--r--src/providers/proxy/proxy.c7
-rw-r--r--src/tests/strtonum-tests.c20
-rw-r--r--src/util/find_uid.c5
-rw-r--r--src/util/strtonum.c2
9 files changed, 45 insertions, 63 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 1554ebb3..5d77a128 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -634,6 +634,7 @@ ipa_timerules_tests_LDADD = \
find_uid_tests_SOURCES = \
tests/find_uid-tests.c \
+ util/strtonum.c \
util/find_uid.c \
$(SSSD_DEBUG_OBJ)
find_uid_tests_CFLAGS = \
diff --git a/src/db/sysdb.c b/src/db/sysdb.c
index 416efbaa..6488c225 100644
--- a/src/db/sysdb.c
+++ b/src/db/sysdb.c
@@ -20,6 +20,7 @@
*/
#include "util/util.h"
+#include "util/strtonum.h"
#include "db/sysdb_private.h"
#include "confdb/confdb.h"
#include <time.h>
@@ -170,13 +171,13 @@ int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name,
return EOK;
}
-int sysdb_attrs_get_ulong(struct sysdb_attrs *attrs, const char *name,
- unsigned long *value)
+int sysdb_attrs_get_uint32_t(struct sysdb_attrs *attrs, const char *name,
+ uint32_t *value)
{
struct ldb_message_element *el;
int ret;
char *endptr;
- unsigned long val;
+ uint32_t val;
ret = sysdb_attrs_get_el_int(attrs, name, false, &el);
if (ret) {
@@ -187,11 +188,9 @@ int sysdb_attrs_get_ulong(struct sysdb_attrs *attrs, const char *name,
return ERANGE;
}
- errno = 0;
- val = strtoul((const char *) el->values[0].data, &endptr, 0);
- if (errno || *endptr) {
- return EINVAL;
- }
+ val = strtouint32((const char *) el->values[0].data, &endptr, 0);
+ if (errno != 0) return errno;
+ if (*endptr) return EINVAL;
*value = val;
return EOK;
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index 1b9edd0f..9a3bcd1a 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -178,8 +178,8 @@ int sysdb_attrs_get_string(struct sysdb_attrs *attrs, const char *name,
const char **string);
int sysdb_attrs_get_string_array(struct sysdb_attrs *attrs, const char *name,
TALLOC_CTX *mem_ctx, const char ***string);
-int sysdb_attrs_get_ulong(struct sysdb_attrs *attrs, const char *name,
- unsigned long *value);
+int sysdb_attrs_get_uint32_t(struct sysdb_attrs *attrs, const char *name,
+ uint32_t *value);
int sysdb_attrs_replace_name(struct sysdb_attrs *attrs, const char *oldname,
const char *newname);
diff --git a/src/providers/ldap/ldap_id.c b/src/providers/ldap/ldap_id.c
index 5a9f5755..5cf593db 100644
--- a/src/providers/ldap/ldap_id.c
+++ b/src/providers/ldap/ldap_id.c
@@ -27,6 +27,7 @@
#include <sys/time.h>
#include "util/util.h"
+#include "util/strtonum.h"
#include "db/sysdb.h"
#include "providers/ldap/ldap_common.h"
#include "providers/ldap/sdap_async.h"
@@ -200,10 +201,9 @@ static void users_get_done(struct tevent_req *subreq)
return;
case BE_FILTER_IDNUM:
- errno = 0;
- uid = (uid_t) strtoul(state->name, &endptr, 0);
+ uid = (uid_t) strtouint32(state->name, &endptr, 0);
if (errno || *endptr || (state->name == endptr)) {
- tevent_req_error(req, errno);
+ tevent_req_error(req, errno ? errno : EINVAL);
return;
}
@@ -421,10 +421,9 @@ static void groups_get_done(struct tevent_req *subreq)
return;
case BE_FILTER_IDNUM:
- errno = 0;
- gid = (gid_t) strtoul(state->name, &endptr, 0);
+ gid = (gid_t) strtouint32(state->name, &endptr, 0);
if (errno || *endptr || (state->name == endptr)) {
- tevent_req_error(req, errno);
+ tevent_req_error(req, errno ? errno : EINVAL);
return;
}
diff --git a/src/providers/ldap/sdap_async_accounts.c b/src/providers/ldap/sdap_async_accounts.c
index 0244d93e..9a950d73 100644
--- a/src/providers/ldap/sdap_async_accounts.c
+++ b/src/providers/ldap/sdap_async_accounts.c
@@ -57,7 +57,6 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
const char *gecos;
const char *homedir;
const char *shell;
- unsigned long l;
uid_t uid;
gid_t gid;
struct sysdb_attrs *user_attrs;
@@ -111,16 +110,15 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
if (el->num_values == 0) shell = NULL;
else shell = (const char *)el->values[0].data;
- ret = sysdb_attrs_get_ulong(attrs,
- opts->user_map[SDAP_AT_USER_UID].sys_name,
- &l);
+ ret = sysdb_attrs_get_uint32_t(attrs,
+ opts->user_map[SDAP_AT_USER_UID].sys_name,
+ &uid);
if (ret != EOK) {
DEBUG(1, ("no uid provided for [%s] in domain [%s].\n",
state->name, dom->name));
ret = EINVAL;
goto fail;
}
- uid = l;
/* check that the uid is valid for this domain */
if (OUT_OF_ID_RANGE(uid, dom->id_min, dom->id_max)) {
@@ -130,16 +128,15 @@ static struct tevent_req *sdap_save_user_send(TALLOC_CTX *memctx,
goto fail;
}
- ret = sysdb_attrs_get_ulong(attrs,
- opts->user_map[SDAP_AT_USER_GID].sys_name,
- &l);
+ ret = sysdb_attrs_get_uint32_t(attrs,
+ opts->user_map[SDAP_AT_USER_GID].sys_name,
+ &gid);
if (ret != EOK) {
DEBUG(1, ("no gid provided for [%s] in domain [%s].\n",
state->name, dom->name));
ret = EINVAL;
goto fail;
}
- gid = l;
/* check that the gid is valid for this domain */
if (OUT_OF_ID_RANGE(gid, dom->id_min, dom->id_max)) {
@@ -818,7 +815,6 @@ static struct tevent_req *sdap_save_group_send(TALLOC_CTX *memctx,
struct sdap_save_group_state *state;
struct ldb_message_element *el;
struct sysdb_attrs *group_attrs;
- unsigned long l;
gid_t gid;
int ret;
@@ -840,16 +836,15 @@ static struct tevent_req *sdap_save_group_send(TALLOC_CTX *memctx,
}
state->name = (const char *)el->values[0].data;
- ret = sysdb_attrs_get_ulong(attrs,
- opts->group_map[SDAP_AT_GROUP_GID].sys_name,
- &l);
+ ret = sysdb_attrs_get_uint32_t(attrs,
+ opts->group_map[SDAP_AT_GROUP_GID].sys_name,
+ &gid);
if (ret != EOK) {
DEBUG(1, ("no gid provided for [%s] in domain [%s].\n",
state->name, dom->name));
ret = EINVAL;
goto fail;
}
- gid = l;
/* check that the gid is valid for this domain */
if (OUT_OF_ID_RANGE(gid, dom->id_min, dom->id_max)) {
@@ -2359,26 +2354,14 @@ static void sdap_add_incomplete_groups_next(struct tevent_req *subreq)
name = (const char *)el->values[0].data;
if (strcmp(name, state->groupnames[state->cur]) == 0) {
- ret = sysdb_attrs_get_el(state->ldap_groups[ai],
- SYSDB_GIDNUM,
- &el);
+ ret = sysdb_attrs_get_uint32_t(state->ldap_groups[ai],
+ SYSDB_GIDNUM,
+ &gid);
if (ret) {
+ DEBUG(1, ("no gid provided for [%s]\n", name));
tevent_req_error(req, ret);
return;
}
- if (el->num_values == 0) {
- DEBUG(1, ("no gid provided for [%s]\n",
- name));
- tevent_req_error(req, EINVAL);
- return;
- }
-
- errno = 0;
- gid = (gid_t) strtol((const char *)el->values[0].data, NULL, 0);
- if (errno) {
- tevent_req_error(req, errno);
- return;
- }
add_req = sysdb_add_incomplete_group_send(state,
state->ev,
diff --git a/src/providers/proxy/proxy.c b/src/providers/proxy/proxy.c
index 144ab45f..b501b584 100644
--- a/src/providers/proxy/proxy.c
+++ b/src/providers/proxy/proxy.c
@@ -31,6 +31,7 @@
#include <security/pam_modules.h>
#include "util/util.h"
+#include "util/strtonum.h"
#include "providers/dp_backend.h"
#include "db/sysdb.h"
#include "proxy.h"
@@ -2822,8 +2823,7 @@ static void proxy_get_account_info(struct be_req *breq)
EINVAL, "Invalid attr type");
} else {
char *endptr;
- errno = 0;
- uid = (uid_t) strtoul(ar->filter_value, &endptr, 0);
+ uid = (uid_t) strtouint32(ar->filter_value, &endptr, 0);
if (errno || *endptr || (ar->filter_value == endptr)) {
return proxy_reply(breq, DP_ERR_FATAL,
EINVAL, "Invalid attr type");
@@ -2877,8 +2877,7 @@ static void proxy_get_account_info(struct be_req *breq)
EINVAL, "Invalid attr type");
} else {
char *endptr;
- errno = 0;
- gid = (gid_t) strtoul(ar->filter_value, &endptr, 0);
+ gid = (gid_t) strtouint32(ar->filter_value, &endptr, 0);
if (errno || *endptr || (ar->filter_value == endptr)) {
return proxy_reply(breq, DP_ERR_FATAL,
EINVAL, "Invalid attr type");
diff --git a/src/tests/strtonum-tests.c b/src/tests/strtonum-tests.c
index a7131c1b..f8e0f394 100644
--- a/src/tests/strtonum-tests.c
+++ b/src/tests/strtonum-tests.c
@@ -38,15 +38,15 @@
#define CHECK_RESULT(expected, actual) \
do { \
- fail_unless(result == expected, "Expected %ld, got %ld", \
- expected, result); \
+ fail_unless(actual == expected, "Expected %ld, got %ld", \
+ expected, actual); \
} while(0)
#define CHECK_ERRNO(expected, actual) \
do { \
- fail_unless(error == ERANGE, "Expected errno %d[%s], got %d[%s]", \
- ERANGE, strerror(ERANGE), \
- error, strerror(ERANGE)); \
+ fail_unless(actual == expected, "Expected errno %d[%s], got %d[%s]", \
+ expected, strerror(expected), \
+ actual, strerror(actual)); \
} while(0)
#define CHECK_ENDPTR(expected, actual) \
@@ -146,7 +146,7 @@ START_TEST (test_strtoint32_pos_integer_overflow_base_10)
CHECK_ERRNO(ERANGE, error);
CHECK_ZERO_ENDPTR(endptr);
- CHECK_RESULT(expected, actual);
+ CHECK_RESULT(expected, result);
}
END_TEST
@@ -163,7 +163,7 @@ START_TEST (test_strtoint32_pos_integer_underflow_base_10)
CHECK_ERRNO(ERANGE, error);
CHECK_ZERO_ENDPTR(endptr);
- CHECK_RESULT(expected, actual);
+ CHECK_RESULT(expected, result);
}
END_TEST
@@ -265,14 +265,14 @@ START_TEST (test_strtouint32_neg_integer_base_10)
{
uint32_t result;
const char *input = "-123";
- uint32_t expected = -123;
+ uint32_t expected = UINT32_MAX;
char *endptr;
errno_t error;
result = strtouint32(input, &endptr, 10);
error = errno;
- EXPECT_UNSET_ERRNO(error);
+ CHECK_ERRNO(ERANGE, error);
CHECK_ZERO_ENDPTR(endptr);
CHECK_RESULT(expected, result);
}
@@ -309,7 +309,7 @@ START_TEST (test_strtouint32_pos_integer_overflow_base_10)
CHECK_ERRNO(ERANGE, error);
CHECK_ZERO_ENDPTR(endptr);
- CHECK_RESULT(expected, actual);
+ CHECK_RESULT(expected, result);
}
END_TEST
diff --git a/src/util/find_uid.c b/src/util/find_uid.c
index bd62b123..e18de7a4 100644
--- a/src/util/find_uid.c
+++ b/src/util/find_uid.c
@@ -38,6 +38,7 @@
#include "dhash.h"
#include "util/util.h"
+#include "util/strtonum.h"
#define INITIAL_TABLE_SIZE 64
#define PATHLEN (NAME_MAX + 14)
@@ -63,7 +64,7 @@ static errno_t get_uid_from_pid(const pid_t pid, uid_t *uid)
char *p;
char *e;
char *endptr;
- long num=0;
+ uint32_t num=0;
errno_t error;
ret = snprintf(path, PATHLEN, "/proc/%d/status", pid);
@@ -132,7 +133,7 @@ static errno_t get_uid_from_pid(const pid_t pid, uid_t *uid)
*e = '\0';
}
errno = 0;
- num = strtoul(p, &endptr, 10);
+ num = strtouint32(p, &endptr, 10);
error = errno;
if (error != 0) {
DEBUG(1, ("strtoul failed [%s].\n", strerror(error)));
diff --git a/src/util/strtonum.c b/src/util/strtonum.c
index 744e0f71..bf1b21a6 100644
--- a/src/util/strtonum.c
+++ b/src/util/strtonum.c
@@ -51,7 +51,7 @@ int32_t strtoint32(const char *nptr, char **endptr, int base)
/* strtouint32 */
uint32_t strtouint32(const char *nptr, char **endptr, int base)
{
- long long ret = 0;
+ unsigned long long ret = 0;
errno = 0;
ret = strtoull(nptr, endptr, base);