Skip to content

Commit 3c144af

Browse files
author
Junio C Hamano
committed
Merge branch 'fix'
* fix: fix pack-object buffer size mailinfo: decode underscore used in "Q" encoding properly. Reintroduce svn pools to solve the memory leak. pack-objects: do not stop at object that is "too small"
2 parents 0080f50 + 0dec30b commit 3c144af

File tree

3 files changed

+12
-8
lines changed

3 files changed

+12
-8
lines changed

git-svnimport.perl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,10 @@ sub file {
136136

137137
print "... $rev $path ...\n" if $opt_v;
138138
my (undef, $properties);
139+
my $pool = SVN::Pool->new();
139140
eval { (undef, $properties)
140-
= $self->{'svn'}->get_file($path,$rev,$fh); };
141+
= $self->{'svn'}->get_file($path,$rev,$fh,$pool); };
142+
$pool->clear;
141143
if($@) {
142144
return undef if $@ =~ /Attempted to get checksum/;
143145
die $@;

mailinfo.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ static unsigned hexval(int c)
405405
return ~0;
406406
}
407407

408-
static int decode_q_segment(char *in, char *ot, char *ep)
408+
static int decode_q_segment(char *in, char *ot, char *ep, int rfc2047)
409409
{
410410
int c;
411411
while ((c = *in++) != 0 && (in <= ep)) {
@@ -414,9 +414,11 @@ static int decode_q_segment(char *in, char *ot, char *ep)
414414
if (d == '\n' || !d)
415415
break; /* drop trailing newline */
416416
*ot++ = ((hexval(d) << 4) | hexval(*in++));
417+
continue;
417418
}
418-
else
419-
*ot++ = c;
419+
if (rfc2047 && c == '_') /* rfc2047 4.2 (2) */
420+
c = 0x20;
421+
*ot++ = c;
420422
}
421423
*ot = 0;
422424
return 0;
@@ -547,7 +549,7 @@ static void decode_header_bq(char *it)
547549
sz = decode_b_segment(cp + 3, piecebuf, ep);
548550
break;
549551
case 'q':
550-
sz = decode_q_segment(cp + 3, piecebuf, ep);
552+
sz = decode_q_segment(cp + 3, piecebuf, ep, 1);
551553
break;
552554
}
553555
if (sz < 0)
@@ -569,7 +571,7 @@ static void decode_transfer_encoding(char *line)
569571
switch (transfer_encoding) {
570572
case TE_QP:
571573
ep = line + strlen(line);
572-
decode_q_segment(line, line, ep);
574+
decode_q_segment(line, line, ep, 0);
573575
break;
574576
case TE_BASE64:
575577
ep = line + strlen(line);

pack-objects.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
10521052
if (cur_entry->delta)
10531053
max_size = cur_entry->delta_size-1;
10541054
if (sizediff >= max_size)
1055-
return -1;
1055+
return 0;
10561056
delta_buf = diff_delta(old->data, oldsize,
10571057
cur->data, size, &delta_size, max_size);
10581058
if (!delta_buf)
@@ -1231,7 +1231,7 @@ static void setup_progress_signal(void)
12311231
int main(int argc, char **argv)
12321232
{
12331233
SHA_CTX ctx;
1234-
char line[PATH_MAX + 20];
1234+
char line[40 + 1 + PATH_MAX + 2];
12351235
int window = 10, depth = 10, pack_to_stdout = 0;
12361236
struct object_entry **list;
12371237
int num_preferred_base = 0;

0 commit comments

Comments
 (0)