From: Junio C Hamano <gitster@pobox.com>
To: Alexander Potashev <aspotashev@gmail.com>
Cc: Git Mailing List <git@vger.kernel.org>
Subject: Re: [RFC PATCH] builtin-apply: prevent non-explicit permission changes
Date: Thu, 01 Jan 2009 16:56:11 -0800 [thread overview]
Message-ID: <7v3ag2frv8.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <20090101221720.GA5603@myhost> (Alexander Potashev's message of "Fri, 2 Jan 2009 01:17:20 +0300")
Alexander Potashev <aspotashev@gmail.com> writes:
> On 05:00 Thu 01 Jan , Junio C Hamano wrote:
>> Alexander Potashev <aspotashev@gmail.com> writes:
> ...
>> > @@ -2447,6 +2447,7 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
>> > if (st_mode != patch->old_mode)
>> > fprintf(stderr, "warning: %s has type %o, expected %o\n",
>> > old_name, st_mode, patch->old_mode);
>> > + patch->new_mode = st_mode;
>>
>> Can you do this unconditionally, overwriting whatever we read from the
>> patch header metainfo lines?
>
> Do you mean overwriting of 'patch->new_mode' right after patch parsing?
My question was if we should assign st_mode to new_mode _unconditionally_
here, even when patch->new_mode has already been read from the explicit
mode change line (i.e. "new mode ", line not "index "line) of the patch
input.
The call-chain of the program looks like this:
-> apply_patch()
-> parse_chunk()
-> find_header()
* initialize new_mode and old_mode to 0
-> parse_git_header()
* set new_mode and old_mode from the patch metainfo, i.e.
"new mode", "old mode" and "index" lines.
-> parse_single_patch()
-> check_patch_list()
-> check_patch()
-> check_preimage()
* make sure there is no local mods
* warn if old_mode read from the patch (i.e. the preimage file
the patch submitter used to prepare the patch against) does not
match what we have
* warn about mode inconsistency (e.g. the patch submitter thinks
the mode should be 0644 but our tree has 0755).
-> apply_data()
-> write_out_results()
-> write_out_one_result(0)
* delete old
-> write_out_one_result(1)
* create new
Currently the mode 100644 on the "index" line in a patch is handled
exactly in the same way as having "old mode 100644" and "new mode 100644"
lines in the metainfo. The patch submitter claims to have started from
100644 and he claims that he wants to have 100644 as the result. That is
why there is a warning in check_patch().
If we stop reading the new mode from the "index" line (but we still read
"old_mode" there) without any other change you made in your patch, what
breaks (i.e. without the patch->new_mode assignment hunk)? I haven't
followed the codepath too closely, and I suspect you found some cases
where new_mode stays 0 as initialized, and that may be the reason you have
this assignment.
But the assignment being unconditional bothered me a lot.
I tend to agree that the current "The final mode bits I want to have on
this path is this" semantics we give to the "index" line is much less
useful and less sane and it is a good idea to redefine it as "FYI, the
copy I made this patch against had this mode bits. I do not intend to
change the mode bits of the path with this patch."
builtin-apply.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git c/builtin-apply.c w/builtin-apply.c
index 07244b0..a8f75ed 100644
--- c/builtin-apply.c
+++ w/builtin-apply.c
@@ -630,7 +630,7 @@ static int gitdiff_index(const char *line, struct patch *patch)
memcpy(patch->new_sha1_prefix, line, len);
patch->new_sha1_prefix[len] = 0;
if (*ptr == ' ')
- patch->new_mode = patch->old_mode = strtoul(ptr+1, NULL, 8);
+ patch->old_mode = strtoul(ptr+1, NULL, 8);
return 0;
}
@@ -2447,6 +2447,8 @@ static int check_preimage(struct patch *patch, struct cache_entry **ce, struct s
if (st_mode != patch->old_mode)
fprintf(stderr, "warning: %s has type %o, expected %o\n",
old_name, st_mode, patch->old_mode);
+ if (!patch->new_mode)
+ patch->new_mode = st_mode;
return 0;
is_new:
next prev parent reply other threads:[~2009-01-02 0:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-12-30 23:53 [RFC PATCH] builtin-apply: prevent non-explicit permission changes Alexander Potashev
2009-01-01 13:00 ` Junio C Hamano
2009-01-01 22:17 ` Alexander Potashev
2009-01-02 0:56 ` Junio C Hamano [this message]
2009-01-02 13:37 ` Alexander Potashev
2009-01-02 10:55 ` Junio C Hamano
2009-01-02 17:35 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7v3ag2frv8.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=aspotashev@gmail.com \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).