diff --no-index: use strbuf for temporary pathnames

Instead of using limited-length buffers and risking of pathname
truncation, we should be taking advantage of strbuf API nowadays.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2012-04-25 12:37:38 -07:00
parent 48e510b6a2
commit 875b91b35d

View File

@ -52,7 +52,7 @@ static int get_mode(const char *path, int *mode)
} }
static int queue_diff(struct diff_options *o, static int queue_diff(struct diff_options *o,
const char *name1, const char *name2) const char *name1, const char *name2)
{ {
int mode1 = 0, mode2 = 0; int mode1 = 0, mode2 = 0;
@ -63,10 +63,11 @@ static int queue_diff(struct diff_options *o,
return error("file/directory conflict: %s, %s", name1, name2); return error("file/directory conflict: %s, %s", name1, name2);
if (S_ISDIR(mode1) || S_ISDIR(mode2)) { if (S_ISDIR(mode1) || S_ISDIR(mode2)) {
char buffer1[PATH_MAX], buffer2[PATH_MAX]; struct strbuf buffer1 = STRBUF_INIT;
struct strbuf buffer2 = STRBUF_INIT;
struct string_list p1 = STRING_LIST_INIT_DUP; struct string_list p1 = STRING_LIST_INIT_DUP;
struct string_list p2 = STRING_LIST_INIT_DUP; struct string_list p2 = STRING_LIST_INIT_DUP;
int len1 = 0, len2 = 0, i1, i2, ret = 0; int i1, i2, ret = 0;
if (name1 && read_directory(name1, &p1)) if (name1 && read_directory(name1, &p1))
return -1; return -1;
@ -76,19 +77,15 @@ static int queue_diff(struct diff_options *o,
} }
if (name1) { if (name1) {
len1 = strlen(name1); strbuf_addstr(&buffer1, name1);
if (len1 > 0 && name1[len1 - 1] == '/') if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
len1--; strbuf_addch(&buffer1, '/');
memcpy(buffer1, name1, len1);
buffer1[len1++] = '/';
} }
if (name2) { if (name2) {
len2 = strlen(name2); strbuf_addstr(&buffer2, name2);
if (len2 > 0 && name2[len2 - 1] == '/') if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
len2--; strbuf_addch(&buffer2, '/');
memcpy(buffer2, name2, len2);
buffer2[len2++] = '/';
} }
for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) { for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
@ -100,31 +97,28 @@ static int queue_diff(struct diff_options *o,
else if (i2 == p2.nr) else if (i2 == p2.nr)
comp = -1; comp = -1;
else else
comp = strcmp(p1.items[i1].string, comp = strcmp(p1.items[i1].string, p2.items[i2].string);
p2.items[i2].string);
if (comp > 0) if (comp > 0)
n1 = NULL; n1 = NULL;
else { else {
n1 = buffer1; strbuf_addstr(&buffer1, p1.items[i1++].string);
strncpy(buffer1 + len1, p1.items[i1++].string, n1 = buffer1.buf;
PATH_MAX - len1);
buffer1[PATH_MAX-1] = 0;
} }
if (comp < 0) if (comp < 0)
n2 = NULL; n2 = NULL;
else { else {
n2 = buffer2; strbuf_addstr(&buffer2, p2.items[i2++].string);
strncpy(buffer2 + len2, p2.items[i2++].string, n2 = buffer2.buf;
PATH_MAX - len2);
buffer2[PATH_MAX-1] = 0;
} }
ret = queue_diff(o, n1, n2); ret = queue_diff(o, n1, n2);
} }
string_list_clear(&p1, 0); string_list_clear(&p1, 0);
string_list_clear(&p2, 0); string_list_clear(&p2, 0);
strbuf_reset(&buffer1);
strbuf_reset(&buffer2);
return ret; return ret;
} else { } else {