baseline

yet another open-source distributed versioning control system
Log | Files | Refs

commit d045dad66c4f1fcbec66576aa8b187eba04c79a2
parent 5daa6f38528cbbb18440014965a5874ea979145f
Author: Mohamed Aslan <maslan@sce.carleton.ca>
Date:   Fri, 27 Jun 2014 08:38:30 -0400

fix a bug in config parser, where it incorrectly fails when username has whitespaces

Diffstat:
Mconfig.c | 47+++++++++++++++++++++++++++++++++--------------
Mobjdb-fs.c | 4++--
2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/config.c b/config.c @@ -43,6 +43,16 @@ static struct option options[] = { {.key = "editor", .val = ""} }; +static char* +skip_spaces(char *str) +{ + if (str == NULL) + return NULL; + while ((*str == ' ' || *str == '\t') && *str != '\0') + str++; + return str; +} + int baseline_config_create(const char *path) { @@ -56,13 +66,14 @@ baseline_config_create(const char *path) return EXIT_SUCCESS; } + int baseline_config_load(const char *path) { char *line = NULL; /* must be initialized to NULL or getline()'s realloc() might complain */ char *ptr, *tmp; char key[32], val[32]; - int i, idx = 0; + int i; size_t size = 0; ssize_t len; FILE *fp; @@ -74,23 +85,31 @@ baseline_config_load(const char *path) /* skip blank lines */ if (line[0] == '\n') continue; - i = 0; - /* skip white spaces */ - while(line[i] == ' ' || line[i] == '\t') - i++; - ptr = &line[i]; + ptr = skip_spaces(line); /* skip comments */ if (ptr[0] == '#' || ptr[0] == ';') continue; - if ((tmp = strchr(ptr, '=')) == NULL) - return EXIT_FAILURE; - *tmp = ' '; - sscanf(ptr, "%s%s", key, val); - if (!strcmp(options[idx].key, key)) { - strlcpy(options[idx].val, val, sizeof(options[idx].val)); - idx++; - if (idx > N_OPTIONS) + /* find the end of the key */ + tmp = ptr; + while(*tmp != ' ' && *tmp != '\t'&& *tmp != '=') + tmp++; + *tmp++ = '\0'; + strlcpy(key, ptr, sizeof(key)); + tmp = skip_spaces(tmp); + /* skip the '=' */ + if (*tmp == '=') + tmp++; + /* skip white spaces */ + ptr = tmp = skip_spaces(tmp); + while (*tmp != '\n' && *tmp != '\0') + tmp++; + *tmp = '\0'; + strlcpy(val, ptr, sizeof(val)); + for (i = 0; i < N_OPTIONS ; i++) { + if (strcmp(options[i].key, key) == 0) { + strlcpy(options[i].val, val, sizeof(options[i].val)); break; + } } } fclose(fp); diff --git a/objdb-fs.c b/objdb-fs.c @@ -226,7 +226,7 @@ commit_deserialize(int fd, struct commit *comm) /* skip "author " */ p1 = buf + 7; /* find author's name */ - if ((p2 = strchr(p1, ' ')) == NULL) + if ((p2 = strstr(p1, " <")) == NULL) goto parse_error; *p2 = '\0'; comm->author.name = strdup(p1); @@ -257,7 +257,7 @@ commit_deserialize(int fd, struct commit *comm) /* skip "committer " */ p1 = buf + 10; /* find committer's name */ - if ((p2 = strchr(p1, ' ')) == NULL) + if ((p2 = strstr(p1, " <")) == NULL) goto parse_error; *p2 = '\0'; comm->committer.name = strdup(p1);