From: "Jörg Sommer" <joerg@alea.gnuu.de>
To: git@vger.kernel.org
Cc: gitster@pobox.com, spearce@spearce.org,
"Jörg Sommer" <joerg@alea.gnuu.de>
Subject: [PATCH v2] Make mark parsing much more restrictive
Date: Fri, 25 Apr 2008 11:04:24 +0200 [thread overview]
Message-ID: <1209114264-10742-1-git-send-email-joerg@alea.gnuu.de> (raw)
In-Reply-To: <20080422231515.GJ29771@spearce.org>
The current implementation of mark parsing doesn't care for trailing
garbage like in :12a and doesn't check for unsigned numbers, i.e. it
accepts :-12 as a valid mark.
This patch enforces a number follows the colon and there comes nothing
after the bignum.
Signed-off-by: Jörg Sommer <joerg@alea.gnuu.de>
---
fast-import.c | 49 ++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 38 insertions(+), 11 deletions(-)
"Shawn O. Pearce" <spearce@spearce.org> wrote:
> Jrg Sommer <joerg@alea.gnuu.de> wrote:
> >
> > Another question: Is :0 a valid mark? In import_marks() is a check for
> > !mark, but I haven't seen it anywhere else.
>
> No, in fast-import ":0" is _not_ a valid mark.
Then I propose the following patch.
diff --git a/fast-import.c b/fast-import.c
index 73e5439..0c71da8 100644
--- a/fast-import.c
+++ b/fast-import.c
@@ -1690,12 +1690,31 @@ static void skip_optional_lf(void)
ungetc(term_char, stdin);
}
+static inline uintmax_t parse_mark(const const char *str, char **after_mark)
+{
+ char *am;
+ uintmax_t m;
+
+ if (!str || str[0] != ':' || !isdigit(str[1]))
+ return 0;
+
+ m = strtoumax(&str[1], &am, 10);
+ if (m != UINTMAX_MAX || errno == 0) {
+ *after_mark = am;
+ return m;
+ }
+ return 0;
+}
+
static void cmd_mark(void)
{
- if (!prefixcmp(command_buf.buf, "mark :")) {
- next_mark = strtoumax(command_buf.buf + 6, NULL, 10);
+ uintmax_t mark;
+ char *after_mark = NULL;
+
+ if (!prefixcmp(command_buf.buf, "mark ") &&
+ (next_mark = parse_mark(&command_buf.buf[5], &after_mark)) &&
+ *after_mark == '\0')
read_next_command();
- }
else
next_mark = 0;
}
@@ -1877,8 +1896,8 @@ static void file_change_m(struct branch *b)
}
if (*p == ':') {
- char *x;
- oe = find_mark(strtoumax(p + 1, &x, 10));
+ char *x = NULL;
+ oe = find_mark(parse_mark(p, &x));
hashcpy(sha1, oe->sha1);
p = x;
} else if (!prefixcmp(p, "inline")) {
@@ -2045,7 +2064,10 @@ static int cmd_from(struct branch *b)
hashcpy(b->branch_tree.versions[0].sha1, t);
hashcpy(b->branch_tree.versions[1].sha1, t);
} else if (*from == ':') {
- uintmax_t idnum = strtoumax(from + 1, NULL, 10);
+ char *after_mark;
+ uintmax_t idnum = parse_mark(from, &after_mark);
+ if (!idnum || *after_mark != '\0')
+ die("Not a valid mark: %s", from);
struct object_entry *oe = find_mark(idnum);
if (oe->type != OBJ_COMMIT)
die("Mark :%" PRIuMAX " not a commit", idnum);
@@ -2080,7 +2102,10 @@ static struct hash_list *cmd_merge(unsigned int *count)
if (s)
hashcpy(n->sha1, s->sha1);
else if (*from == ':') {
- uintmax_t idnum = strtoumax(from + 1, NULL, 10);
+ char *after_mark;
+ uintmax_t idnum = parse_mark(from, &after_mark);
+ if (!idnum || *after_mark != '\0')
+ die("Not a valid mark: %s", from);
struct object_entry *oe = find_mark(idnum);
if (oe->type != OBJ_COMMIT)
die("Mark :%" PRIuMAX " not a commit", idnum);
@@ -2228,7 +2253,10 @@ static void cmd_new_tag(void)
hashcpy(sha1, s->sha1);
} else if (*from == ':') {
struct object_entry *oe;
- from_mark = strtoumax(from + 1, NULL, 10);
+ char *after_mark;
+ from_mark = parse_mark(from, &after_mark);
+ if (!from_mark || *after_mark != '\0')
+ die("Not a valid mark: %s", from);
oe = find_mark(from_mark);
if (oe->type != OBJ_COMMIT)
die("Mark :%" PRIuMAX " not a commit", from_mark);
@@ -2333,9 +2361,8 @@ static void import_marks(const char *input_file)
if (line[0] != ':' || !end)
die("corrupt mark line: %s", line);
*end = 0;
- mark = strtoumax(line + 1, &end, 10);
- if (!mark || end == line + 1
- || *end != ' ' || get_sha1(end + 1, sha1))
+ mark = parse_mark(line, &end);
+ if (!mark || *end != ' ' || get_sha1(end + 1, sha1))
die("corrupt mark line: %s", line);
e = find_object(sha1);
if (!e) {
--
1.5.5.1
next prev parent reply other threads:[~2008-04-25 9:48 UTC|newest]
Thread overview: 104+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-23 21:42 [PATCH 1/4] Move redo merge code in a function Jörg Sommer
2008-03-23 21:42 ` [PATCH 2/4] Rework redo_merge Jörg Sommer
2008-03-23 21:42 ` [PATCH 3/4] Add a function for get the parents of a commit Jörg Sommer
2008-03-23 21:42 ` [PATCH 4/4] git-rebase -i: New option to support rebase with merges Jörg Sommer
2008-03-23 22:41 ` Johannes Schindelin
2008-03-24 11:14 ` Jörg Sommer
2008-03-24 13:08 ` Johannes Schindelin
2008-03-24 23:40 ` Jörg Sommer
2008-03-24 18:35 ` Junio C Hamano
2008-03-24 23:30 ` Junio C Hamano
2008-03-25 10:13 ` Jörg Sommer
2008-03-26 8:02 ` Junio C Hamano
2008-04-09 23:58 ` Teach rebase interactive more commands to do better preserve merges Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 01/10] Teach rebase interactive the mark command Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 02/10] Teach rebase interactive the reset command Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 03/10] Teach rebase interactive the merge command Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 04/10] Move redo merge code in a function Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 05/10] Rework redo_merge Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 06/10] Unify the lenght of $SHORT* and the commits in the TODO list Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 07/10] fake-editor: output TODO list if unchanged Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 08/10] Don't append default merge message to -m message Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 09/10] Select all lines with fake-editor Jörg Sommer
2008-04-09 23:58 ` [PATCH/RFC 10/10] Do rebase with preserve merges with advanced TODO list Jörg Sommer
2008-04-12 0:00 ` [PATCH/RFC 06/10] Unify the lenght of $SHORT* and the commits in the " Junio C Hamano
2008-04-12 9:13 ` Jörg Sommer
2008-04-13 6:20 ` Junio C Hamano
2008-04-13 16:39 ` Jörg Sommer
2008-04-14 1:06 ` Tarmigan
2008-04-11 23:56 ` [PATCH/RFC 02/10] Teach rebase interactive the reset command Junio C Hamano
2008-04-12 9:37 ` Jörg Sommer
2008-04-10 9:33 ` [PATCH/RFC 01/10] Teach rebase interactive the mark command Mike Ralphson
2008-04-12 10:17 ` Jörg Sommer
2008-04-11 23:48 ` Junio C Hamano
2008-04-12 10:11 ` Jörg Sommer
2008-04-13 3:56 ` Shawn O. Pearce
2008-04-13 16:50 ` Jörg Sommer
2008-04-14 6:24 ` Shawn O. Pearce
2008-04-14 6:54 ` Junio C Hamano
2008-04-14 10:06 ` Jörg Sommer
2008-04-14 0:20 ` [PATCH v2 01/13] fake-editor: output TODO list if unchanged Jörg Sommer
2008-04-14 0:20 ` [PATCH v2 02/13] Don't append default merge message to -m message Jörg Sommer
2008-04-14 0:20 ` [PATCH v2 03/13] Move cleanup code into it's own function Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 04/13] Teach rebase interactive the mark command Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 05/13] Teach rebase interactive the reset command Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 06/13] Move redo merge code in a function Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 07/13] Teach rebase interactive the merge command Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 08/13] Unify the lenght of $SHORT* and the commits in the TODO list Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 09/13] Select all lines with fake-editor Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 10/13] Do rebase with preserve merges with advanced TODO list Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 11/13] Add option --first-parent Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 12/13] Teach rebase interactive the tag command Jörg Sommer
2008-04-14 0:21 ` [PATCH v2 13/13] Add option --preserve-tags Jörg Sommer
2008-04-22 5:32 ` [PATCH v2 04/13] Teach rebase interactive the mark command Junio C Hamano
2008-04-22 8:13 ` Junio C Hamano
2008-04-22 8:52 ` Johannes Schindelin
2008-04-22 9:55 ` Jörg Sommer
2008-04-22 10:31 ` Johannes Schindelin
2008-04-22 16:56 ` Junio C Hamano
2008-04-22 17:12 ` Johannes Schindelin
2008-04-29 0:25 ` Junio C Hamano
2008-04-29 0:39 ` Johannes Schindelin
2008-04-29 5:17 ` Junio C Hamano
2008-04-29 7:12 ` Johannes Sixt
2008-04-29 10:52 ` Johannes Schindelin
2008-04-29 21:16 ` Junio C Hamano
2008-04-29 21:25 ` Johannes Schindelin
2008-04-29 22:23 ` Junio C Hamano
2008-04-29 22:55 ` Johannes Schindelin
2008-04-29 23:06 ` Junio C Hamano
2008-04-29 23:31 ` Johannes Schindelin
2008-04-30 1:23 ` Junio C Hamano
2008-04-30 6:25 ` Johannes Sixt
2008-04-30 7:10 ` Junio C Hamano
2008-04-30 8:47 ` Johannes Schindelin
2008-04-30 9:19 ` Junio C Hamano
2008-04-30 10:29 ` Johannes Sixt
2008-04-30 11:56 ` Johannes Schindelin
2008-05-01 19:04 ` Junio C Hamano
2008-05-03 12:45 ` Johannes Schindelin
2008-05-03 17:09 ` Junio C Hamano
2008-05-04 9:38 ` Johannes Schindelin
2008-05-04 12:52 ` Jörg Sommer
2008-04-30 13:06 ` Dmitry Potapov
2008-05-01 12:59 ` Johannes Schindelin
2008-04-22 18:04 ` Junio C Hamano
2008-04-25 9:11 ` Jörg Sommer
2008-04-25 9:44 ` [PATCH v2.2] " Jörg Sommer
2008-04-27 6:13 ` Junio C Hamano
2008-04-27 8:28 ` Jörg Sommer
2008-04-14 10:39 ` [PATCH v2.1] " Jörg Sommer
2008-04-14 23:29 ` Shawn O. Pearce
2008-04-20 23:44 ` mark parsing in fast-import Jörg Sommer
2008-04-21 0:26 ` Shawn O. Pearce
2008-04-21 8:41 ` Jörg Sommer
2008-04-21 23:59 ` Shawn O. Pearce
2008-04-22 9:39 ` Jörg Sommer
2008-04-22 23:15 ` Shawn O. Pearce
2008-04-25 9:04 ` Jörg Sommer [this message]
2008-04-20 16:52 ` [PATCH v2 02/13] Don't append default merge message to -m message Junio C Hamano
2008-04-21 0:17 ` Jörg Sommer
2008-04-22 5:27 ` Junio C Hamano
2008-03-23 22:33 ` [PATCH 3/4] Add a function for get the parents of a commit Johannes Schindelin
2008-03-23 22:29 ` [PATCH 2/4] Rework redo_merge Johannes Schindelin
2008-03-23 22:26 ` [PATCH 1/4] Move redo merge code in a function Johannes Schindelin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1209114264-10742-1-git-send-email-joerg@alea.gnuu.de \
--to=joerg@alea.gnuu.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).