chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
309a29d
)
logind: unify how we cast between uid_t and pointers for hashmap keys
author
Lennart Poettering
<lennart@poettering.net>
Fri, 9 Jan 2015 15:25:47 +0000
(16:25 +0100)
committer
Lennart Poettering
<lennart@poettering.net>
Fri, 9 Jan 2015 17:35:36 +0000
(18:35 +0100)
src/login/logind-core.c
patch
|
blob
|
history
src/login/logind-dbus.c
patch
|
blob
|
history
src/login/logind-session.c
patch
|
blob
|
history
src/login/logind-user-dbus.c
patch
|
blob
|
history
src/login/logind-user.c
patch
|
blob
|
history
src/shared/macro.h
patch
|
blob
|
history
src/sysusers/sysusers.c
patch
|
blob
|
history
src/test/test-util.c
patch
|
blob
|
history
diff --git
a/src/login/logind-core.c
b/src/login/logind-core.c
index 88694f9bac1beec8b0d8ff8552e8243289c82624..a6ff5add95910000709460b82b779a2299e394fc 100644
(file)
--- a/
src/login/logind-core.c
+++ b/
src/login/logind-core.c
@@
-101,7
+101,7
@@
int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User **
assert(m);
assert(name);
assert(m);
assert(name);
- u = hashmap_get(m->users, U
LONG_TO_PTR((unsigned long)
uid));
+ u = hashmap_get(m->users, U
ID_TO_PTR(
uid));
if (!u) {
u = user_new(m, uid, gid, name);
if (!u)
if (!u) {
u = user_new(m, uid, gid, name);
if (!u)
diff --git
a/src/login/logind-dbus.c
b/src/login/logind-dbus.c
index 3ff6cd398f827d8f4ef5a3fe7141ad338c4cab92..bc985a3754b552e62b2247c6f57bbaa19753afb9 100644
(file)
--- a/
src/login/logind-dbus.c
+++ b/
src/login/logind-dbus.c
@@
-92,7
+92,7
@@
int manager_get_user_from_creds(Manager *m, sd_bus_message *message, uid_t uid,
return r;
}
return r;
}
- user = hashmap_get(m->users, U
LONG_TO_PTR((unsigned long)
uid));
+ user = hashmap_get(m->users, U
ID_TO_PTR(
uid));
if (!user)
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_USER, "No user "UID_FMT" known or logged in", uid);
if (!user)
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_USER, "No user "UID_FMT" known or logged in", uid);
@@
-1157,7
+1157,7
@@
static int method_set_user_linger(sd_bus *bus, sd_bus_message *message, void *us
if (r < 0 && errno != ENOENT)
return -errno;
if (r < 0 && errno != ENOENT)
return -errno;
- u = hashmap_get(m->users, U
LONG_TO_PTR((unsigned long)
uid));
+ u = hashmap_get(m->users, U
ID_TO_PTR(
uid));
if (u)
user_add_to_gc_queue(u);
}
if (u)
user_add_to_gc_queue(u);
}
diff --git
a/src/login/logind-session.c
b/src/login/logind-session.c
index ea1831dac692425dddf8299d93a90b0db73357fa..a51f9f3e0fccd2c040e6c6db9cbf32add41941ed 100644
(file)
--- a/
src/login/logind-session.c
+++ b/
src/login/logind-session.c
@@
-355,7
+355,7
@@
int session_load(Session *s) {
return r;
}
return r;
}
- user = hashmap_get(s->manager->users, U
LONG_TO_PTR((unsigned long)
u));
+ user = hashmap_get(s->manager->users, U
ID_TO_PTR(
u));
if (!user) {
log_error("User of session %s not known.", s->id);
return -ENOENT;
if (!user) {
log_error("User of session %s not known.", s->id);
return -ENOENT;
diff --git
a/src/login/logind-user-dbus.c
b/src/login/logind-user-dbus.c
index 717740ad044b24ef187088ade44fa29bc743d546..bff42e89ad39c54ea7ce8ab932ea9ddf6ac9b166 100644
(file)
--- a/
src/login/logind-user-dbus.c
+++ b/
src/login/logind-user-dbus.c
@@
-270,7
+270,7
@@
int user_object_find(sd_bus *bus, const char *path, const char *interface, void
if (r < 0)
return 0;
if (r < 0)
return 0;
- user = hashmap_get(m->users, U
LONG_TO_PTR((unsigned long)
uid));
+ user = hashmap_get(m->users, U
ID_TO_PTR(
uid));
if (!user)
return 0;
if (!user)
return 0;
diff --git
a/src/login/logind-user.c
b/src/login/logind-user.c
index 9ff1302663e0ebeaa31edafe904eb11df3ab8566..49c373b50dad738c8f5ce5829d06c2c73d90ff80 100644
(file)
--- a/
src/login/logind-user.c
+++ b/
src/login/logind-user.c
@@
-56,7
+56,7
@@
User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name) {
if (asprintf(&u->state_file, "/run/systemd/users/"UID_FMT, uid) < 0)
goto fail;
if (asprintf(&u->state_file, "/run/systemd/users/"UID_FMT, uid) < 0)
goto fail;
- if (hashmap_put(m->users, U
LONG_TO_PTR((unsigned long)
uid), u) < 0)
+ if (hashmap_put(m->users, U
ID_TO_PTR(
uid), u) < 0)
goto fail;
u->manager = m;
goto fail;
u->manager = m;
@@
-97,7
+97,7
@@
void user_free(User *u) {
free(u->runtime_path);
free(u->runtime_path);
- hashmap_remove(u->manager->users, U
LONG_TO_PTR((unsigned long)
u->uid));
+ hashmap_remove(u->manager->users, U
ID_TO_PTR(
u->uid));
free(u->name);
free(u->state_file);
free(u->name);
free(u->state_file);
diff --git
a/src/shared/macro.h
b/src/shared/macro.h
index 6a5742824479165f846e2df2f32c69d935998d9d..daa42c4c68101ce5e70fb773a7fafd5937c417e8 100644
(file)
--- a/
src/shared/macro.h
+++ b/
src/shared/macro.h
@@
-275,6
+275,14
@@
static inline unsigned long ALIGN_POWER2(unsigned long u) {
#define PTR_TO_SIZE(p) ((size_t) ((uintptr_t) (p)))
#define SIZE_TO_PTR(u) ((void *) ((uintptr_t) (u)))
#define PTR_TO_SIZE(p) ((size_t) ((uintptr_t) (p)))
#define SIZE_TO_PTR(u) ((void *) ((uintptr_t) (u)))
+/* The following macros add 1 when converting things, since UID 0 is a
+ * valid UID, while the pointer NULL is special */
+#define PTR_TO_UID(p) ((uid_t) (((uintptr_t) (p))-1))
+#define UID_TO_PTR(u) ((void*) (((uintptr_t) (u))+1))
+
+#define PTR_TO_GID(p) ((gid_t) (((uintptr_t) (p))-1))
+#define GID_TO_PTR(u) ((void*) (((uintptr_t) (u))+1))
+
#define memzero(x,l) (memset((x), 0, (l)))
#define zero(x) (memzero(&(x), sizeof(x)))
#define memzero(x,l) (memset((x), 0, (l)))
#define zero(x) (memzero(&(x), sizeof(x)))
diff --git
a/src/sysusers/sysusers.c
b/src/sysusers/sysusers.c
index 5d5f5ea79487085b4dbb2d1e02018d2f2000f764..f25ece06748c7d932240e14458510b8fb9b82969 100644
(file)
--- a/
src/sysusers/sysusers.c
+++ b/
src/sysusers/sysusers.c
@@
-81,12
+81,6
@@
static uid_t search_uid = UID_INVALID;
static UidRange *uid_range = NULL;
static unsigned n_uid_range = 0;
static UidRange *uid_range = NULL;
static unsigned n_uid_range = 0;
-#define UID_TO_PTR(u) (ULONG_TO_PTR(u+1))
-#define PTR_TO_UID(u) ((uid_t) (PTR_TO_ULONG(u)-1))
-
-#define GID_TO_PTR(g) (ULONG_TO_PTR(g+1))
-#define PTR_TO_GID(g) ((gid_t) (PTR_TO_ULONG(g)-1))
-
#define fix_root(x) (arg_root ? strappenda(arg_root, x) : x)
static int load_user_database(void) {
#define fix_root(x) (arg_root ? strappenda(arg_root, x) : x)
static int load_user_database(void) {
diff --git
a/src/test/test-util.c
b/src/test/test-util.c
index 3c79f8f4d98719282187ec26624eb1975c3fdcef..d529a213cc24fec7aa6890c4b36ec415ae578b7b 100644
(file)
--- a/
src/test/test-util.c
+++ b/
src/test/test-util.c
@@
-1415,6
+1415,15
@@
static void test_same_fd(void) {
assert_se(same_fd(b, a) == 0);
}
assert_se(same_fd(b, a) == 0);
}
+static void test_uid_ptr(void) {
+
+ assert_se(UID_TO_PTR(0) != NULL);
+ assert_se(UID_TO_PTR(1000) != NULL);
+
+ assert_se(PTR_TO_UID(UID_TO_PTR(0)) == 0);
+ assert_se(PTR_TO_UID(UID_TO_PTR(1000)) == 1000);
+}
+
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
int main(int argc, char *argv[]) {
log_parse_environment();
log_open();
@@
-1490,6
+1499,7
@@
int main(int argc, char *argv[]) {
test_parse_proc_cmdline();
test_raw_clone();
test_same_fd();
test_parse_proc_cmdline();
test_raw_clone();
test_same_fd();
+ test_uid_ptr();
return 0;
}
return 0;
}