Loading security/tomoyo/util.c +23 −6 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ char *tomoyo_read_token(struct tomoyo_acl_param *param) return pos; } static bool tomoyo_correct_path2(const char *filename, const size_t len); /** * tomoyo_get_domainname - Read a domainname from a line. * Loading @@ -157,10 +159,10 @@ const struct tomoyo_path_info *tomoyo_get_domainname char *pos = start; while (*pos) { if (*pos++ != ' ' || *pos++ == '/') if (*pos++ != ' ' || tomoyo_correct_path2(pos, strchrnul(pos, ' ') - pos)) continue; pos -= 2; *pos++ = '\0'; *(pos - 1) = '\0'; break; } param->data = pos; Loading Loading @@ -513,6 +515,22 @@ bool tomoyo_correct_word(const char *string) return tomoyo_correct_word2(string, strlen(string)); } /** * tomoyo_correct_path2 - Check whether the given pathname follows the naming rules. * * @filename: The pathname to check. * @len: Length of @filename. * * Returns true if @filename follows the naming rules, false otherwise. */ static bool tomoyo_correct_path2(const char *filename, const size_t len) { const char *cp1 = memchr(filename, '/', len); const char *cp2 = memchr(filename, '.', len); return cp1 && (!cp2 || (cp1 < cp2)) && tomoyo_correct_word2(filename, len); } /** * tomoyo_correct_path - Validate a pathname. * Loading @@ -523,7 +541,7 @@ bool tomoyo_correct_word(const char *string) */ bool tomoyo_correct_path(const char *filename) { return *filename == '/' && tomoyo_correct_word(filename); return tomoyo_correct_path2(filename, strlen(filename)); } /** Loading @@ -545,8 +563,7 @@ bool tomoyo_correct_domain(const unsigned char *domainname) if (!cp) break; if (*domainname != '/' || !tomoyo_correct_word2(domainname, cp - domainname)) if (!tomoyo_correct_path2(domainname, cp - domainname)) return false; domainname = cp + 1; } Loading Loading
security/tomoyo/util.c +23 −6 Original line number Diff line number Diff line Loading @@ -143,6 +143,8 @@ char *tomoyo_read_token(struct tomoyo_acl_param *param) return pos; } static bool tomoyo_correct_path2(const char *filename, const size_t len); /** * tomoyo_get_domainname - Read a domainname from a line. * Loading @@ -157,10 +159,10 @@ const struct tomoyo_path_info *tomoyo_get_domainname char *pos = start; while (*pos) { if (*pos++ != ' ' || *pos++ == '/') if (*pos++ != ' ' || tomoyo_correct_path2(pos, strchrnul(pos, ' ') - pos)) continue; pos -= 2; *pos++ = '\0'; *(pos - 1) = '\0'; break; } param->data = pos; Loading Loading @@ -513,6 +515,22 @@ bool tomoyo_correct_word(const char *string) return tomoyo_correct_word2(string, strlen(string)); } /** * tomoyo_correct_path2 - Check whether the given pathname follows the naming rules. * * @filename: The pathname to check. * @len: Length of @filename. * * Returns true if @filename follows the naming rules, false otherwise. */ static bool tomoyo_correct_path2(const char *filename, const size_t len) { const char *cp1 = memchr(filename, '/', len); const char *cp2 = memchr(filename, '.', len); return cp1 && (!cp2 || (cp1 < cp2)) && tomoyo_correct_word2(filename, len); } /** * tomoyo_correct_path - Validate a pathname. * Loading @@ -523,7 +541,7 @@ bool tomoyo_correct_word(const char *string) */ bool tomoyo_correct_path(const char *filename) { return *filename == '/' && tomoyo_correct_word(filename); return tomoyo_correct_path2(filename, strlen(filename)); } /** Loading @@ -545,8 +563,7 @@ bool tomoyo_correct_domain(const unsigned char *domainname) if (!cp) break; if (*domainname != '/' || !tomoyo_correct_word2(domainname, cp - domainname)) if (!tomoyo_correct_path2(domainname, cp - domainname)) return false; domainname = cp + 1; } Loading