diff options
author | Jakub Hrozek <jhrozek@redhat.com> | 2010-10-25 14:57:35 +0200 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2010-10-26 08:01:43 -0400 |
commit | 4228c4d88c1be62542a532dbd295317dbb9f6ce3 (patch) | |
tree | f08bdebd330888cb2096d46d37f2d3806c92c6fa | |
parent | 59216d82123688ae360757bf8c5eb77236555416 (diff) | |
download | sssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.tar.gz sssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.tar.xz sssd2-4228c4d88c1be62542a532dbd295317dbb9f6ce3.zip |
Always use uint32_t for UID/GID numbers
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/db/sysdb.c | 15 | ||||
-rw-r--r-- | src/db/sysdb.h | 4 | ||||
-rw-r--r-- | src/providers/ldap/ldap_id.c | 11 | ||||
-rw-r--r-- | src/providers/ldap/sdap_async_accounts.c | 43 | ||||
-rw-r--r-- | src/providers/proxy/proxy.c | 7 | ||||
-rw-r--r-- | src/tests/strtonum-tests.c | 20 | ||||
-rw-r--r-- | src/util/find_uid.c | 5 | ||||
-rw-r--r-- | src/util/strtonum.c | 2 |
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); |