diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2005-09-10 09:44:19 +0000 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2005-09-10 09:44:19 +0000 |
commit | b4b75b29434226f97505afa14a9b8838d9b93f61 (patch) | |
tree | 464ce1cc9dbbe7f9db2b45abbe881dd203e855f6 /common | |
parent | 92510c33c1ab156ced109ae1652248ef08beabe8 (diff) |
Fix infinite loops and false positive matches
Diffstat (limited to 'common')
-rw-r--r-- | common/textfile.c | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/common/textfile.c b/common/textfile.c index 095e0355..f15d439c 100644 --- a/common/textfile.c +++ b/common/textfile.c @@ -113,6 +113,17 @@ static inline int write_key_value(int fd, char *key, char *value) return err; } +static inline char *find_key(char *map, char *key, size_t len) +{ + char *off = strstr(map, key); + + while (off && ((off > map && *(off - 1) != '\r' && + *(off - 1) != '\n') || *(off + len) != ' ')) + off = strstr(off + len, key); + + return off; +} + int textfile_put(char *pathname, char *key, char *value) { struct stat st; @@ -148,7 +159,7 @@ int textfile_put(char *pathname, char *key, char *value) goto unlock; } - off = strstr(map, key); + off = find_key(map, key, strlen(key)); if (!off) { munmap(map, size); pos = lseek(fd, size, SEEK_SET); @@ -156,18 +167,6 @@ int textfile_put(char *pathname, char *key, char *value) goto unlock; } - if (off > map) { - while (*(off - 1) != '\r' && *(off - 1) != '\n') { - off = strstr(off, key); - if (!off) { - munmap(map, size); - pos = lseek(fd, size, SEEK_SET); - err = write_key_value(fd, key, value); - goto unlock; - } - } - } - base = off - map; end = strpbrk(off, "\r\n"); @@ -254,29 +253,19 @@ char *textfile_get(char *pathname, char *key) goto unlock; } - off = strstr(map, key); + len = strlen(key); + off = find_key(map, key, len); if (!off) { err = EILSEQ; goto unmap; } - if (off > map) { - while (*(off - 1) != '\r' && *(off - 1) != '\n') { - off = strstr(off, key); - if (!off) { - err = EILSEQ; - goto unmap; - } - } - } - end = strpbrk(off, "\r\n"); if (!end) { err = EILSEQ; goto unmap; } - len = strlen(key); str = malloc(end - off - len); if (!str) { err = EILSEQ; |