Skip to content

Commit 5889271

Browse files
sunheehnusgitster
authored andcommitted
finish_tmp_packfile():use strbuf for pathname construction
The old version fixes a maximum length on the buffer, which could be a problem if one is not certain of the length of get_object_directory(). Using strbuf can avoid the protential bug. Helped-by: Michael Haggerty <mhagger@alum.mit.edu> Helped-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Sun He <sunheehnus@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
1 parent 2156a98 commit 5889271

File tree

4 files changed

+22
-21
lines changed

4 files changed

+22
-21
lines changed

builtin/pack-objects.c

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -803,7 +803,7 @@ static void write_pack_file(void)
803803

804804
if (!pack_to_stdout) {
805805
struct stat st;
806-
char tmpname[PATH_MAX];
806+
struct strbuf tmpname = STRBUF_INIT;
807807

808808
/*
809809
* Packs are runtime accessed in their mtime
@@ -826,23 +826,19 @@ static void write_pack_file(void)
826826
pack_tmp_name, strerror(errno));
827827
}
828828

829-
/* Enough space for "-<sha-1>.pack"? */
830-
if (sizeof(tmpname) <= strlen(base_name) + 50)
831-
die("pack base name '%s' too long", base_name);
832-
snprintf(tmpname, sizeof(tmpname), "%s-", base_name);
829+
strbuf_addf(&tmpname, "%s-", base_name);
833830

834831
if (write_bitmap_index) {
835832
bitmap_writer_set_checksum(sha1);
836833
bitmap_writer_build_type_index(written_list, nr_written);
837834
}
838835

839-
finish_tmp_packfile(tmpname, pack_tmp_name,
836+
finish_tmp_packfile(&tmpname, pack_tmp_name,
840837
written_list, nr_written,
841838
&pack_idx_opts, sha1);
842839

843840
if (write_bitmap_index) {
844-
char *end_of_name_prefix = strrchr(tmpname, 0);
845-
sprintf(end_of_name_prefix, "%s.bitmap", sha1_to_hex(sha1));
841+
strbuf_addf(&tmpname, "%s.bitmap", sha1_to_hex(sha1));
846842

847843
stop_progress(&progress_state);
848844

@@ -851,10 +847,11 @@ static void write_pack_file(void)
851847
bitmap_writer_select_commits(indexed_commits, indexed_commits_nr, -1);
852848
bitmap_writer_build(&to_pack);
853849
bitmap_writer_finish(written_list, nr_written,
854-
tmpname, write_bitmap_options);
850+
tmpname.buf, write_bitmap_options);
855851
write_bitmap_index = 0;
856852
}
857853

854+
strbuf_release(&tmpname);
858855
free(pack_tmp_name);
859856
puts(sha1_to_hex(sha1));
860857
}

bulk-checkin.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "bulk-checkin.h"
55
#include "csum-file.h"
66
#include "pack.h"
7+
#include "strbuf.h"
78

89
static int pack_compression_level = Z_DEFAULT_COMPRESSION;
910

@@ -23,7 +24,7 @@ static struct bulk_checkin_state {
2324
static void finish_bulk_checkin(struct bulk_checkin_state *state)
2425
{
2526
unsigned char sha1[20];
26-
char packname[PATH_MAX];
27+
struct strbuf packname = STRBUF_INIT;
2728
int i;
2829

2930
if (!state->f)
@@ -43,8 +44,8 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
4344
close(fd);
4445
}
4546

46-
sprintf(packname, "%s/pack/pack-", get_object_directory());
47-
finish_tmp_packfile(packname, state->pack_tmp_name,
47+
strbuf_addf(&packname, "%s/pack/pack-", get_object_directory());
48+
finish_tmp_packfile(&packname, state->pack_tmp_name,
4849
state->written, state->nr_written,
4950
&state->pack_idx_opts, sha1);
5051
for (i = 0; i < state->nr_written; i++)
@@ -54,6 +55,7 @@ static void finish_bulk_checkin(struct bulk_checkin_state *state)
5455
free(state->written);
5556
memset(state, 0, sizeof(*state));
5657

58+
strbuf_release(&packname);
5759
/* Make objects we just wrote available to ourselves */
5860
reprepare_packed_git();
5961
}

pack-write.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -336,15 +336,15 @@ struct sha1file *create_tmp_packfile(char **pack_tmp_name)
336336
return sha1fd(fd, *pack_tmp_name);
337337
}
338338

339-
void finish_tmp_packfile(char *name_buffer,
339+
void finish_tmp_packfile(struct strbuf *name_buffer,
340340
const char *pack_tmp_name,
341341
struct pack_idx_entry **written_list,
342342
uint32_t nr_written,
343343
struct pack_idx_option *pack_idx_opts,
344344
unsigned char sha1[])
345345
{
346346
const char *idx_tmp_name;
347-
char *end_of_name_prefix = strrchr(name_buffer, 0);
347+
int basename_len = name_buffer->len;
348348

349349
if (adjust_shared_perm(pack_tmp_name))
350350
die_errno("unable to make temporary pack file readable");
@@ -354,17 +354,19 @@ void finish_tmp_packfile(char *name_buffer,
354354
if (adjust_shared_perm(idx_tmp_name))
355355
die_errno("unable to make temporary index file readable");
356356

357-
sprintf(end_of_name_prefix, "%s.pack", sha1_to_hex(sha1));
358-
free_pack_by_name(name_buffer);
357+
strbuf_addf(name_buffer, "%s.pack", sha1_to_hex(sha1));
358+
free_pack_by_name(name_buffer->buf);
359359

360-
if (rename(pack_tmp_name, name_buffer))
360+
if (rename(pack_tmp_name, name_buffer->buf))
361361
die_errno("unable to rename temporary pack file");
362362

363-
sprintf(end_of_name_prefix, "%s.idx", sha1_to_hex(sha1));
364-
if (rename(idx_tmp_name, name_buffer))
363+
strbuf_setlen(name_buffer, basename_len);
364+
365+
strbuf_addf(name_buffer, "%s.idx", sha1_to_hex(sha1));
366+
if (rename(idx_tmp_name, name_buffer->buf))
365367
die_errno("unable to rename temporary index file");
366368

367-
*end_of_name_prefix = '\0';
369+
strbuf_setlen(name_buffer, basename_len);
368370

369371
free((void *)idx_tmp_name);
370372
}

pack.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,6 @@ extern int encode_in_pack_object_header(enum object_type, uintmax_t, unsigned ch
9191
extern int read_pack_header(int fd, struct pack_header *);
9292

9393
extern struct sha1file *create_tmp_packfile(char **pack_tmp_name);
94-
extern void finish_tmp_packfile(char *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]);
94+
extern void finish_tmp_packfile(struct strbuf *name_buffer, const char *pack_tmp_name, struct pack_idx_entry **written_list, uint32_t nr_written, struct pack_idx_option *pack_idx_opts, unsigned char sha1[]);
9595

9696
#endif

0 commit comments

Comments
 (0)