aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ngx_conf_file.c220
-rw-r--r--src/core/ngx_conf_file.h1
-rw-r--r--src/core/ngx_config.h4
-rw-r--r--src/core/ngx_string.c32
-rw-r--r--src/core/ngx_string.h1
5 files changed, 212 insertions, 46 deletions
diff --git a/src/core/ngx_conf_file.c b/src/core/ngx_conf_file.c
index 45533be75..a93922a04 100644
--- a/src/core/ngx_conf_file.c
+++ b/src/core/ngx_conf_file.c
@@ -441,21 +441,26 @@ char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
len = value[1].len;
last = value[1].data[len - 1];
- if (last == 'K' || last == 'k') {
+ switch (last) {
+ case 'K':
+ case 'k':
len--;
scale = 1024;
+ break;
- } else if (last == 'M' || last == 'm') {
+ case 'M':
+ case 'm':
len--;
scale = 1024 * 1024;
+ break;
- } else {
+ default:
scale = 1;
}
size = ngx_atoi(value[1].data, len);
if (size == NGX_ERROR) {
- return "value must be greater or equal to zero";
+ return "invalid value";
}
size *= scale;
@@ -466,71 +471,200 @@ char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
}
-char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
+char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
{
- int size, len, scale;
- char last;
+ int size, total, len, scale, i;
+ u_int max;
+ char last, *start;
ngx_str_t *value;
value = (ngx_str_t *) cf->args->elts;
+ start = value[1].data;
+ len = 0;
+ total = 0;
- len = value[1].len;
- last = value[1].data[len - 1];
+ for (i = 0; /* void */ ; i++) {
- if (last == 'm') {
- len--;
- scale = 1000 * 60;
-
- } else if (last == 'h') {
- len--;
- scale = 1000 * 60 * 60;
+ if (i < value[1].len) {
+ if (value[1].data[i] != ' ') {
+ len++;
+ continue;
+ }
- } else if (last == 'd') {
- len--;
- scale = 1000 * 60 * 60 * 24;
+ if (value[1].data[i] == ' ' && len == 0) {
+ start = &value[1].data[i + 1];
+ continue;
+ }
+ }
- } else if (last == 'w') {
- len--;
- scale = 1000 * 60 * 60 * 24 * 7;
+ if (len == 0) {
+ break;
+ }
-#if 0 /* overflow */
+ last = value[1].data[i - 1];
- } else if (last == 'M') {
- len--;
- scale = 1000 * 60 * 60 * 24 * 30;
+ switch (last) {
+ case 'm':
+ len--;
+ max = 35791;
+ scale = 1000 * 60;
+ break;
- } else if (last == 'y') {
- len--;
- scale = 1000 * 60 * 60 * 24 * 365;
+ case 'h':
+ len--;
+ max = 596;
+ scale = 1000 * 60 * 60;
+ break;
-#endif
+ case 'd':
+ len--;
+ max = 24;
+ scale = 1000 * 60 * 60 * 24;
+ break;
- } else if (last == 's') {
- len--;
- if (value[1].data[len - 1] == 'm') {
+ case 's':
len--;
- scale = 1;
+ if (value[1].data[i - 2] == 'm') {
+ len--;
+ max = 2147483647;
+ scale = 1;
+ break;
+ }
+ /* fall thru */
- } else {
+ default:
+ max = 2147483;
scale = 1000;
}
- } else {
- scale = 1000;
- }
+ size = ngx_atoi(start, len);
+ if (size < 0) {
+ return "invalid value";
+ }
- size = ngx_atoi(value[1].data, len);
- if (size < 0) {
- return "value must be greater or equal to zero";
+ if ((u_int) size > max) {
+ return "value must be less than 597 hours";
+ }
+
+ total += size * scale;
+
+ if (i >= value[1].len) {
+ break;
+ }
+
+ len = 0;
+ start = &value[1].data[i + 1];
}
- size *= scale;
+ *(int *) (conf + cmd->offset) = total;
- *(int *) (conf + cmd->offset) = size;
+ return NGX_CONF_OK;
+}
+
+
+char *ngx_conf_set_sec_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
+{
+ int size, total, len, scale, i;
+ u_int max;
+ char last, *start;
+ ngx_str_t *value;
+
+ value = (ngx_str_t *) cf->args->elts;
+ start = value[1].data;
+ len = 0;
+ total = 0;
+
+ for (i = 0; /* void */ ; i++) {
+
+ if (i < value[1].len) {
+ if (value[1].data[i] != ' ') {
+ len++;
+ continue;
+ }
+
+ if (value[1].data[i] == ' ' && len == 0) {
+ start = &value[1].data[i + 1];
+ continue;
+ }
+ }
+
+ if (len == 0) {
+ break;
+ }
+
+ last = value[1].data[i - 1];
+
+ switch (last) {
+ case 'm':
+ len--;
+ max = 35791394;
+ scale = 60;
+ break;
+
+ case 'h':
+ len--;
+ max = 596523;
+ scale = 60 * 60;
+ break;
+
+ case 'd':
+ len--;
+ max = 24855;
+ scale = 60 * 60 * 24;
+ break;
+
+ case 'w':
+ len--;
+ max = 3550;
+ scale = 60 * 60 * 24 * 7;
+ break;
+
+ case 'M':
+ len--;
+ max = 828;
+ scale = 60 * 60 * 24 * 30;
+ break;
+
+ case 'y':
+ len--;
+ max = 68;
+ scale = 60 * 60 * 24 * 365;
+ break;
+
+ case 's':
+ len--;
+ /* fall thru */
+
+ default:
+ max = 2147483647;
+ scale = 1;
+ }
+
+ size = ngx_atoi(start, len);
+ if (size < 0) {
+ return "invalid value";
+ }
+
+ if ((u_int) size > max) {
+ return "value must be less than 68 years";
+ }
+
+ total += size * scale;
+
+ if (i >= value[1].len) {
+ break;
+ }
+
+ len = 0;
+ start = &value[1].data[i + 1];
+ }
+
+ *(int *) (conf + cmd->offset) = total;
return NGX_CONF_OK;
}
+
char *ngx_conf_unsupported(ngx_conf_t *cf, ngx_command_t *cmd, char *conf)
{
return "unsupported on this platform";
diff --git a/src/core/ngx_conf_file.h b/src/core/ngx_conf_file.h
index f6c9e0292..5426f59e9 100644
--- a/src/core/ngx_conf_file.h
+++ b/src/core/ngx_conf_file.h
@@ -100,6 +100,7 @@ char *ngx_conf_parse(ngx_conf_t *cf, ngx_str_t *filename);
char *ngx_conf_set_flag_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
char *ngx_conf_set_str_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
char *ngx_conf_set_size_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
+char *ngx_conf_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
char *ngx_conf_set_time_slot(ngx_conf_t *cf, ngx_command_t *cmd, char *conf);
diff --git a/src/core/ngx_config.h b/src/core/ngx_config.h
index 3df08568c..8287d5680 100644
--- a/src/core/ngx_config.h
+++ b/src/core/ngx_config.h
@@ -87,6 +87,7 @@
#include <signal.h>
#include <string.h>
#include <sys/types.h>
+#include <sys/mman.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <sys/socket.h>
@@ -167,10 +168,11 @@
/* FreeBSD sendfile nbytes bug */
#if (__FreeBSD__ == 4 && __FreeBSD_version >= 460100) \
- || __FreeBSD_version == 460001
+ || __FreeBSD_version == 460001 \
|| __FreeBSD_version >= 500029
#if (HAVE_FREEBSD_SENDFILE_NBYTES_BUG == 2)
+#undef HAVE_FREEBSD_SENDFILE_NBYTES_BUG
#define HAVE_FREEBSD_SENDFILE_NBYTES_BUG 0
#endif
diff --git a/src/core/ngx_string.c b/src/core/ngx_string.c
index 15104985f..56a9861c4 100644
--- a/src/core/ngx_string.c
+++ b/src/core/ngx_string.c
@@ -6,14 +6,16 @@
char *ngx_cpystrn(char *dst, char *src, size_t n)
{
- if (n == 0)
+ if (n == 0) {
return dst;
+ }
for (/* void */; --n; dst++, src++) {
*dst = *src;
- if (*dst == '\0')
+ if (*dst == '\0') {
return dst;
+ }
}
*dst = '\0';
@@ -22,10 +24,36 @@ char *ngx_cpystrn(char *dst, char *src, size_t n)
}
+int ngx_rstrncmp(char *s1, char *s2, size_t n)
+{
+ if (n == 0) {
+ return 0;
+ }
+
+ n--;
+
+ for ( ;; ) {
+ if (s1[n] != s2[n]) {
+ return (u_char) s1[n] - (u_char) s2[n];
+ }
+
+ if (n == 0) {
+ return 0;
+ }
+
+ n--;
+ }
+}
+
+
int ngx_atoi(char *line, size_t n)
{
int value;
+ if (n == 0) {
+ return NGX_ERROR;
+ }
+
for (value = 0; n--; line++) {
if (*line < '0' || *line > '9') {
return NGX_ERROR;
diff --git a/src/core/ngx_string.h b/src/core/ngx_string.h
index 8566d46e8..e678f7333 100644
--- a/src/core/ngx_string.h
+++ b/src/core/ngx_string.h
@@ -49,6 +49,7 @@ typedef struct {
#define ngx_cpymem(dst, src, n) memcpy(dst, src, n) + n
char *ngx_cpystrn(char *dst, char *src, size_t n);
+int ngx_rstrncmp(char *s1, char *s2, size_t n);
int ngx_atoi(char *line, size_t n);