aboutsummaryrefslogtreecommitdiffstats
path: root/libselinux/src/label.c
diff options
context:
space:
mode:
Diffstat (limited to 'libselinux/src/label.c')
-rw-r--r--libselinux/src/label.c92
1 files changed, 50 insertions, 42 deletions
diff --git a/libselinux/src/label.c b/libselinux/src/label.c
index 7d71e724..f1c9a258 100644
--- a/libselinux/src/label.c
+++ b/libselinux/src/label.c
@@ -62,50 +62,58 @@ struct selabel_sub *selabel_subs_init(const char *path,struct selabel_sub *list)
FILE *cfg = fopen(path, "r");
struct selabel_sub *sub;
- if (cfg) {
- while (fgets_unlocked(buf, sizeof(buf) - 1, cfg)) {
- char *ptr = NULL;
- char *src = buf;
- char *dst = NULL;
-
- while (*src && isspace(*src))
- src++;
- if (src[0] == '#') continue;
- ptr = src;
- while (*ptr && ! isspace(*ptr))
- ptr++;
- *ptr++ = 0;
- if (! *src) continue;
-
- dst = ptr;
- while (*dst && isspace(*dst))
- dst++;
- ptr=dst;
- while (*ptr && ! isspace(*ptr))
- ptr++;
- *ptr=0;
- if (! *dst) continue;
-
- sub = malloc(sizeof(struct selabel_sub));
- if (! sub) return list;
- sub->src=strdup(src);
- if (! sub->src) {
- free(sub);
- return list;
- }
- sub->dst=strdup(dst);
- if (! sub->dst) {
- free(sub->src);
- free(sub);
- return list;
- }
- sub->slen = strlen(src);
- sub->next = list;
- list = sub;
- }
- fclose(cfg);
+ if (!cfg)
+ return list;
+
+ while (fgets_unlocked(buf, sizeof(buf) - 1, cfg)) {
+ char *ptr = NULL;
+ char *src = buf;
+ char *dst = NULL;
+
+ while (*src && isspace(*src))
+ src++;
+ if (src[0] == '#') continue;
+ ptr = src;
+ while (*ptr && ! isspace(*ptr))
+ ptr++;
+ *ptr++ = '\0';
+ if (! *src) continue;
+
+ dst = ptr;
+ while (*dst && isspace(*dst))
+ dst++;
+ ptr=dst;
+ while (*ptr && ! isspace(*ptr))
+ ptr++;
+ *ptr='\0';
+ if (! *dst)
+ continue;
+
+ sub = malloc(sizeof(*sub));
+ if (! sub)
+ goto err;
+ memset(sub, 0, sizeof(*sub));
+
+ sub->src=strdup(src);
+ if (! sub->src)
+ goto err;
+
+ sub->dst=strdup(dst);
+ if (! sub->dst)
+ goto err;
+
+ sub->slen = strlen(src);
+ sub->next = list;
+ list = sub;
}
+out:
+ fclose(cfg);
return list;
+err:
+ if (sub)
+ free(sub->src);
+ free(sub);
+ goto out;
}
/*