Skip to content

Commit eb5cde4

Browse files
committed
852* driver/dtrace_linux.c, driver/dtrace_linux.h, driver/prov_proc.c:
Additional uid_t/kuid_t fixes.
1 parent 23b72c9 commit eb5cde4

9 files changed

Lines changed: 58 additions & 34 deletions

File tree

.release

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
date=Sun Nov 3 14:36:08 GMT 2013
2-
release=dtrace-20131103
3-
build=465
1+
date=Fri Jan 3 16:24:05 GMT 2014
2+
release=dtrace-20140103
3+
build=466

Changes

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
1+
Fri Jan 3 16:11:59 2014 fox
2+
3+
852* driver/dtrace_linux.c, driver/dtrace_linux.h, driver/prov_proc.c:
4+
Additional uid_t/kuid_t fixes.
5+
6+
851* driver/ctl.c, driver/dtrace.c, driver/dtrace_linux.h:
7+
More fixes for uid_t/kuid_t.
8+
9+
850* driver/ctl.c: Fix for 3.8.0 kernel kuid_t
10+
111
Sun Nov 3 14:34:37 2013 fox
212

13+
849* Archive: 1.0152
14+
315
848* tools/readelf.pl: New/experimental script
416

517
847* driver/Makefile: Use -gdwarf-2 debug info so we work on

README

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Linux port of DTrace
22

3-
Oct 2013
3+
Jan 2014
44
Paul D. Fox
55
paul.d.fox@gmail.com
66
http://www.twitter.com/crispeditor

archive.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
NAME=dtrace
22
MAJ_VERSION=1
3-
MIN_VERSION=0151
3+
MIN_VERSION=0152
44
EXCLUDE="*.ko *.o .git"
55
EXCLUDE_DIRS="build-"
6-
#date Sun Oct 20 10:48:42 BST 2013
6+
#date Sun Nov 3 14:36:27 GMT 2013

driver/ctl.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ ctl_linux_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsign
240240
char *dst;
241241
char buf[512];
242242
int len;
243-
uid_t uid1, uid2 = (uid_t) -1;
243+
uid_t uid1, uid2 = -1;
244244

245245
if (copyin((void *) arg, &mem, sizeof mem))
246246
return -EFAULT;
@@ -260,7 +260,7 @@ ctl_linux_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsign
260260
if (child) {
261261
get_task_struct(child);
262262
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
263-
uid2 = child->cred->uid;
263+
uid2 = KUIDT_VALUE(child->cred->uid);
264264
#else
265265
uid2 = current->uid;
266266
#endif
@@ -272,7 +272,7 @@ ctl_linux_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsign
272272
/* Do the permission check. */
273273
/***********************************************/
274274
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
275-
uid1 = current->cred->uid;
275+
uid1 = KUIDT_VALUE(current->cred->uid);
276276
#else
277277
uid1 = current->uid;
278278
#endif

driver/dtrace.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,12 +1197,12 @@ dtrace_priv_proc_common_user(dtrace_state_t *state)
11971197
ASSERT(s_cr != NULL);
11981198

11991199
if ((cr = CRED()) != NULL &&
1200-
s_cr->cr_uid == cr->cr_uid &&
1201-
s_cr->cr_uid == cr->cr_ruid &&
1202-
s_cr->cr_uid == cr->cr_suid &&
1203-
s_cr->cr_gid == cr->cr_gid &&
1204-
s_cr->cr_gid == cr->cr_rgid &&
1205-
s_cr->cr_gid == cr->cr_sgid)
1200+
KUIDT_VALUE(s_cr->cr_uid) == KUIDT_VALUE(cr->cr_uid) &&
1201+
KUIDT_VALUE(s_cr->cr_uid) == KUIDT_VALUE(cr->cr_ruid) &&
1202+
KUIDT_VALUE(s_cr->cr_uid) == KUIDT_VALUE(cr->cr_suid) &&
1203+
KUIDT_VALUE(s_cr->cr_gid) == KUIDT_VALUE(cr->cr_gid) &&
1204+
KUIDT_VALUE(s_cr->cr_gid) == KUIDT_VALUE(cr->cr_rgid) &&
1205+
KUIDT_VALUE(s_cr->cr_gid) == KUIDT_VALUE(cr->cr_sgid))
12061206
return (1);
12071207

12081208
return (0);
@@ -1390,12 +1390,12 @@ dtrace_priv_probe(dtrace_state_t *state, dtrace_mstate_t *mstate,
13901390
ASSERT(s_cr != NULL);
13911391

13921392
if ((cr = CRED()) == NULL ||
1393-
s_cr->cr_uid != cr->cr_uid ||
1394-
s_cr->cr_uid != cr->cr_ruid ||
1395-
s_cr->cr_uid != cr->cr_suid ||
1396-
s_cr->cr_gid != cr->cr_gid ||
1397-
s_cr->cr_gid != cr->cr_rgid ||
1398-
s_cr->cr_gid != cr->cr_sgid ||
1393+
KUIDT_VALUE(s_cr->cr_uid) != KUIDT_VALUE(cr->cr_uid) ||
1394+
KUIDT_VALUE(s_cr->cr_uid) != KUIDT_VALUE(cr->cr_ruid) ||
1395+
KUIDT_VALUE(s_cr->cr_uid) != KUIDT_VALUE(cr->cr_suid) ||
1396+
KUIDT_VALUE(s_cr->cr_gid) != KUIDT_VALUE(cr->cr_gid) ||
1397+
KUIDT_VALUE(s_cr->cr_gid) != KUIDT_VALUE(cr->cr_rgid) ||
1398+
KUIDT_VALUE(s_cr->cr_gid) != KUIDT_VALUE(cr->cr_sgid) ||
13991399
(proc = ttoproc(curthread)) == NULL ||
14001400
(proc->p_flag & SNOCD)) {
14011401
if (mode & DTRACE_MODE_NOPRIV_DROP)
@@ -3350,7 +3350,7 @@ dtrace_printf("%s(%d): TODO!!\n", __func__, __LINE__);
33503350
*/
33513351
return ((uint64_t)curthread->t_procp->p_cred->cr_uid);
33523352
# else
3353-
return (uint64_t) CRED()->cr_uid;
3353+
return (uint64_t) KUIDT_VALUE(CRED()->cr_uid);
33543354
# endif
33553355

33563356
case DIF_VAR_GID:
@@ -3375,7 +3375,7 @@ dtrace_printf("%s(%d): TODO!!\n", __func__, __LINE__);
33753375
*/
33763376
return ((uint64_t)curthread->t_procp->p_cred->cr_gid);
33773377
# else
3378-
return (uint64_t) CRED()->cr_gid;
3378+
return (uint64_t) KUIDT_VALUE(CRED()->cr_gid);
33793379
# endif
33803380

33813381
case DIF_VAR_ERRNO: {
@@ -7297,7 +7297,7 @@ dtrace_cred2priv(cred_t *cr, uint32_t *privp, uid_t *uidp, zoneid_t *zoneidp)
72977297
*/
72987298
priv = DTRACE_PRIV_ALL;
72997299
} else {
7300-
*uidp = crgetuid(cr);
7300+
*uidp = KUIDT_VALUE(crgetuid(cr));
73017301
*zoneidp = crgetzoneid(cr);
73027302

73037303
priv = 0;
@@ -7798,7 +7798,7 @@ dtrace_register(const char *name, const dtrace_pattr_t *pap, uint32_t priv,
77987798
provider->dtpv_attr = *pap;
77997799
provider->dtpv_priv.dtpp_flags = priv;
78007800
if (cr != NULL) {
7801-
provider->dtpv_priv.dtpp_uid = crgetuid(cr);
7801+
provider->dtpv_priv.dtpp_uid = KUIDT_VALUE(crgetuid(cr));
78027802
provider->dtpv_priv.dtpp_zoneid = crgetzoneid(cr);
78037803
}
78047804
provider->dtpv_pops = *pops;
@@ -16596,7 +16596,7 @@ PRINT_CASE(DTRACEIOC_ENABLE);
1659616596
}
1659716597

1659816598
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
16599-
uid = get_current()->cred->uid;
16599+
uid = KUIDT_VALUE(get_current()->cred->uid);
1660016600
# elif linux
1660116601
uid = get_current()->uid;
1660216602
# else

driver/dtrace_linux.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2444,19 +2444,19 @@ priv_policy_only(const cred_t *a, int priv, int allzone)
24442444
/* Let root have access, else we cannot */
24452445
/* really initialise the driver. */
24462446
/***********************************************/
2447-
if (a->cr_uid == 0)
2447+
if (KUIDT_VALUE(a->cr_uid) == 0)
24482448
return 1;
24492449

24502450
dpend = &di_list[di_cnt];
24512451
//printk("priv_policy_only %p %x %d := trying...\n", a, priv, allzone);
24522452
for (dp = di_list; dp < dpend; dp++) {
24532453
switch (dp->di_type) {
24542454
case DIT_UID:
2455-
if (dp->di_id != a->cr_uid)
2455+
if (dp->di_id != KUIDT_VALUE(a->cr_uid))
24562456
continue;
24572457
break;
24582458
case DIT_GID:
2459-
if (dp->di_id != a->cr_gid)
2459+
if (dp->di_id != KGIDT_VALUE(a->cr_gid))
24602460
continue;
24612461
break;
24622462
case DIT_ALL:
@@ -2670,7 +2670,8 @@ dtracedrv_write(struct file *file, const char __user *buf,
26702670
/* security model. */
26712671
/***********************************************/
26722672
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
2673-
if (current->cred->uid != 0 && current->cred->euid != 0)
2673+
if (KUIDT_VALUE(current->cred->uid) != 0 &&
2674+
KUIDT_VALUE(current->cred->euid) != 0)
26742675
#else
26752676
if (current->uid != 0 && current->euid != 0)
26762677
#endif

driver/dtrace_linux.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,17 @@ typedef uint32_t ipaddr_t;
9595

9696
# define hz HZ
9797

98+
/**********************************************************************/
99+
/* Code for 3.8.0 kernels which do strict kuid_t type checking. */
100+
/**********************************************************************/
101+
#ifdef CONFIG_UIDGID_STRICT_TYPE_CHECKS
102+
# define KUIDT_VALUE(v) v.val
103+
# define KGIDT_VALUE(v) v.val
104+
#else
105+
# define KUIDT_VALUE(v) v
106+
# define KGIDT_VALUE(v) v
107+
#endif
108+
98109
/**********************************************************************/
99110
/* File based on code from FreeBSD to support the missing */
100111
/* task_struct fields which dtrace wants. */

driver/prov_proc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ psinfo_arg(int n, struct pt_regs *regs)
3131
ps->pr_pgid = current->tgid;
3232
ps->pr_ppid = current->parent ? current->parent->pid : 0;
3333
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 29)
34-
ps->pr_uid = current->cred->uid;
35-
ps->pr_gid = current->cred->gid;
36-
ps->pr_euid = current->cred->euid;
37-
ps->pr_egid = current->cred->egid;
34+
ps->pr_uid = KUIDT_VALUE(current->cred->uid);
35+
ps->pr_gid = KGIDT_VALUE(current->cred->gid);
36+
ps->pr_euid = KUIDT_VALUE(current->cred->euid);
37+
ps->pr_egid = KGIDT_VALUE(current->cred->egid);
3838
#else
3939
ps->pr_uid = current->uid;
4040
ps->pr_gid = current->gid;

0 commit comments

Comments
 (0)