diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/ngx_conf_file.c | 220 | ||||
-rw-r--r-- | src/core/ngx_conf_file.h | 1 | ||||
-rw-r--r-- | src/core/ngx_config.h | 4 | ||||
-rw-r--r-- | src/core/ngx_string.c | 32 | ||||
-rw-r--r-- | src/core/ngx_string.h | 1 |
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); |