From 5b84acbc14af8df82ab58155c65f2380533bf0ea Mon Sep 17 00:00:00 2001 From: Pavel Khlebovich Date: Mon, 12 Aug 2013 00:47:12 +0400 Subject: [PATCH 1/2] Consume \n in mg_fgets when reading from membuf. --- mongoose.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mongoose.c b/mongoose.c index 8b680df6..5831cb2b 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2418,10 +2418,13 @@ static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p) { if (filep->membuf != NULL && *p != NULL) { eof = (char *) memchr(*p, '\n', &filep->membuf[filep->size] - *p); - len = (size_t) (eof - *p) > size - 1 ? size - 1 : (size_t) (eof - *p); - memcpy(buf, *p, len); - buf[len] = '\0'; - *p = eof; + if (eof != NULL) { + eof += 1; // Include \n + len = (size_t) (eof - *p) > size - 1 ? size - 1 : (size_t) (eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p = eof; + } return eof; } else if (filep->fp != NULL) { return fgets(buf, size, filep->fp); From 3d6b373c8fceeb71ee128daa45faea20d6c30a0e Mon Sep 17 00:00:00 2001 From: Pavel Khlebovich Date: Mon, 12 Aug 2013 14:27:20 +0400 Subject: [PATCH 2/2] (mg_fgets) Accept lines at the end not terminated by \n (mg_fgets) Don't consume more than size bytes when line cannot fit into buffer. --- mongoose.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/mongoose.c b/mongoose.c index 5831cb2b..a9fdd06b 100644 --- a/mongoose.c +++ b/mongoose.c @@ -2415,17 +2415,21 @@ static int parse_auth_header(struct mg_connection *conn, char *buf, static char *mg_fgets(char *buf, size_t size, struct file *filep, char **p) { char *eof; size_t len; + char *memend; if (filep->membuf != NULL && *p != NULL) { - eof = (char *) memchr(*p, '\n', &filep->membuf[filep->size] - *p); + memend = (char *) &filep->membuf[filep->size]; + eof = (char *) memchr(*p, '\n', memend - *p); // Search for \n from p till the end of stream if (eof != NULL) { eof += 1; // Include \n - len = (size_t) (eof - *p) > size - 1 ? size - 1 : (size_t) (eof - *p); - memcpy(buf, *p, len); - buf[len] = '\0'; - *p = eof; + } else { + eof = memend; // Copy remaining data } - return eof; + len = (size_t) (eof - *p) > size - 1 ? size - 1 : (size_t) (eof - *p); + memcpy(buf, *p, len); + buf[len] = '\0'; + *p += len; + return len ? eof : NULL; } else if (filep->fp != NULL) { return fgets(buf, size, filep->fp); } else {