@ -3704,7 +3704,7 @@ static int path_is_beyond_symlink(struct apply_state *state, const char *name_)
return ret;
return ret;
}
}
static void die_on_unsafe_path(struct patch *patch)
static int check_unsafe_path(struct patch *patch)
{
{
const char *old_name = NULL;
const char *old_name = NULL;
const char *new_name = NULL;
const char *new_name = NULL;
@ -3716,9 +3716,10 @@ static void die_on_unsafe_path(struct patch *patch)
new_name = patch->new_name;
new_name = patch->new_name;
if (old_name && !verify_path(old_name))
if (old_name && !verify_path(old_name))
die(_("invalid path '%s'"), old_name);
return error(_("invalid path '%s'"), old_name);
if (new_name && !verify_path(new_name))
if (new_name && !verify_path(new_name))
die(_("invalid path '%s'"), new_name);
return error(_("invalid path '%s'"), new_name);
return 0;
}
}
/*
/*
@ -3808,8 +3809,8 @@ static int check_patch(struct apply_state *state, struct patch *patch)
}
}
}
}
if (!state->unsafe_paths)
if (!state->unsafe_paths && check_unsafe_path(patch))
die_on_unsafe_path(patch);
return -128;
/*
/*
* An attempt to read from or delete a path that is beyond a
* An attempt to read from or delete a path that is beyond a
@ -3837,10 +3838,14 @@ static int check_patch_list(struct apply_state *state, struct patch *patch)
prepare_symlink_changes(state, patch);
prepare_symlink_changes(state, patch);
prepare_fn_table(state, patch);
prepare_fn_table(state, patch);
while (patch) {
while (patch) {
int res;
if (state->apply_verbosely)
if (state->apply_verbosely)
say_patch_name(stderr,
say_patch_name(stderr,
_("Checking patch %s..."), patch);
_("Checking patch %s..."), patch);
err |= check_patch(state, patch);
res = check_patch(state, patch);
if (res == -128)
return -128;
err |= res;
patch = patch->next;
patch = patch->next;
}
}
return err;
return err;
@ -4472,12 +4477,17 @@ static int apply_patch(struct apply_state *state,
goto end;
goto end;
}
}
if ((state->check || state->apply) &&
if (state->check || state->apply) {
check_patch_list(state, list) < 0 &&
int r = check_patch_list(state, list);
!state->apply_with_reject) {
if (r == -128) {
res = -128;
goto end;
}
if (r < 0 && !state->apply_with_reject) {
res = -1;
res = -1;
goto end;
goto end;
}
}
}
if (state->apply && write_out_results(state, list)) {
if (state->apply && write_out_results(state, list)) {
/* with --3way, we still need to write the index out */
/* with --3way, we still need to write the index out */