Revert "cred: switch to using atomic_long_t"

This reverts commit be7676b03a which is
commit f8fa5d76925991976b3e7076f9d1052515ec1fca upstream.

It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way.

Bug: 161946584
Bug: 317347552
Change-Id: I9eb52866bc3b2a9f02e3f7fbee0bacbcc06b0849
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2024-01-03 16:59:38 +00:00
parent 5158e9afed
commit 3c4b111a71
2 changed files with 36 additions and 36 deletions

View File

@ -109,7 +109,7 @@ static inline int groups_search(const struct group_info *group_info, kgid_t grp)
* same context as task->real_cred. * same context as task->real_cred.
*/ */
struct cred { struct cred {
atomic_long_t usage; atomic_t usage;
#ifdef CONFIG_DEBUG_CREDENTIALS #ifdef CONFIG_DEBUG_CREDENTIALS
atomic_t subscribers; /* number of processes subscribed */ atomic_t subscribers; /* number of processes subscribed */
void *put_addr; void *put_addr;
@ -227,7 +227,7 @@ static inline bool cap_ambient_invariant_ok(const struct cred *cred)
*/ */
static inline struct cred *get_new_cred(struct cred *cred) static inline struct cred *get_new_cred(struct cred *cred)
{ {
atomic_long_inc(&cred->usage); atomic_inc(&cred->usage);
return cred; return cred;
} }
@ -259,7 +259,7 @@ static inline const struct cred *get_cred_rcu(const struct cred *cred)
struct cred *nonconst_cred = (struct cred *) cred; struct cred *nonconst_cred = (struct cred *) cred;
if (!cred) if (!cred)
return NULL; return NULL;
if (!atomic_long_inc_not_zero(&nonconst_cred->usage)) if (!atomic_inc_not_zero(&nonconst_cred->usage))
return NULL; return NULL;
validate_creds(cred); validate_creds(cred);
nonconst_cred->non_rcu = 0; nonconst_cred->non_rcu = 0;
@ -283,7 +283,7 @@ static inline void put_cred(const struct cred *_cred)
if (cred) { if (cred) {
validate_creds(cred); validate_creds(cred);
if (atomic_long_dec_and_test(&(cred)->usage)) if (atomic_dec_and_test(&(cred)->usage))
__put_cred(cred); __put_cred(cred);
} }
} }

View File

@ -98,17 +98,17 @@ static void put_cred_rcu(struct rcu_head *rcu)
#ifdef CONFIG_DEBUG_CREDENTIALS #ifdef CONFIG_DEBUG_CREDENTIALS
if (cred->magic != CRED_MAGIC_DEAD || if (cred->magic != CRED_MAGIC_DEAD ||
atomic_long_read(&cred->usage) != 0 || atomic_read(&cred->usage) != 0 ||
read_cred_subscribers(cred) != 0) read_cred_subscribers(cred) != 0)
panic("CRED: put_cred_rcu() sees %p with" panic("CRED: put_cred_rcu() sees %p with"
" mag %x, put %p, usage %ld, subscr %d\n", " mag %x, put %p, usage %d, subscr %d\n",
cred, cred->magic, cred->put_addr, cred, cred->magic, cred->put_addr,
atomic_long_read(&cred->usage), atomic_read(&cred->usage),
read_cred_subscribers(cred)); read_cred_subscribers(cred));
#else #else
if (atomic_long_read(&cred->usage) != 0) if (atomic_read(&cred->usage) != 0)
panic("CRED: put_cred_rcu() sees %p with usage %ld\n", panic("CRED: put_cred_rcu() sees %p with usage %d\n",
cred, atomic_long_read(&cred->usage)); cred, atomic_read(&cred->usage));
#endif #endif
security_cred_free(cred); security_cred_free(cred);
@ -131,11 +131,11 @@ static void put_cred_rcu(struct rcu_head *rcu)
*/ */
void __put_cred(struct cred *cred) void __put_cred(struct cred *cred)
{ {
kdebug("__put_cred(%p{%ld,%d})", cred, kdebug("__put_cred(%p{%d,%d})", cred,
atomic_long_read(&cred->usage), atomic_read(&cred->usage),
read_cred_subscribers(cred)); read_cred_subscribers(cred));
BUG_ON(atomic_long_read(&cred->usage) != 0); BUG_ON(atomic_read(&cred->usage) != 0);
#ifdef CONFIG_DEBUG_CREDENTIALS #ifdef CONFIG_DEBUG_CREDENTIALS
BUG_ON(read_cred_subscribers(cred) != 0); BUG_ON(read_cred_subscribers(cred) != 0);
cred->magic = CRED_MAGIC_DEAD; cred->magic = CRED_MAGIC_DEAD;
@ -158,8 +158,8 @@ void exit_creds(struct task_struct *tsk)
{ {
struct cred *cred; struct cred *cred;
kdebug("exit_creds(%u,%p,%p,{%ld,%d})", tsk->pid, tsk->real_cred, tsk->cred, kdebug("exit_creds(%u,%p,%p,{%d,%d})", tsk->pid, tsk->real_cred, tsk->cred,
atomic_long_read(&tsk->cred->usage), atomic_read(&tsk->cred->usage),
read_cred_subscribers(tsk->cred)); read_cred_subscribers(tsk->cred));
cred = (struct cred *) tsk->real_cred; cred = (struct cred *) tsk->real_cred;
@ -218,7 +218,7 @@ struct cred *cred_alloc_blank(void)
if (!new) if (!new)
return NULL; return NULL;
atomic_long_set(&new->usage, 1); atomic_set(&new->usage, 1);
#ifdef CONFIG_DEBUG_CREDENTIALS #ifdef CONFIG_DEBUG_CREDENTIALS
new->magic = CRED_MAGIC; new->magic = CRED_MAGIC;
#endif #endif
@ -265,7 +265,7 @@ struct cred *prepare_creds(void)
memcpy(new, old, sizeof(struct cred)); memcpy(new, old, sizeof(struct cred));
new->non_rcu = 0; new->non_rcu = 0;
atomic_long_set(&new->usage, 1); atomic_set(&new->usage, 1);
set_cred_subscribers(new, 0); set_cred_subscribers(new, 0);
get_group_info(new->group_info); get_group_info(new->group_info);
get_uid(new->user); get_uid(new->user);
@ -345,8 +345,8 @@ int copy_creds(struct task_struct *p, unsigned long clone_flags)
p->real_cred = get_cred(p->cred); p->real_cred = get_cred(p->cred);
get_cred(p->cred); get_cred(p->cred);
alter_cred_subscribers(p->cred, 2); alter_cred_subscribers(p->cred, 2);
kdebug("share_creds(%p{%ld,%d})", kdebug("share_creds(%p{%d,%d})",
p->cred, atomic_long_read(&p->cred->usage), p->cred, atomic_read(&p->cred->usage),
read_cred_subscribers(p->cred)); read_cred_subscribers(p->cred));
atomic_inc(&p->cred->user->processes); atomic_inc(&p->cred->user->processes);
return 0; return 0;
@ -436,8 +436,8 @@ int commit_creds(struct cred *new)
struct task_struct *task = current; struct task_struct *task = current;
const struct cred *old = task->real_cred; const struct cred *old = task->real_cred;
kdebug("commit_creds(%p{%ld,%d})", new, kdebug("commit_creds(%p{%d,%d})", new,
atomic_long_read(&new->usage), atomic_read(&new->usage),
read_cred_subscribers(new)); read_cred_subscribers(new));
BUG_ON(task->cred != old); BUG_ON(task->cred != old);
@ -446,7 +446,7 @@ int commit_creds(struct cred *new)
validate_creds(old); validate_creds(old);
validate_creds(new); validate_creds(new);
#endif #endif
BUG_ON(atomic_long_read(&new->usage) < 1); BUG_ON(atomic_read(&new->usage) < 1);
get_cred(new); /* we will require a ref for the subj creds too */ get_cred(new); /* we will require a ref for the subj creds too */
@ -519,14 +519,14 @@ EXPORT_SYMBOL(commit_creds);
*/ */
void abort_creds(struct cred *new) void abort_creds(struct cred *new)
{ {
kdebug("abort_creds(%p{%ld,%d})", new, kdebug("abort_creds(%p{%d,%d})", new,
atomic_long_read(&new->usage), atomic_read(&new->usage),
read_cred_subscribers(new)); read_cred_subscribers(new));
#ifdef CONFIG_DEBUG_CREDENTIALS #ifdef CONFIG_DEBUG_CREDENTIALS
BUG_ON(read_cred_subscribers(new) != 0); BUG_ON(read_cred_subscribers(new) != 0);
#endif #endif
BUG_ON(atomic_long_read(&new->usage) < 1); BUG_ON(atomic_read(&new->usage) < 1);
put_cred(new); put_cred(new);
} }
EXPORT_SYMBOL(abort_creds); EXPORT_SYMBOL(abort_creds);
@ -542,8 +542,8 @@ const struct cred *override_creds(const struct cred *new)
{ {
const struct cred *old = current->cred; const struct cred *old = current->cred;
kdebug("override_creds(%p{%ld,%d})", new, kdebug("override_creds(%p{%d,%d})", new,
atomic_long_read(&new->usage), atomic_read(&new->usage),
read_cred_subscribers(new)); read_cred_subscribers(new));
validate_creds(old); validate_creds(old);
@ -565,8 +565,8 @@ const struct cred *override_creds(const struct cred *new)
rcu_assign_pointer(current->cred, new); rcu_assign_pointer(current->cred, new);
alter_cred_subscribers(old, -1); alter_cred_subscribers(old, -1);
kdebug("override_creds() = %p{%ld,%d}", old, kdebug("override_creds() = %p{%d,%d}", old,
atomic_long_read(&old->usage), atomic_read(&old->usage),
read_cred_subscribers(old)); read_cred_subscribers(old));
return old; return old;
} }
@ -583,8 +583,8 @@ void revert_creds(const struct cred *old)
{ {
const struct cred *override = current->cred; const struct cred *override = current->cred;
kdebug("revert_creds(%p{%ld,%d})", old, kdebug("revert_creds(%p{%d,%d})", old,
atomic_long_read(&old->usage), atomic_read(&old->usage),
read_cred_subscribers(old)); read_cred_subscribers(old));
validate_creds(old); validate_creds(old);
@ -698,7 +698,7 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
*new = *old; *new = *old;
new->non_rcu = 0; new->non_rcu = 0;
atomic_long_set(&new->usage, 1); atomic_set(&new->usage, 1);
set_cred_subscribers(new, 0); set_cred_subscribers(new, 0);
get_uid(new->user); get_uid(new->user);
get_user_ns(new->user_ns); get_user_ns(new->user_ns);
@ -808,8 +808,8 @@ static void dump_invalid_creds(const struct cred *cred, const char *label,
cred == tsk->cred ? "[eff]" : ""); cred == tsk->cred ? "[eff]" : "");
printk(KERN_ERR "CRED: ->magic=%x, put_addr=%p\n", printk(KERN_ERR "CRED: ->magic=%x, put_addr=%p\n",
cred->magic, cred->put_addr); cred->magic, cred->put_addr);
printk(KERN_ERR "CRED: ->usage=%ld, subscr=%d\n", printk(KERN_ERR "CRED: ->usage=%d, subscr=%d\n",
atomic_long_read(&cred->usage), atomic_read(&cred->usage),
read_cred_subscribers(cred)); read_cred_subscribers(cred));
printk(KERN_ERR "CRED: ->*uid = { %d,%d,%d,%d }\n", printk(KERN_ERR "CRED: ->*uid = { %d,%d,%d,%d }\n",
from_kuid_munged(&init_user_ns, cred->uid), from_kuid_munged(&init_user_ns, cred->uid),
@ -881,9 +881,9 @@ EXPORT_SYMBOL(__validate_process_creds);
*/ */
void validate_creds_for_do_exit(struct task_struct *tsk) void validate_creds_for_do_exit(struct task_struct *tsk)
{ {
kdebug("validate_creds_for_do_exit(%p,%p{%ld,%d})", kdebug("validate_creds_for_do_exit(%p,%p{%d,%d})",
tsk->real_cred, tsk->cred, tsk->real_cred, tsk->cred,
atomic_long_read(&tsk->cred->usage), atomic_read(&tsk->cred->usage),
read_cred_subscribers(tsk->cred)); read_cred_subscribers(tsk->cred));
__validate_process_creds(tsk, __FILE__, __LINE__); __validate_process_creds(tsk, __FILE__, __LINE__);