[Dovecot] CVS to Mercurial switch

Timo Sirainen tss at iki.fi
Sat May 19 23:33:23 EEST 2007


On Sat, 2007-05-19 at 22:31 +0300, Timo Sirainen wrote:
> > or Git?
> 
> It seems a bit kludgy with all of its different commands and scripts.
> Also I don't really like its code. It's using standard C functions for
> string manipulations and in general it's using a lot with fixed size
> buffers. If it wasn't written by kernel developers, I'd say it's most
> likely full of buffer overflows. But since it is (was?), perhaps there
> are only a few. I don't want to risk it.

Just out of curiosity I checked it. There are even basic string
manipulation errors in their code:

~/src/git-1.5.1% grep +=.*snprintf *.c
builtin-grep.c:                         len += snprintf(argptr, sizeof(randarg)-len,
builtin-grep.c:                         len += snprintf(argptr, sizeof(randarg)-len,
builtin-grep.c:                 len += snprintf(argptr, sizeof(randarg)-len,
commit.c:               i += snprintf(parents + i, sizeof(parents) - i - 1, " %s",
commit.c:               i += snprintf(parents + i, sizeof(parents) - i - 1, " %s",
diff.c:         len += snprintf(msg + len, sizeof(msg) - len,
diff.c:         len += snprintf(msg + len, sizeof(msg) - len,
diff.c:                 len += snprintf(msg + len, sizeof(msg) - len,
diff.c:         len += snprintf(msg + len, sizeof(msg) - len,
diff.c:                 len += snprintf(msg + len, sizeof(msg) - len,
diff.c:         len += snprintf(msg + len, sizeof(msg) - len, "\n");
path.c: len += vsnprintf(pathname + len, PATH_MAX - len, fmt, args);

Every single one of those is wrong. Linux kernel's snprintf() handles
code like this safely, but libc doesn't.

Possibly other snprintf() uses are wrong as well.

strncpy() then:
~/src/git-1.5.1% grep strncpy *.c    
builtin-log.c:                          strncpy(ref_message_id,
message_id,
builtin-shortlog.c:             strncpy(name, realname, maxlen);
diff-lib.c:                             strncpy(buffer1 + len1,
p1.items[i1++].path,
diff-lib.c:                             strncpy(buffer2 + len2,
p2.items[i2++].path,
fast-import.c:  strncpy(c->str_dat, s, len);
fast-import.c:  strncpy(ident, buf, name_len);
interpolate.c:                                  strncpy(dest, value,
valuelen);
trace.c:        strncpy(trace_str, format_str, format_len);
trace.c:        strncpy(trace_str + format_len, argv_str, argv_len);

correct, wrong, wrong, wrong, correct, correct

The last 3 are just stupid. They should be memcpy()s to make it clear
what they intend to do.

I don't even want to start verifying the correctness of sprintf() and
strcpy() calls.

Wonder if I should have Cc'd this to git list. Oh well, someone else can
if they care.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://dovecot.org/pipermail/dovecot/attachments/20070519/f13a8217/attachment.pgp 


More information about the dovecot mailing list