Re: [PATCH v2 63/94] builtin/apply: make apply_all_patches() return -1 on error
- From
Christian Couder <christian.couder@gmail.com>
- Date
- Jun 8, 2016, 16:37 UTC
- Message-ID
- <CAP8UFD2jA7ydsYTkQLbQJTW7NFRpkmJwgJQp=UZ0-8-7njSawA@mail.gmail.com>
- In-Reply-To
- <CAPig+cQAM8i2sFY9UUYfN23PRGgFacG7KiTD6mZwnm=PgKBL7A@mail.gmail.com>
On Mon, May 16, 2016 at 5:44 AM, Eric Sunshine <sunshine@sunshineco.com> wrote:
Show 26 quoted lines
> On Wed, May 11, 2016 at 9:17 AM, Christian Couder
> <christian.couder@gmail.com> wrote:
>> To finish libifying the apply functionality, apply_all_patches() should not
>> die() or exit() in case of error, but return -1.
>>
>> While doing that we must take care that file descriptors are properly closed
>> and, if needed, reset a sensible value.
>>
>> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
>> ---
>> diff --git a/builtin/apply.c b/builtin/apply.c
>> @@ -4613,9 +4613,10 @@ static int apply_all_patches(struct apply_state *state,
>> }
>>
>> if (state->update_index) {
>> - if (write_locked_index(&the_index, state->lock_file, COMMIT_LOCK))
>> - die(_("Unable to write new index file"));
>> + res = write_locked_index(&the_index, state->lock_file, COMMIT_LOCK);
>> state->newfd = -1;
>
> Does write_locked_index() unconditionally close the file descriptor
> even when an error occurs? If not, then isn't this potentially leaking
> 'newfd'?
>
> (My very cursory read of write_locked_index() seems to reveal that the
> file descriptor may indeed remain open upon index write failure.)You are right, it is leaking newfd if write_locked_index() fails. The solution to that is to call `rollback_lock_file(state->lock_file)` and the following patch was supposed to do that:
[PATCH v2 82/94] apply: roll back index lock file in case of error
but it would do that only if `state->newfd >= 0` so we should set state->newfd to -1 only if write_locked_index() succeeds.
I will fix this.
I am also going to add a comment to this patch saying that this patch needs a following patch to call rollback_lock_file(state->lock_file) in case of errors.
Or if you prefer, I can squash the patch that call rollback_lock_file(state->lock_file) in case of errors into this patch.
Thanks, Christian.