Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libast/preroot/ispreroot.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1985-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* David Korn <[email protected]> *
19
* Phong Vo <[email protected]> *
20
* *
21
***********************************************************************/
22
#pragma prototyped
23
/*
24
* AT&T Bell Laboratories
25
* return 1 if dir [any dir] is the preroot
26
*/
27
28
#include <ast.h>
29
#include <preroot.h>
30
31
#if FS_PREROOT
32
33
#include <ls.h>
34
35
/*
36
* return 1 if files a and b are the same under preroot
37
*
38
* NOTE: the kernel disables preroot for set-uid processes
39
*/
40
41
static int
42
same(const char* a, const char* b)
43
{
44
int i;
45
int euid;
46
int ruid;
47
48
struct stat ast;
49
struct stat bst;
50
51
if ((ruid = getuid()) != (euid = geteuid())) setuid(ruid);
52
i = !stat(a, &ast) && !stat(b, &bst) && ast.st_dev == bst.st_dev && ast.st_ino == bst.st_ino;
53
if (ruid != euid) setuid(euid);
54
return(i);
55
}
56
57
int
58
ispreroot(const char* dir)
59
{
60
static int prerooted = -1;
61
62
if (dir) return(same("/", dir));
63
if (prerooted < 0) prerooted = !same("/", PR_REAL);
64
return(prerooted);
65
}
66
67
#else
68
69
NoN(ispreroot)
70
71
#endif
72
73