On Mon, Dec 12, 2016 at 1:19 PM, William Roberts <bill.c.roberts@xxxxxxxxx> wrote: > On Mon, Dec 12, 2016 at 12:16 PM, Stephen Smalley <sds@xxxxxxxxxxxxx> wrote: >> On 12/11/2016 07:25 PM, William Roberts wrote: >>> I'll test it tomorrow on Mac OS for you if you want? >> >> It would be good if someone were to test it on MacOS, particularly >> whichever version of MacOS is supported for building Android (not sure >> which one(s) that is). >> >> The other consideration is that it isn't always available in older libc >> or other libc implementations, which can be a problem for embedded. >> meta-selinux carries patches to make the existing usage of FD_CLOEXEC, >> SOCK_CLOEXEC, and O_CLOEXEC optional if not defined, so they would >> presumably have to do the same for all of these calls. Maybe we could >> wrap this in a macro that gets defined once and drops the "e" or the >> O_CLOEXEC if not supported by the platform? > > That doesn't seem to be a bad idea. I have not tested on Mac OS yet, > But I will get to it by days end. I just wrote a small test program to fopen() a file with "re" and it worked just fine. I can also put strings like so, "rqpoipj" and fopen returns a file pointer that is readable in all cases. "re" seems supported. I am on version: $ defaults read loginwindow SystemVersionStampAsString 10.11.6 > >> >>> >>> On Dec 11, 2016 3:22 PM, "Nick Kralevich" <nnk@xxxxxxxxxx >>> <mailto:nnk@xxxxxxxxxx>> wrote: >>> >>> I don't know. I didn't test this change on a Mac. >>> >>> -- Nick >>> >>> On Sun, Dec 11, 2016 at 1:39 PM, William Roberts >>> <bill.c.roberts@xxxxxxxxx <mailto:bill.c.roberts@xxxxxxxxx>> wrote: >>> >>> Do you know if "re" poses any Mac issues? I would assume not, >>> but I've never checked. >>> >>> On Dec 11, 2016 09:32, "Nick Kralevich" <nnk@xxxxxxxxxx >>> <mailto:nnk@xxxxxxxxxx>> wrote: >>> >>> Makes libselinux safer and less likely to leak file >>> descriptors when >>> used as part of a multithreaded program. >>> >>> Signed-off-by: Nick Kralevich <nnk@xxxxxxxxxx >>> <mailto:nnk@xxxxxxxxxx>> >>> --- >>> libselinux/src/audit2why.c | 4 ++-- >>> libselinux/src/booleans.c | 14 >>> +++++++------- >>> libselinux/src/canonicalize_context.c | 2 +- >>> libselinux/src/check_context.c | 2 +- >>> libselinux/src/compute_av.c | 2 +- >>> libselinux/src/compute_create.c | 2 +- >>> libselinux/src/compute_member.c | 2 +- >>> libselinux/src/compute_relabel.c | 2 +- >>> libselinux/src/compute_user.c | 2 +- >>> libselinux/src/deny_unknown.c | 2 +- >>> libselinux/src/disable.c | 2 +- >>> libselinux/src/enabled.c | 2 +- >>> libselinux/src/get_context_list.c | 6 +++--- >>> libselinux/src/get_default_type.c | 2 +- >>> libselinux/src/get_initial_context.c | 2 +- >>> libselinux/src/getenforce.c | 2 +- >>> libselinux/src/init.c | 4 ++-- >>> libselinux/src/is_customizable_type.c | 2 +- >>> libselinux/src/label.c | 2 +- >>> libselinux/src/label_backends_android.c | 2 +- >>> libselinux/src/label_file.c | 2 +- >>> libselinux/src/label_media.c | 2 +- >>> libselinux/src/label_x.c | 2 +- >>> libselinux/src/load_policy.c | 8 ++++---- >>> libselinux/src/matchmediacon.c | 2 +- >>> libselinux/src/policyvers.c | 2 +- >>> libselinux/src/procattr.c | 4 ++-- >>> libselinux/src/selinux_check_securetty_context.c | 2 +- >>> libselinux/src/selinux_config.c | 4 ++-- >>> libselinux/src/selinux_restorecon.c | 2 +- >>> libselinux/src/setenforce.c | 2 +- >>> libselinux/src/seusers.c | 4 ++-- >>> libselinux/src/stringrep.c | 2 +- >>> 33 files changed, 49 insertions(+), 49 deletions(-) >>> >>> diff --git a/libselinux/src/audit2why.c >>> b/libselinux/src/audit2why.c >>> index 3135eed..857383a 100644 >>> --- a/libselinux/src/audit2why.c >>> +++ b/libselinux/src/audit2why.c >>> @@ -201,7 +201,7 @@ static int __policy_init(const char >>> *init_path) >>> path[PATH_MAX-1] = '\0'; >>> if (init_path) { >>> strncpy(path, init_path, PATH_MAX-1); >>> - fp = fopen(path, "r"); >>> + fp = fopen(path, "re"); >>> if (!fp) { >>> snprintf(errormsg, sizeof(errormsg), >>> "unable to open %s: %s\n", >>> @@ -218,7 +218,7 @@ static int __policy_init(const char >>> *init_path) >>> PyErr_SetString( PyExc_ValueError, >>> errormsg); >>> return 1; >>> } >>> - fp = fopen(curpolicy, "r"); >>> + fp = fopen(curpolicy, "re"); >>> if (!fp) { >>> snprintf(errormsg, sizeof(errormsg), >>> "unable to open %s: %s\n", >>> diff --git a/libselinux/src/booleans.c >>> b/libselinux/src/booleans.c >>> index ba9d934..4a38a78 100644 >>> --- a/libselinux/src/booleans.c >>> +++ b/libselinux/src/booleans.c >>> @@ -97,7 +97,7 @@ char *selinux_boolean_sub(const char *name) >>> if (!name) >>> return NULL; >>> >>> - cfg = fopen(selinux_booleans_subs_path(), "r"); >>> + cfg = fopen(selinux_booleans_subs_path(), "re"); >>> if (!cfg) >>> goto out; >>> >>> @@ -210,7 +210,7 @@ static int get_bool_value(const char >>> *name, char **buf) >>> >>> (*buf)[STRBUF_SIZE] = 0; >>> >>> - fd = bool_open(name, O_RDONLY); >>> + fd = bool_open(name, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> goto out_err; >>> >>> @@ -274,7 +274,7 @@ int security_set_boolean(const char >>> *name, int value) >>> return -1; >>> } >>> >>> - fd = bool_open(name, O_WRONLY); >>> + fd = bool_open(name, O_WRONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> @@ -305,7 +305,7 @@ int security_commit_booleans(void) >>> } >>> >>> snprintf(path, sizeof path, >>> "%s/commit_pending_bools", selinux_mnt); >>> - fd = open(path, O_WRONLY); >>> + fd = open(path, O_WRONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> @@ -399,7 +399,7 @@ static int save_booleans(size_t boolcnt, >>> SELboolean * boollist) >>> >>> snprintf(local_bool_file, sizeof(local_bool_file), >>> "%s.local", >>> bool_file); >>> - boolf = fopen(local_bool_file, "r"); >>> + boolf = fopen(local_bool_file, "re"); >>> if (boolf != NULL) { >>> ssize_t ret; >>> size_t size = 0; >>> @@ -518,7 +518,7 @@ int security_load_booleans(char *path) >>> int val; >>> char name[BUFSIZ]; >>> >>> - boolf = fopen(path ? path : selinux_booleans_path(), >>> "r"); >>> + boolf = fopen(path ? path : selinux_booleans_path(), >>> "re"); >>> if (boolf == NULL) >>> goto localbool; >>> >>> @@ -536,7 +536,7 @@ int security_load_booleans(char *path) >>> localbool: >>> snprintf(localbools, sizeof(localbools), "%s.local", >>> (path ? path : selinux_booleans_path())); >>> - boolf = fopen(localbools, "r"); >>> + boolf = fopen(localbools, "re"); >>> >>> if (boolf != NULL) { >>> int ret; >>> diff --git a/libselinux/src/canonicalize_context.c >>> b/libselinux/src/canonicalize_context.c >>> index 7cf3139..ba4c9a2 100644 >>> --- a/libselinux/src/canonicalize_context.c >>> +++ b/libselinux/src/canonicalize_context.c >>> @@ -23,7 +23,7 @@ int >>> security_canonicalize_context_raw(const char * con, >>> } >>> >>> snprintf(path, sizeof path, "%s/context", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/check_context.c >>> b/libselinux/src/check_context.c >>> index 52063fa..8a7997f 100644 >>> --- a/libselinux/src/check_context.c >>> +++ b/libselinux/src/check_context.c >>> @@ -20,7 +20,7 @@ int security_check_context_raw(const char >>> * con) >>> } >>> >>> snprintf(path, sizeof path, "%s/context", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/compute_av.c >>> b/libselinux/src/compute_av.c >>> index 937e5c3..1d05e7b 100644 >>> --- a/libselinux/src/compute_av.c >>> +++ b/libselinux/src/compute_av.c >>> @@ -27,7 +27,7 @@ int security_compute_av_flags_raw(const >>> char * scon, >>> } >>> >>> snprintf(path, sizeof path, "%s/access", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/compute_create.c >>> b/libselinux/src/compute_create.c >>> index 9559d42..0975aea 100644 >>> --- a/libselinux/src/compute_create.c >>> +++ b/libselinux/src/compute_create.c >>> @@ -65,7 +65,7 @@ int security_compute_create_name_raw(const >>> char * scon, >>> } >>> >>> snprintf(path, sizeof path, "%s/create", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/compute_member.c >>> b/libselinux/src/compute_member.c >>> index 1fc7e41..4e2d221 100644 >>> --- a/libselinux/src/compute_member.c >>> +++ b/libselinux/src/compute_member.c >>> @@ -26,7 +26,7 @@ int security_compute_member_raw(const char >>> * scon, >>> } >>> >>> snprintf(path, sizeof path, "%s/member", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/compute_relabel.c >>> b/libselinux/src/compute_relabel.c >>> index 4615aee..49f77ef 100644 >>> --- a/libselinux/src/compute_relabel.c >>> +++ b/libselinux/src/compute_relabel.c >>> @@ -26,7 +26,7 @@ int security_compute_relabel_raw(const >>> char * scon, >>> } >>> >>> snprintf(path, sizeof path, "%s/relabel", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/compute_user.c >>> b/libselinux/src/compute_user.c >>> index b37c5d3..7b88121 100644 >>> --- a/libselinux/src/compute_user.c >>> +++ b/libselinux/src/compute_user.c >>> @@ -25,7 +25,7 @@ int security_compute_user_raw(const char * >>> scon, >>> } >>> >>> snprintf(path, sizeof path, "%s/user", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/deny_unknown.c >>> b/libselinux/src/deny_unknown.c >>> index c93998a..77d04e3 100644 >>> --- a/libselinux/src/deny_unknown.c >>> +++ b/libselinux/src/deny_unknown.c >>> @@ -21,7 +21,7 @@ int security_deny_unknown(void) >>> } >>> >>> snprintf(path, sizeof(path), "%s/deny_unknown", >>> selinux_mnt); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/disable.c b/libselinux/src/disable.c >>> index dac0f5b..8d66262 100644 >>> --- a/libselinux/src/disable.c >>> +++ b/libselinux/src/disable.c >>> @@ -21,7 +21,7 @@ int security_disable(void) >>> } >>> >>> snprintf(path, sizeof path, "%s/disable", selinux_mnt); >>> - fd = open(path, O_WRONLY); >>> + fd = open(path, O_WRONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/enabled.c b/libselinux/src/enabled.c >>> index 2ec6797..dd628fb 100644 >>> --- a/libselinux/src/enabled.c >>> +++ b/libselinux/src/enabled.c >>> @@ -36,7 +36,7 @@ int is_selinux_mls_enabled(void) >>> return enabled; >>> >>> snprintf(path, sizeof path, "%s/mls", selinux_mnt); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> return enabled; >>> >>> diff --git a/libselinux/src/get_context_list.c >>> b/libselinux/src/get_context_list.c >>> index f3fa4a9..689e465 100644 >>> --- a/libselinux/src/get_context_list.c >>> +++ b/libselinux/src/get_context_list.c >>> @@ -275,7 +275,7 @@ static int get_failsafe_context(const >>> char *user, char ** newcon) >>> size_t plen, nlen; >>> int rc; >>> >>> - fp = fopen(selinux_failsafe_context_path(), "r"); >>> + fp = fopen(selinux_failsafe_context_path(), "re"); >>> if (!fp) >>> return -1; >>> >>> @@ -437,7 +437,7 @@ int get_ordered_context_list(const char >>> *user, >>> if (!fname) >>> goto failsafe; >>> snprintf(fname, fname_len, "%s%s", >>> user_contexts_path, user); >>> - fp = fopen(fname, "r"); >>> + fp = fopen(fname, "re"); >>> if (fp) { >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> rc = get_context_order(fp, fromcon, >>> reachable, nreach, ordering, >>> @@ -451,7 +451,7 @@ int get_ordered_context_list(const char >>> *user, >>> } >>> } >>> free(fname); >>> - fp = fopen(selinux_default_context_path(), "r"); >>> + fp = fopen(selinux_default_context_path(), "re"); >>> if (fp) { >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> rc = get_context_order(fp, fromcon, >>> reachable, nreach, ordering, >>> diff --git a/libselinux/src/get_default_type.c >>> b/libselinux/src/get_default_type.c >>> index 27f2ae5..dd7b5d7 100644 >>> --- a/libselinux/src/get_default_type.c >>> +++ b/libselinux/src/get_default_type.c >>> @@ -11,7 +11,7 @@ int get_default_type(const char *role, >>> char **type) >>> { >>> FILE *fp = NULL; >>> >>> - fp = fopen(selinux_default_type_path(), "r"); >>> + fp = fopen(selinux_default_type_path(), "re"); >>> if (!fp) >>> return -1; >>> >>> diff --git a/libselinux/src/get_initial_context.c >>> b/libselinux/src/get_initial_context.c >>> index 522ed78..5e919f4 100644 >>> --- a/libselinux/src/get_initial_context.c >>> +++ b/libselinux/src/get_initial_context.c >>> @@ -25,7 +25,7 @@ int security_get_initial_context_raw(const >>> char * name, char ** con) >>> >>> snprintf(path, sizeof path, "%s%s%s", >>> selinux_mnt, SELINUX_INITCON_DIR, name); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/getenforce.c >>> b/libselinux/src/getenforce.c >>> index 03d3abc..d909dce 100644 >>> --- a/libselinux/src/getenforce.c >>> +++ b/libselinux/src/getenforce.c >>> @@ -21,7 +21,7 @@ int security_getenforce(void) >>> } >>> >>> snprintf(path, sizeof path, "%s/enforce", selinux_mnt); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/init.c b/libselinux/src/init.c >>> index ddf91f8..2690a72 100644 >>> --- a/libselinux/src/init.c >>> +++ b/libselinux/src/init.c >>> @@ -61,7 +61,7 @@ int selinuxfs_exists(void) >>> size_t len; >>> ssize_t num; >>> >>> - fp = fopen("/proc/filesystems", "r"); >>> + fp = fopen("/proc/filesystems", "re"); >>> if (!fp) >>> return 1; /* Fail as if it exists */ >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> @@ -101,7 +101,7 @@ static void init_selinuxmnt(void) >>> >>> /* At this point, the usual spot doesn't have an >>> selinuxfs so >>> * we look around for it */ >>> - fp = fopen("/proc/mounts", "r"); >>> + fp = fopen("/proc/mounts", "re"); >>> if (!fp) >>> goto out; >>> >>> diff --git a/libselinux/src/is_customizable_type.c >>> b/libselinux/src/is_customizable_type.c >>> index 0b33edc..92876f4 100644 >>> --- a/libselinux/src/is_customizable_type.c >>> +++ b/libselinux/src/is_customizable_type.c >>> @@ -16,7 +16,7 @@ static int get_customizable_type_list(char >>> *** retlist) >>> unsigned int ctr = 0, i; >>> char **list = NULL; >>> >>> - fp = fopen(selinux_customizable_types_path(), "r"); >>> + fp = fopen(selinux_customizable_types_path(), "re"); >>> if (!fp) >>> return -1; >>> >>> diff --git a/libselinux/src/label.c b/libselinux/src/label.c >>> index 60639cf..5c9d8c1 100644 >>> --- a/libselinux/src/label.c >>> +++ b/libselinux/src/label.c >>> @@ -96,7 +96,7 @@ struct selabel_sub >>> *selabel_subs_init(const char *path, >>> struct >>> selabel_digest *digest) >>> { >>> char buf[1024]; >>> - FILE *cfg = fopen(path, "r"); >>> + FILE *cfg = fopen(path, "re"); >>> struct selabel_sub *sub = NULL; >>> struct stat sb; >>> >>> diff --git a/libselinux/src/label_backends_android.c >>> b/libselinux/src/label_backends_android.c >>> index 4d6ec86..4ad71f9 100644 >>> --- a/libselinux/src/label_backends_android.c >>> +++ b/libselinux/src/label_backends_android.c >>> @@ -159,7 +159,7 @@ static int init(struct selabel_handle >>> *rec, const struct selinux_opt *opts, >>> return -1; >>> >>> /* Open the specification file. */ >>> - if ((fp = fopen(path, "r")) == NULL) >>> + if ((fp = fopen(path, "re")) == NULL) >>> return -1; >>> >>> if (fstat(fileno(fp), &sb) < 0) >>> diff --git a/libselinux/src/label_file.c >>> b/libselinux/src/label_file.c >>> index a4dc3cd..0d4029b 100644 >>> --- a/libselinux/src/label_file.c >>> +++ b/libselinux/src/label_file.c >>> @@ -520,7 +520,7 @@ static FILE *open_file(const char *path, >>> const char *suffix, >>> } >>> >>> memcpy(sb, &found->sb, sizeof(*sb)); >>> - return fopen(save_path, "r"); >>> + return fopen(save_path, "re"); >>> } >>> >>> static int process_file(const char *path, const char *suffix, >>> diff --git a/libselinux/src/label_media.c >>> b/libselinux/src/label_media.c >>> index 622741b..d202e5d 100644 >>> --- a/libselinux/src/label_media.c >>> +++ b/libselinux/src/label_media.c >>> @@ -90,7 +90,7 @@ static int init(struct selabel_handle >>> *rec, const struct selinux_opt *opts, >>> /* Open the specification file. */ >>> if (!path) >>> path = selinux_media_context_path(); >>> - if ((fp = fopen(path, "r")) == NULL) >>> + if ((fp = fopen(path, "re")) == NULL) >>> return -1; >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> >>> diff --git a/libselinux/src/label_x.c b/libselinux/src/label_x.c >>> index 700def1..9674529 100644 >>> --- a/libselinux/src/label_x.c >>> +++ b/libselinux/src/label_x.c >>> @@ -117,7 +117,7 @@ static int init(struct selabel_handle >>> *rec, const struct selinux_opt *opts, >>> /* Open the specification file. */ >>> if (!path) >>> path = selinux_x_context_path(); >>> - if ((fp = fopen(path, "r")) == NULL) >>> + if ((fp = fopen(path, "re")) == NULL) >>> return -1; >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> >>> diff --git a/libselinux/src/load_policy.c >>> b/libselinux/src/load_policy.c >>> index b7e1a6f..327cc6a 100644 >>> --- a/libselinux/src/load_policy.c >>> +++ b/libselinux/src/load_policy.c >>> @@ -34,7 +34,7 @@ int security_load_policy(void *data, >>> size_t len) >>> } >>> >>> snprintf(path, sizeof path, "%s/load", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> @@ -173,13 +173,13 @@ checkbool: >>> search: >>> snprintf(path, sizeof(path), "%s.%d", >>> selinux_binary_policy_path(), vers); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> while (fd < 0 && errno == ENOENT >>> && --vers >= minvers) { >>> /* Check prior versions to see if old policy >>> is available */ >>> snprintf(path, sizeof(path), "%s.%d", >>> selinux_binary_policy_path(), vers); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> } >>> if (fd < 0) { >>> fprintf(stderr, >>> @@ -335,7 +335,7 @@ int selinux_init_load_policy(int *enforce) >>> >>> /* Check for an override of the mode via the kernel >>> command line. */ >>> rc = mount("proc", "/proc", "proc", 0, 0); >>> - cfg = fopen("/proc/cmdline", "r"); >>> + cfg = fopen("/proc/cmdline", "re"); >>> if (cfg) { >>> char *tmp; >>> buf = malloc(selinux_page_size); >>> diff --git a/libselinux/src/matchmediacon.c >>> b/libselinux/src/matchmediacon.c >>> index 46cba46..23d01af 100644 >>> --- a/libselinux/src/matchmediacon.c >>> +++ b/libselinux/src/matchmediacon.c >>> @@ -18,7 +18,7 @@ int matchmediacon(const char *media, char >>> ** con) >>> char *ptr, *ptr2 = NULL; >>> int found = 0; >>> char current_line[PATH_MAX]; >>> - if ((infile = fopen(path, "r")) == NULL) >>> + if ((infile = fopen(path, "re")) == NULL) >>> return -1; >>> while (!feof_unlocked(infile)) { >>> if (!fgets_unlocked(current_line, >>> sizeof(current_line), infile)) { >>> diff --git a/libselinux/src/policyvers.c >>> b/libselinux/src/policyvers.c >>> index 284a7f7..c97dd9d 100644 >>> --- a/libselinux/src/policyvers.c >>> +++ b/libselinux/src/policyvers.c >>> @@ -23,7 +23,7 @@ int security_policyvers(void) >>> } >>> >>> snprintf(path, sizeof path, "%s/policyvers", >>> selinux_mnt); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) { >>> if (errno == ENOENT) >>> return vers; >>> diff --git a/libselinux/src/procattr.c >>> b/libselinux/src/procattr.c >>> index 8cd59af..ebc0ade 100644 >>> --- a/libselinux/src/procattr.c >>> +++ b/libselinux/src/procattr.c >>> @@ -143,7 +143,7 @@ static int getprocattrcon_raw(char ** >>> context, >>> return 0; >>> } >>> >>> - fd = openattr(pid, attr, O_RDONLY); >>> + fd = openattr(pid, attr, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> @@ -235,7 +235,7 @@ static int setprocattrcon_raw(const char >>> * context, >>> && !strcmp(context, *prev_context)) >>> return 0; >>> >>> - fd = openattr(pid, attr, O_RDWR); >>> + fd = openattr(pid, attr, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> if (context) { >>> diff --git >>> a/libselinux/src/selinux_check_securetty_context.c >>> b/libselinux/src/selinux_check_securetty_context.c >>> index 24e5e2c..55d4e03 100644 >>> --- a/libselinux/src/selinux_check_securetty_context.c >>> +++ b/libselinux/src/selinux_check_securetty_context.c >>> @@ -14,7 +14,7 @@ int selinux_check_securetty_context(const >>> char * tty_context) >>> ssize_t len; >>> int found = -1; >>> FILE *fp; >>> - fp = fopen(selinux_securetty_types_path(), "r"); >>> + fp = fopen(selinux_securetty_types_path(), "re"); >>> if (fp) { >>> context_t con = context_new(tty_context); >>> if (con) { >>> diff --git a/libselinux/src/selinux_config.c >>> b/libselinux/src/selinux_config.c >>> index 88bcc85..d8e140c 100644 >>> --- a/libselinux/src/selinux_config.c >>> +++ b/libselinux/src/selinux_config.c >>> @@ -88,7 +88,7 @@ static const uint16_t >>> file_path_suffixes_idx[NEL] = { >>> int selinux_getenforcemode(int *enforce) >>> { >>> int ret = -1; >>> - FILE *cfg = fopen(SELINUXCONFIG, "r"); >>> + FILE *cfg = fopen(SELINUXCONFIG, "re"); >>> if (cfg) { >>> char *buf; >>> int len = sizeof(SELINUXTAG) - 1; >>> @@ -163,7 +163,7 @@ static void init_selinux_config(void) >>> if (selinux_policyroot) >>> return; >>> >>> - fp = fopen(SELINUXCONFIG, "r"); >>> + fp = fopen(SELINUXCONFIG, "re"); >>> if (fp) { >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> while ((len = getline(&line_buf, &line_len, >>> fp)) > 0) { >>> diff --git a/libselinux/src/selinux_restorecon.c >>> b/libselinux/src/selinux_restorecon.c >>> index e38d1d0..7ebfbdc 100644 >>> --- a/libselinux/src/selinux_restorecon.c >>> +++ b/libselinux/src/selinux_restorecon.c >>> @@ -247,7 +247,7 @@ static int exclude_non_seclabel_mounts(void) >>> if (uname(&uts) == 0 && strverscmp(uts.release, >>> "2.6.30") < 0) >>> return 0; >>> >>> - fp = fopen("/proc/mounts", "r"); >>> + fp = fopen("/proc/mounts", "re"); >>> if (!fp) >>> return 0; >>> >>> diff --git a/libselinux/src/setenforce.c >>> b/libselinux/src/setenforce.c >>> index e5e7612..09cad3c 100644 >>> --- a/libselinux/src/setenforce.c >>> +++ b/libselinux/src/setenforce.c >>> @@ -21,7 +21,7 @@ int security_setenforce(int value) >>> } >>> >>> snprintf(path, sizeof path, "%s/enforce", selinux_mnt); >>> - fd = open(path, O_RDWR); >>> + fd = open(path, O_RDWR | O_CLOEXEC); >>> if (fd < 0) >>> return -1; >>> >>> diff --git a/libselinux/src/seusers.c b/libselinux/src/seusers.c >>> index 09e704b..572a7b0 100644 >>> --- a/libselinux/src/seusers.c >>> +++ b/libselinux/src/seusers.c >>> @@ -185,7 +185,7 @@ int getseuserbyname(const char *name, >>> char **r_seuser, char **r_level) >>> >>> gid_t gid = get_default_gid(name); >>> >>> - cfg = fopen(selinux_usersconf_path(), "r"); >>> + cfg = fopen(selinux_usersconf_path(), "re"); >>> if (!cfg) >>> goto nomatch; >>> >>> @@ -278,7 +278,7 @@ int getseuser(const char *username, >>> const char *service, >>> FILE *fp = NULL; >>> if (asprintf(&path,"%s/logins/%s", >>> selinux_policy_root(), username) < 0) >>> goto err; >>> - fp = fopen(path, "r"); >>> + fp = fopen(path, "re"); >>> free(path); >>> if (fp == NULL) goto err; >>> __fsetlocking(fp, FSETLOCKING_BYCALLER); >>> diff --git a/libselinux/src/stringrep.c >>> b/libselinux/src/stringrep.c >>> index 2dbec2b..2d83f96 100644 >>> --- a/libselinux/src/stringrep.c >>> +++ b/libselinux/src/stringrep.c >>> @@ -80,7 +80,7 @@ static struct discover_class_node * >>> discover_class(const char *s) >>> >>> /* load up class index */ >>> snprintf(path, sizeof path, "%s/class/%s/index", >>> selinux_mnt,s); >>> - fd = open(path, O_RDONLY); >>> + fd = open(path, O_RDONLY | O_CLOEXEC); >>> if (fd < 0) >>> goto err3; >>> >>> -- >>> 2.8.0.rc3.226.g39d4020 >>> >>> _______________________________________________ >>> Selinux mailing list >>> Selinux@xxxxxxxxxxxxx <mailto:Selinux@xxxxxxxxxxxxx> >>> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx >>> <mailto:Selinux-leave@xxxxxxxxxxxxx>. >>> To get help, send an email containing "help" to >>> Selinux-request@xxxxxxxxxxxxx >>> <mailto:Selinux-request@xxxxxxxxxxxxx>. >>> >>> >>> >>> >>> >>> -- >>> Nick Kralevich | Android Security | nnk@xxxxxxxxxx >>> <mailto:nnk@xxxxxxxxxx> | 650.214.4037 <tel:(650)%20214-4037> >>> >>> >>> >>> _______________________________________________ >>> Selinux mailing list >>> Selinux@xxxxxxxxxxxxx >>> To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx. >>> To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx. >>> >> > > > > -- > Respectfully, > > William C Roberts -- Respectfully, William C Roberts _______________________________________________ Selinux mailing list Selinux@xxxxxxxxxxxxx To unsubscribe, send email to Selinux-leave@xxxxxxxxxxxxx. To get help, send an email containing "help" to Selinux-request@xxxxxxxxxxxxx.