@ -1419,6 +1419,14 @@ static int parse_fragment_header(const char *line, int len, struct fragment *fra
return offset;
return offset;
}
}
/*
* Find file diff header
*
* Returns:
* -1 if no header was found
* -128 in case of error
* the size of the header in bytes (called "offset") otherwise
*/
static int find_header(struct apply_state *state,
static int find_header(struct apply_state *state,
const char *line,
const char *line,
unsigned long size,
unsigned long size,
@ -1452,8 +1460,9 @@ static int find_header(struct apply_state *state,
struct fragment dummy;
struct fragment dummy;
if (parse_fragment_header(line, len, &dummy) < 0)
if (parse_fragment_header(line, len, &dummy) < 0)
continue;
continue;
die(_("patch fragment without header at line %d: %.*s"),
error(_("patch fragment without header at line %d: %.*s"),
state->linenr, (int)len-1, line);
state->linenr, (int)len-1, line);
return -128;
}
}
if (size < len + 6)
if (size < len + 6)
@ -1468,19 +1477,23 @@ static int find_header(struct apply_state *state,
if (git_hdr_len <= len)
if (git_hdr_len <= len)
continue;
continue;
if (!patch->old_name && !patch->new_name) {
if (!patch->old_name && !patch->new_name) {
if (!patch->def_name)
if (!patch->def_name) {
die(Q_("git diff header lacks filename information when removing "
error(Q_("git diff header lacks filename information when removing "
"%d leading pathname component (line %d)",
"%d leading pathname component (line %d)",
"git diff header lacks filename information when removing "
"git diff header lacks filename information when removing "
"%d leading pathname components (line %d)",
"%d leading pathname components (line %d)",
state->p_value),
state->p_value),
state->p_value, state->linenr);
state->p_value, state->linenr);
return -128;
}
patch->old_name = xstrdup(patch->def_name);
patch->old_name = xstrdup(patch->def_name);
patch->new_name = xstrdup(patch->def_name);
patch->new_name = xstrdup(patch->def_name);
}
}
if (!patch->is_delete && !patch->new_name)
if (!patch->is_delete && !patch->new_name) {
die("git diff header lacks filename information "
error("git diff header lacks filename information "
"(line %d)", state->linenr);
"(line %d)", state->linenr);
return -128;
}
patch->is_toplevel_relative = 1;
patch->is_toplevel_relative = 1;
*hdrsize = git_hdr_len;
*hdrsize = git_hdr_len;
return offset;
return offset;
@ -1996,6 +2009,9 @@ static int parse_chunk(struct apply_state *state, char *buffer, unsigned long si
int hdrsize, patchsize;
int hdrsize, patchsize;
int offset = find_header(state, buffer, size, &hdrsize, patch);
int offset = find_header(state, buffer, size, &hdrsize, patch);
if (offset == -128)
exit(128);
if (offset < 0)
if (offset < 0)
return offset;
return offset;