Browse Source

Make sure we do not write bogus reflog entries.

The file format dictates that entries are LF terminated so
the message cannot have one in it.  Chomp the message to make
sure it only has a single line if necessary, while removing the
leading whitespace.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 18 years ago
parent
commit
8ac65937d0
  1. 2
      builtin-update-ref.c
  2. 39
      refs.c

2
builtin-update-ref.c

@ -23,8 +23,6 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix) @@ -23,8 +23,6 @@ int cmd_update_ref(int argc, const char **argv, const char *prefix)
msg = argv[++i];
if (!*msg)
die("Refusing to perform update with empty message.");
if (strchr(msg, '\n'))
die("Refusing to perform update with \\n in message.");
continue;
}
if (!strcmp("-d", argv[i])) {

39
refs.c

@ -925,6 +925,7 @@ static int log_ref_write(struct ref_lock *lock, @@ -925,6 +925,7 @@ static int log_ref_write(struct ref_lock *lock,
{
int logfd, written, oflags = O_APPEND | O_WRONLY;
unsigned maxlen, len;
int msglen;
char *logrec;
const char *committer;

@ -958,24 +959,30 @@ static int log_ref_write(struct ref_lock *lock, @@ -958,24 +959,30 @@ static int log_ref_write(struct ref_lock *lock,
lock->log_file, strerror(errno));
}

committer = git_committer_info(-1);
msglen = 0;
if (msg) {
maxlen = strlen(committer) + strlen(msg) + 2*40 + 5;
logrec = xmalloc(maxlen);
len = snprintf(logrec, maxlen, "%s %s %s\t%s\n",
sha1_to_hex(lock->old_sha1),
sha1_to_hex(sha1),
committer,
msg);
}
else {
maxlen = strlen(committer) + 2*40 + 4;
logrec = xmalloc(maxlen);
len = snprintf(logrec, maxlen, "%s %s %s\n",
sha1_to_hex(lock->old_sha1),
sha1_to_hex(sha1),
committer);
/* clean up the message and make sure it is a single line */
for ( ; *msg; msg++)
if (!isspace(*msg))
break;
if (*msg) {
const char *ep = strchr(msg, '\n');
if (ep)
msglen = ep - msg;
else
msglen = strlen(msg);
}
}

committer = git_committer_info(-1);
maxlen = strlen(committer) + msglen + 100;
logrec = xmalloc(maxlen);
len = sprintf(logrec, "%s %s %s\n",
sha1_to_hex(lock->old_sha1),
sha1_to_hex(sha1),
committer);
if (msglen)
len += sprintf(logrec + len - 1, "\t%.*s\n", msglen, msg) - 1;
written = len <= maxlen ? write_in_full(logfd, logrec, len) : -1;
free(logrec);
close(logfd);

Loading…
Cancel
Save