summaryrefslogtreecommitdiff
path: root/src/textfile.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/textfile.c')
-rw-r--r--src/textfile.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/src/textfile.c b/src/textfile.c
index 2429cc70c..d115ff6a0 100644
--- a/src/textfile.c
+++ b/src/textfile.c
@@ -156,6 +156,28 @@ static inline int write_key_value(int fd, const char *key, const char *value)
return err;
}
+static char *strnpbrk(const char *s, ssize_t len, const char *accept)
+{
+ const char *p = s;
+ const char *end;
+
+ end = s + len - 1;
+
+ while (p <= end && *p) {
+ const char *a = accept;
+
+ while (*a) {
+ if (*p == *a)
+ return (char *) p;
+ a++;
+ }
+
+ p++;
+ }
+
+ return NULL;
+}
+
static int write_key(const char *pathname, const char *key, const char *value, int icase)
{
struct stat st;
@@ -207,7 +229,7 @@ static int write_key(const char *pathname, const char *key, const char *value, i
base = off - map;
- end = strpbrk(off, "\r\n");
+ end = strnpbrk(off, size, "\r\n");
if (!end) {
err = EILSEQ;
goto unmap;
@@ -315,7 +337,7 @@ static char *read_key(const char *pathname, const char *key, int icase)
goto unmap;
}
- end = strpbrk(off, "\r\n");
+ end = strnpbrk(off, size - (map - off), "\r\n");
if (!end) {
err = EILSEQ;
goto unmap;
@@ -404,8 +426,8 @@ int textfile_foreach(const char *pathname, textfile_cb func, void *data)
off = map;
- while (1) {
- end = strpbrk(off, " ");
+ while (size - (off - map) > 0) {
+ end = strnpbrk(off, size - (off - map), " ");
if (!end) {
err = EILSEQ;
break;
@@ -424,7 +446,13 @@ int textfile_foreach(const char *pathname, textfile_cb func, void *data)
off = end + 1;
- end = strpbrk(off, "\r\n");
+ if (size - (off - map) < 0) {
+ err = EILSEQ;
+ free(key);
+ break;
+ }
+
+ end = strnpbrk(off, size - (off - map), "\r\n");
if (!end) {
err = EILSEQ;
free(key);