chiark
/
gitweb
/
~mdw
/
checkpath
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
checkpath.c: Rename global flags and put their definitions in constact.
[checkpath]
/
checkpath.c
diff --git
a/checkpath.c
b/checkpath.c
index 4cf5181ddc1d19ce82cb22151ecf5d857090438e..9c1508645e02933188401026947284dbaa064be2 100644
(file)
--- a/
checkpath.c
+++ b/
checkpath.c
@@
-59,16
+59,14
@@
struct elt {
struct elt *e_link; /* Pointer to the next one along */
size_t e_offset; /* Offset of name in path string */
unsigned e_flags; /* Various useful flags */
struct elt *e_link; /* Pointer to the next one along */
size_t e_offset; /* Offset of name in path string */
unsigned e_flags; /* Various useful flags */
+#define EF_STICKY 1u /* Directory has sticky bit set */
char e_name[1]; /* Name of the directory */
};
char e_name[1]; /* Name of the directory */
};
-#define f_sticky 1u /* Directory has sticky bit set */
-
-#define f_last 1u /* This is the final item to check */
/*----- Static variables --------------------------------------------------*/
/*----- Static variables --------------------------------------------------*/
-static struct elt rootnode = { 0, 0, 0 }; /* Root of the list */
+static
const
struct elt rootnode = { 0, 0, 0 }; /* Root of the list */
static struct elt *sp; /* Stack pointer for list */
static dstr d = DSTR_INIT; /* Current path string */
static struct elt *sp; /* Stack pointer for list */
static dstr d = DSTR_INIT; /* Current path string */
@@
-272,13
+270,17
@@
static void report(const struct checkpath *cp, unsigned what, int verbose,
* Arguments: @const char *p@ = name of directory to check
* @struct stat *st@ = pointer to @stat@(2) block for it
* @const struct checkpath *cp@ = pointer to caller parameters
* Arguments: @const char *p@ = name of directory to check
* @struct stat *st@ = pointer to @stat@(2) block for it
* @const struct checkpath *cp@ = pointer to caller parameters
- * @unsigned f@ = various flags
+ * @unsigned f@ = various flags
(@SF_...@)
*
* Returns: Zero if everything's OK, else bitmask of problems.
*
* Use: Performs the main load of sanity-checking on a directory.
*
* Returns: Zero if everything's OK, else bitmask of problems.
*
* Use: Performs the main load of sanity-checking on a directory.
+ * If @SF_LAST@ is not set then sticky directories are always
+ * acceptable.
*/
*/
+#define SF_LAST 1u /* This is the final item to check */
+
static unsigned sanity(const char *p, struct stat *st,
const struct checkpath *cp, unsigned f)
{
static unsigned sanity(const char *p, struct stat *st,
const struct checkpath *cp, unsigned f)
{
@@
-288,7
+290,7
@@
static unsigned sanity(const char *p, struct stat *st,
unsigned b;
if (S_ISDIR(st->st_mode) &&
unsigned b;
if (S_ISDIR(st->st_mode) &&
- (!(f &
f_last
) || (cp->cp_what & CP_STICKYOK)))
+ (!(f &
SF_LAST
) || (cp->cp_what & CP_STICKYOK)))
stickyok = 01000;
/* --- Check for world-writability --- */
stickyok = 01000;
/* --- Check for world-writability --- */
@@
-353,7
+355,7
@@
unsigned checkpath(const char *p, const struct checkpath *cp)
/* --- Initialize stack pointer and path string --- */
/* --- Initialize stack pointer and path string --- */
- sp = &rootnode;
+ sp =
(/*unconst*/ struct elt *)
&rootnode;
dstr_destroy(&d);
/* --- Try to find the current directory --- */
dstr_destroy(&d);
/* --- Try to find the current directory --- */
@@
-439,7
+441,7
@@
unsigned checkpath(const char *p, const struct checkpath *cp)
*/
if ((cp->cp_what & CP_WROTHUSR) &&
*/
if ((cp->cp_what & CP_WROTHUSR) &&
- (sp->e_link->e_flags &
f_sticky
) &&
+ (sp->e_link->e_flags &
EF_STICKY
) &&
st.st_uid != cp->cp_uid && st.st_uid != 0) {
bad |= CP_WROTHUSR;
report(cp, CP_WROTHUSR, 1, d.buf,
st.st_uid != cp->cp_uid && st.st_uid != 0) {
bad |= CP_WROTHUSR;
report(cp, CP_WROTHUSR, 1, d.buf,
@@
-459,11
+461,11
@@
unsigned checkpath(const char *p, const struct checkpath *cp)
/* --- Run the sanity check on this path element --- */
/* --- Run the sanity check on this path element --- */
- bad |= sanity(d.buf, &st, cp, ee ? 0 :
f_last
);
+ bad |= sanity(d.buf, &st, cp, ee ? 0 :
SF_LAST
);
if (S_ISDIR(st.st_mode)) {
if (st.st_mode & 01000)
if (S_ISDIR(st.st_mode)) {
if (st.st_mode & 01000)
- sp->e_flags |=
f_sticky
;
+ sp->e_flags |=
EF_STICKY
;
report(cp, CP_REPORT, 4, d.buf, "directory");
continue;
}
report(cp, CP_REPORT, 4, d.buf, "directory");
continue;
}