* [PATCH] GSoC2014 Microproject rewrite finish_bulk_checkin()
@ 2014-02-27 19:02 Faiz Kothari
2014-02-27 22:17 ` Michael Haggerty
0 siblings, 1 reply; 3+ messages in thread
From: Faiz Kothari @ 2014-02-27 19:02 UTC (permalink / raw)
To: git; +Cc: Faiz Kothari
Signed-off-by: Faiz Kothari <faiz.off93@gmail.com>
---
bulk-checkin.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/bulk-checkin.c b/bulk-checkin.c
index 118c625..feeff9f 100644
--- a/bulk-checkin.c
+++ b/bulk-checkin.c
@@ -23,7 +23,7 @@ static struct bulk_checkin_state {
static void finish_bulk_checkin(struct bulk_checkin_state *state)
{
unsigned char sha1[20];
- char packname[PATH_MAX];
+ struct strbuf packname;
int i;
if (!state->f)
@@ -42,9 +42,11 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
state->offset);
close(fd);
}
-
- sprintf(packname, "%s/pack/pack-", get_object_directory());
- finish_tmp_packfile(packname, state->pack_tmp_name,
+
+ packname.len = packname.alloc = 64 + strlen(get_object_directory());
+ packname.buf = (char *)malloc(packname.len * sizeof(char));
+ sprintf(packname.buf, "%s/pack/pack-", get_object_directory());
+ finish_tmp_packfile(packname.buf, state->pack_tmp_name,
state->written, state->nr_written,
&state->pack_idx_opts, sha1);
for (i = 0; i < state->nr_written; i++)
@@ -53,7 +55,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
clear_exit:
free(state->written);
memset(state, 0, sizeof(*state));
-
+ free(packname.buf);
/* Make objects we just wrote available to ourselves */
reprepare_packed_git();
}
--
1.7.9.5
> Rewrite bulk-checkin.c:finish_bulk_checkin() to use a strbuf for handling packname, and explain why this is useful.
> Also check if the first argument of pack-write.c:finish_tmp_packfile() can be made const.
Adding 64 to strlen(get_object_directory()) to accomodate sha1_to_hex(sha1) and itself.
Using the APIs for strbuf is giving me test failures(12/15) during t1050-large.sh
So, I used the malloc() and free() instead.
Instead of having packname on stack and cause stackoverflow because of MAX_PATH ~ 4KB, have it on heap.
Can have first parameter to pack-write.c:finish_tmp_packfile() as const because packname is not required to be modified.
I apologise for my two earlier patches not being in proper format. I have finally got it working properly. Will make sure,
it does not happen again.
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] GSoC2014 Microproject rewrite finish_bulk_checkin()
2014-02-27 19:02 [PATCH] GSoC2014 Microproject rewrite finish_bulk_checkin() Faiz Kothari
@ 2014-02-27 22:17 ` Michael Haggerty
2014-02-27 22:35 ` Faiz Kothari
0 siblings, 1 reply; 3+ messages in thread
From: Michael Haggerty @ 2014-02-27 22:17 UTC (permalink / raw)
To: Faiz Kothari; +Cc: git
On 02/27/2014 08:02 PM, Faiz Kothari wrote:
> Signed-off-by: Faiz Kothari <faiz.off93@gmail.com>
> ---
> bulk-checkin.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/bulk-checkin.c b/bulk-checkin.c
> index 118c625..feeff9f 100644
> --- a/bulk-checkin.c
> +++ b/bulk-checkin.c
> @@ -23,7 +23,7 @@ static struct bulk_checkin_state {
> static void finish_bulk_checkin(struct bulk_checkin_state *state)
> {
> unsigned char sha1[20];
> - char packname[PATH_MAX];
> + struct strbuf packname;
> int i;
>
> if (!state->f)
> @@ -42,9 +42,11 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
> state->offset);
> close(fd);
> }
> -
> - sprintf(packname, "%s/pack/pack-", get_object_directory());
> - finish_tmp_packfile(packname, state->pack_tmp_name,
> +
> + packname.len = packname.alloc = 64 + strlen(get_object_directory());
> + packname.buf = (char *)malloc(packname.len * sizeof(char));
> + sprintf(packname.buf, "%s/pack/pack-", get_object_directory());
> + finish_tmp_packfile(packname.buf, state->pack_tmp_name,
> state->written, state->nr_written,
> &state->pack_idx_opts, sha1);
> for (i = 0; i < state->nr_written; i++)
> @@ -53,7 +55,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
> clear_exit:
> free(state->written);
> memset(state, 0, sizeof(*state));
> -
> + free(packname.buf);
> /* Make objects we just wrote available to ourselves */
> reprepare_packed_git();
> }
> -- 1.7.9.5
>> Rewrite bulk-checkin.c:finish_bulk_checkin() to use a strbuf for handling packname, and explain why this is useful.
>> Also check if the first argument of pack-write.c:finish_tmp_packfile() can be made const.
>
> Adding 64 to strlen(get_object_directory()) to accomodate sha1_to_hex(sha1) and itself.
> Using the APIs for strbuf is giving me test failures(12/15) during t1050-large.sh
> So, I used the malloc() and free() instead.
This is not OK. I promise you, the strbuf API works correctly if it is
used correctly. (And if it really *were* broken, you should fix the
problem or at least diagnose and document it rather than working around it.)
> Instead of having packname on stack and cause stackoverflow because of MAX_PATH ~ 4KB, have it on heap.
> Can have first parameter to pack-write.c:finish_tmp_packfile() as const because packname is not required to be modified.
>
> I apologise for my two earlier patches not being in proper format. I have finally got it working properly. Will make sure,
> it does not happen again.
Almost. This last set of comments should be moved to directly after the
"---" line.
But: please rather stick to *one* microproject and get it perfect, and
leave the others to other students.
Michael
--
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] GSoC2014 Microproject rewrite finish_bulk_checkin()
2014-02-27 22:17 ` Michael Haggerty
@ 2014-02-27 22:35 ` Faiz Kothari
0 siblings, 0 replies; 3+ messages in thread
From: Faiz Kothari @ 2014-02-27 22:35 UTC (permalink / raw)
To: Michael Haggerty; +Cc: git
Hi,
Thanks for the remarks.
I'll stick to this micro project and follow the guidelines.
Yes, the strbuf API is perfectly OK. I was not getting to work it
properly, so I used malloc() / free() instead. My bad.
I'll resubmit the patch.
Thanks.
On Fri, Feb 28, 2014 at 3:47 AM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
> On 02/27/2014 08:02 PM, Faiz Kothari wrote:
>> Signed-off-by: Faiz Kothari <faiz.off93@gmail.com>
>> ---
>> bulk-checkin.c | 12 +++++++-----
>> 1 file changed, 7 insertions(+), 5 deletions(-)
>>
>> diff --git a/bulk-checkin.c b/bulk-checkin.c
>> index 118c625..feeff9f 100644
>> --- a/bulk-checkin.c
>> +++ b/bulk-checkin.c
>> @@ -23,7 +23,7 @@ static struct bulk_checkin_state {
>> static void finish_bulk_checkin(struct bulk_checkin_state *state)
>> {
>> unsigned char sha1[20];
>> - char packname[PATH_MAX];
>> + struct strbuf packname;
>> int i;
>>
>> if (!state->f)
>> @@ -42,9 +42,11 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
>> state->offset);
>> close(fd);
>> }
>> -
>> - sprintf(packname, "%s/pack/pack-", get_object_directory());
>> - finish_tmp_packfile(packname, state->pack_tmp_name,
>> +
>> + packname.len = packname.alloc = 64 + strlen(get_object_directory());
>> + packname.buf = (char *)malloc(packname.len * sizeof(char));
>> + sprintf(packname.buf, "%s/pack/pack-", get_object_directory());
>> + finish_tmp_packfile(packname.buf, state->pack_tmp_name,
>> state->written, state->nr_written,
>> &state->pack_idx_opts, sha1);
>> for (i = 0; i < state->nr_written; i++)
>> @@ -53,7 +55,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
>> clear_exit:
>> free(state->written);
>> memset(state, 0, sizeof(*state));
>> -
>> + free(packname.buf);
>> /* Make objects we just wrote available to ourselves */
>> reprepare_packed_git();
>> }
>> -- 1.7.9.5
>>> Rewrite bulk-checkin.c:finish_bulk_checkin() to use a strbuf for handling packname, and explain why this is useful.
>>> Also check if the first argument of pack-write.c:finish_tmp_packfile() can be made const.
>>
>> Adding 64 to strlen(get_object_directory()) to accomodate sha1_to_hex(sha1) and itself.
>> Using the APIs for strbuf is giving me test failures(12/15) during t1050-large.sh
>> So, I used the malloc() and free() instead.
>
> This is not OK. I promise you, the strbuf API works correctly if it is
> used correctly. (And if it really *were* broken, you should fix the
> problem or at least diagnose and document it rather than working around it.)
>
>> Instead of having packname on stack and cause stackoverflow because of MAX_PATH ~ 4KB, have it on heap.
>> Can have first parameter to pack-write.c:finish_tmp_packfile() as const because packname is not required to be modified.
>>
>> I apologise for my two earlier patches not being in proper format. I have finally got it working properly. Will make sure,
>> it does not happen again.
>
> Almost. This last set of comments should be moved to directly after the
> "---" line.
>
> But: please rather stick to *one* microproject and get it perfect, and
> leave the others to other students.
>
> Michael
>
> --
> Michael Haggerty
> mhagger@alum.mit.edu
> http://softwareswirl.blogspot.com/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-02-27 22:35 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-02-27 19:02 [PATCH] GSoC2014 Microproject rewrite finish_bulk_checkin() Faiz Kothari
2014-02-27 22:17 ` Michael Haggerty
2014-02-27 22:35 ` Faiz Kothari
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).