1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

clitar: return allocation errors from is_subpath()

Signed-off-by: David Disseldorp <ddiss@samba.org>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
This commit is contained in:
David Disseldorp 2014-02-20 19:47:48 +01:00 committed by Andrew Bartlett
parent 852259773b
commit 55de6d60ef

View File

@ -228,7 +228,8 @@ static NTSTATUS path_base_name(TALLOC_CTX *ctx, const char *path, char **_base);
static const char* skip_useless_char_in_path(const char *p);
static int make_remote_path(const char *full_path);
static int max_token (const char *str);
static bool is_subpath(const char *sub, const char *full);
static NTSTATUS is_subpath(const char *sub, const char *full,
bool *_subpath_match);
static int set_remote_attr(const char *filename, uint16 new_attr, int mode);
/**
@ -1310,11 +1311,18 @@ static NTSTATUS tar_path_in_list(struct tar *t, const char *path,
for (i = 0; i < t->path_list_size; i++) {
bool is_in_list;
NTSTATUS status;
pattern = skip_useless_char_in_path(t->path_list[i]);
is_in_list = is_subpath(p, pattern);
if (reverse) {
is_in_list = is_in_list || is_subpath(pattern, p);
status = is_subpath(p, pattern, &is_in_list);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
if (reverse && !is_in_list) {
status = is_subpath(pattern, p, &is_in_list);
if (!NT_STATUS_IS_OK(status)) {
return status;
}
}
if (is_in_list) {
*_is_in_list = true;
@ -1471,23 +1479,36 @@ static const char* skip_useless_char_in_path(const char *p)
}
/**
* is_subpath - return true if the path @sub is a subpath of @full.
* is_subpath - check if the path @sub is a subpath of @full.
* @sub: path to test
* @full: container path
* @_subpath_match: set true if @sub is a subpath of @full, otherwise false
*
* String comparaison is case-insensitive.
*
* Return true if @sub = @full
*/
static bool is_subpath(const char *sub, const char *full)
static NTSTATUS is_subpath(const char *sub, const char *full,
bool *_subpath_match)
{
TALLOC_CTX *tmp_ctx = PANIC_IF_NULL(talloc_new(NULL));
NTSTATUS status = NT_STATUS_OK;
int len = 0;
char *f, *s;
TALLOC_CTX *tmp_ctx = talloc_new(NULL);
if (tmp_ctx == NULL) {
status = NT_STATUS_NO_MEMORY;
goto out;
}
f = PANIC_IF_NULL(strlower_talloc(tmp_ctx, full));
f = strlower_talloc(tmp_ctx, full);
if (f == NULL) {
status = NT_STATUS_NO_MEMORY;
goto out_ctx_free;
}
string_replace(f, '\\', '/');
s = PANIC_IF_NULL(strlower_talloc(tmp_ctx, sub));
s = strlower_talloc(tmp_ctx, sub);
if (f == NULL) {
status = NT_STATUS_NO_MEMORY;
goto out_ctx_free;
}
string_replace(s, '\\', '/');
/* find the point where sub and full diverge */
@ -1498,25 +1519,33 @@ static bool is_subpath(const char *sub, const char *full)
}
if ((*f == '\0') && (*s == '\0')) {
return true; /* sub and full match */
*_subpath_match = true; /* sub and full match */
goto out_ctx_free;
}
if ((*f == '\0') && (len > 0) && (*(f - 1) == '/')) {
/* sub diverges from full at path separator */
return true;
*_subpath_match = true;
goto out_ctx_free;
}
if ((*s == '\0') && (strcmp(f, "/") == 0)) {
/* full diverges from sub with trailing slash only */
return true;
*_subpath_match = true;
goto out_ctx_free;
}
if ((*s == '/') && (*f == '\0')) {
/* sub diverges from full with extra path component */
return true;
*_subpath_match = true;
goto out_ctx_free;
}
*_subpath_match = false;
return false;
out_ctx_free:
talloc_free(tmp_ctx);
out:
return status;
}
/**