nginx-0.3.22-RELEASE import

*) Feature: the ngx_http_perl_module supports the $r->args and
       $r->unescape methods.

    *) Feature: the method $r->query_string of ngx_http_perl_module was
       canceled.

    *) Bugfix: segmentation fault was occurred if the "none" or "blocked"
       values was specified in the "valid_referers" directive; the bug had
       appeared in 0.3.18.
This commit is contained in:
Igor Sysoev 2006-01-17 20:04:32 +00:00
parent 4a32307de7
commit ae33d014ad
15 changed files with 135 additions and 42 deletions

View File

@ -20,9 +20,6 @@ CFLAGS="$CFLAGS -O"
# inline any function, at the compiler's discretion # inline any function, at the compiler's discretion
CFLAGS="$CFLAGS -Ob2" CFLAGS="$CFLAGS -Ob2"
# single-file IP optimizations
#IPO="-ip"
# multi-file IP optimizations # multi-file IP optimizations
case "$NGX_ICC_VER" in case "$NGX_ICC_VER" in
9.*) 9.*)
@ -34,6 +31,9 @@ case "$NGX_ICC_VER" in
;; ;;
esac esac
# single-file IP optimizations
#IPO="-ip"
CFLAGS="$CFLAGS $IPO" CFLAGS="$CFLAGS $IPO"
CORE_LINK="$CORE_LINK $IPO" CORE_LINK="$CORE_LINK $IPO"
CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file" CORE_LINK="$CORE_LINK -opt_report_file=$NGX_OBJS/opt_report_file"

View File

@ -15,14 +15,16 @@ $NGX_OBJS/src/http/modules/perl/blib/arch/auto/nginx/nginx.so: \
cd $NGX_OBJS/src/http/modules/perl && make cd $NGX_OBJS/src/http/modules/perl && make
$NGX_OBJS/src/http/modules/perl/Makefile: src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/Makefile: \
src/http/modules/perl/Makefile.PL \
src/http/modules/perl/nginx.pm
cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/ cp -p src/http/modules/perl/nginx.* $NGX_OBJS/src/http/modules/perl/
cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/ cp -p src/http/modules/perl/typemap $NGX_OBJS/src/http/modules/perl/
cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/ cp -p src/http/modules/perl/Makefile.PL $NGX_OBJS/src/http/modules/perl/
cd $NGX_OBJS/src/http/modules/perl \ cd $NGX_OBJS/src/http/modules/perl \
&& NGX_PERL_CFLAGS="$NGX_PERL_CFLAGS" \ && NGX_PERL_CFLAGS="$NGX_PERL_CFLAGS $NGX_CC_OPT" \
NGX_PCRE=$PCRE \ NGX_PCRE=$PCRE \
NGX_ZLIB=$ZLIB \ NGX_ZLIB=$ZLIB \
NGX_OBJS=$NGX_OBJS \ NGX_OBJS=$NGX_OBJS \

View File

@ -9,6 +9,42 @@
<title lang="en">nginx changelog</title> <title lang="en">nginx changelog</title>
<changes ver="0.3.22" date="17.01.2006">
<change type="feature">
<para lang="ru">
ÍÏÄÕÌØ ngx_http_perl_module ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÅÔÏÄÙ $r->args É $r->unescape.
</para>
<para lang="en">
the ngx_http_perl_module supports the $r->args and $r->unescape methods.
</para>
</change>
<change type="feature">
<para lang="ru">
ÍÅÔÏÄ $r->query_string × ÍÏÄÕÌÅ ngx_http_perl_module ÕÐÒÁÚÄΣÎ.
</para>
<para lang="en">
the method $r->query_string of ngx_http_perl_module is canceled.
</para>
</change>
<change type="bugfix">
<para lang="ru">
ÅÓÌÉ × ÄÉÒÅËÔÉ×Å valid_referers ÕËÁÚÁÎÙ ÔÏÌØËÏ none ÉÌÉ blocked, ÔÏ
ÐÒÏÉÓÈÏÄÉÌ segmentation fault;
ÏÛÉÂËÁ ÐÏÑ×ÉÌÁÓØ × 0.3.18.
</para>
<para lang="en">
segmentation fault was occurred if the "none" or "blocked" values was
specified in the "valid_referers" directive;
bug appeared in 0.3.18.
</para>
</change>
</changes>
<changes ver="0.3.21" date="16.01.2006"> <changes ver="0.3.21" date="16.01.2006">
<change type="feature"> <change type="feature">

View File

@ -168,6 +168,8 @@ ngx_module_t ngx_core_module = {
ngx_uint_t ngx_max_module; ngx_uint_t ngx_max_module;
static char *ngx_null_environ = NULL;
int ngx_cdecl int ngx_cdecl
main(int argc, char *const *argv) main(int argc, char *const *argv)
@ -232,6 +234,8 @@ main(int argc, char *const *argv)
return 1; return 1;
} }
environ = &ngx_null_environ;
ngx_max_module = 0; ngx_max_module = 0;
for (i = 0; ngx_modules[i]; i++) { for (i = 0; ngx_modules[i]; i++) {
ngx_modules[i]->index = ngx_max_module++; ngx_modules[i]->index = ngx_max_module++;

View File

@ -8,7 +8,7 @@
#define _NGINX_H_INCLUDED_ #define _NGINX_H_INCLUDED_
#define NGINX_VER "nginx/0.3.21" #define NGINX_VER "nginx/0.3.22"
#define NGINX_VAR "NGINX" #define NGINX_VAR "NGINX"
#define NGX_OLDPID_EXT ".oldbin" #define NGX_OLDPID_EXT ".oldbin"

View File

@ -931,7 +931,7 @@ ngx_escape_uri(u_char *dst, u_char *src, size_t size, ngx_uint_t type)
void void
ngx_unescape_uri(u_char **dst, u_char **src, size_t size) ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type)
{ {
u_char *d, *s, ch, c, decoded; u_char *d, *s, ch, c, decoded;
enum { enum {
@ -952,7 +952,7 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
switch (state) { switch (state) {
case sw_usual: case sw_usual:
if (ch == '?') { if (ch == '?' && type == NGX_UNESCAPE_URI) {
*d++ = ch; *d++ = ch;
goto done; goto done;
} }
@ -995,12 +995,18 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
if (ch >= '0' && ch <= '9') { if (ch >= '0' && ch <= '9') {
ch = (u_char) ((decoded << 4) + ch - '0'); ch = (u_char) ((decoded << 4) + ch - '0');
if (ch > '%' && ch < 0x7f) { if (type == NGX_UNESCAPE_URI) {
*d++ = ch; if (ch > '%' && ch < 0x7f) {
*d++ = ch;
break;
}
*d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
break; break;
} }
*d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); *d++ = ch;
break; break;
} }
@ -1009,17 +1015,22 @@ ngx_unescape_uri(u_char **dst, u_char **src, size_t size)
if (c >= 'a' && c <= 'f') { if (c >= 'a' && c <= 'f') {
ch = (u_char) ((decoded << 4) + c - 'a' + 10); ch = (u_char) ((decoded << 4) + c - 'a' + 10);
if (ch == '?') { if (type == NGX_UNESCAPE_URI) {
*d++ = ch; if (ch == '?') {
goto done; *d++ = ch;
} goto done;
}
if (ch > '%' && ch < 0x7f) { if (ch > '%' && ch < 0x7f) {
*d++ = ch; *d++ = ch;
break;
}
*d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1);
break; break;
} }
*d++ = '%'; *d++ = *(s - 2); *d++ = *(s - 1); *d++ = ch;
break; break;
} }

View File

@ -144,13 +144,15 @@ size_t ngx_utf_length(ngx_str_t *utf);
u_char * ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n); u_char * ngx_utf_cpystrn(u_char *dst, u_char *src, size_t n);
#define NGX_ESCAPE_URI 0 #define NGX_ESCAPE_URI 0
#define NGX_ESCAPE_ARGS 1 #define NGX_ESCAPE_ARGS 1
#define NGX_ESCAPE_HTML 2 #define NGX_ESCAPE_HTML 2
#define NGX_UNESCAPE_URI 1
uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size, uintptr_t ngx_escape_uri(u_char *dst, u_char *src, size_t size,
ngx_uint_t type); ngx_uint_t type);
void ngx_unescape_uri(u_char **dst, u_char **src, size_t size); void ngx_unescape_uri(u_char **dst, u_char **src, size_t size, ngx_uint_t type);
#define ngx_qsort qsort #define ngx_qsort qsort

View File

@ -90,10 +90,7 @@ ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module); rlcf = ngx_http_get_module_loc_conf(r, ngx_http_referer_module);
if (rlcf->hash.buckets == NULL if (rlcf->hash.buckets == NULL && rlcf->dns_wildcards == NULL) {
&& rlcf->dns_wildcards == NULL
&& rlcf->dns_wildcards->hash.buckets == NULL)
{
goto valid; goto valid;
} }
@ -145,7 +142,7 @@ ngx_http_referer_variable(ngx_http_request_t *r, ngx_http_variable_value_t *v,
} }
} }
if (rlcf->dns_wildcards && rlcf->dns_wildcards->hash.buckets) { if (rlcf->dns_wildcards) {
uri = ngx_hash_find_wildcard(rlcf->dns_wildcards, buf, len); uri = ngx_hash_find_wildcard(rlcf->dns_wildcards, buf, len);
if (uri) { if (uri) {
goto uri; goto uri;

View File

@ -17,7 +17,7 @@ our @EXPORT = qw(
HTTP_SERVER_ERROR HTTP_SERVER_ERROR
); );
our $VERSION = '0.3.21'; our $VERSION = '0.3.22';
require XSLoader; require XSLoader;
XSLoader::load('nginx', $VERSION); XSLoader::load('nginx', $VERSION);
@ -48,11 +48,6 @@ nginx - Perl interface to the nginx HTTP server API
This module provides a Perl interface to the nginx HTTP server API. This module provides a Perl interface to the nginx HTTP server API.
=head2 EXPORT
None by default.
=head1 SEE ALSO =head1 SEE ALSO

View File

@ -156,13 +156,13 @@ uri(r, ...)
char * char *
query_string(r, ...) args(r, ...)
nginx r nginx r
CODE: CODE:
if (items != 1) { if (items != 1) {
croak("$r->query_string(text) is not implemented"); croak("$r->args(text) is not implemented");
} }
RETVAL = ngx_palloc(r->pool, r->args.len + 1); RETVAL = ngx_palloc(r->pool, r->args.len + 1);
@ -360,6 +360,9 @@ print(r, ...)
b->start = p; b->start = p;
b->end = b->last; b->end = b->last;
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"$r->print: read-only SV: %z", len);
goto out; goto out;
} }
} }
@ -374,12 +377,11 @@ print(r, ...)
sv = SvRV(sv); sv = SvRV(sv);
} }
ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"SV: %p %d %Xd",
sv, SvREFCNT(sv), SvREADONLY(sv));
(void) SvPV(sv, len); (void) SvPV(sv, len);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
"$r->print: copy SV: %z", len);
size += len; size += len;
} }
@ -513,6 +515,8 @@ rflush(r)
b->flush = 1; b->flush = 1;
ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "$r->rflush");
RETVAL = ngx_http_perl_output(r, b); RETVAL = ngx_http_perl_output(r, b);
done: done:
@ -549,3 +553,34 @@ internal_redirect(r, uri)
XSRETURN_EMPTY; XSRETURN_EMPTY;
} }
} }
char *
unescape(r, text, type = 0)
nginx r
SV *text
int type
PREINIT:
u_char *p, *dst, *src;
STRLEN n;
CODE:
src = (u_char *) SvPV(text, n);
p = ngx_palloc(r->pool, n + 1);
if (p == NULL) {
XSRETURN_UNDEF;
}
dst = p;
ngx_unescape_uri(&dst, &src, n, (ngx_uint_t) type);
*dst = '\0';
RETVAL = (char *) p;
OUTPUT:
RETVAL

View File

@ -682,7 +682,7 @@ ngx_http_script_regex_end_code(ngx_http_script_engine_t *e)
dst = e->buf.data; dst = e->buf.data;
src = e->buf.data; src = e->buf.data;
ngx_unescape_uri(&dst, &src, e->pos - e->buf.data); ngx_unescape_uri(&dst, &src, e->pos - e->buf.data, NGX_UNESCAPE_URI);
if (src < e->pos) { if (src < e->pos) {
dst = ngx_copy(dst, src, e->pos - src); dst = ngx_copy(dst, src, e->pos - src);

View File

@ -97,9 +97,11 @@ pid_t rfork_thread(int flags, void *stack, int (*func)(void *arg), void *arg);
#endif #endif
extern char *malloc_options;
#define NGX_HAVE_OS_SPECIFIC_INIT 1 #define NGX_HAVE_OS_SPECIFIC_INIT 1
extern char **environ;
extern char *malloc_options;
#endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */ #endif /* _NGX_FREEBSD_CONFIG_H_INCLUDED_ */

View File

@ -101,4 +101,7 @@ extern ssize_t sendfile(int s, int fd, int32_t *offset, size_t size);
#define NGX_HAVE_OS_SPECIFIC_INIT 1 #define NGX_HAVE_OS_SPECIFIC_INIT 1
extern char **environ;
#endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */ #endif /* _NGX_LINUX_CONFIG_H_INCLUDED_ */

View File

@ -102,4 +102,7 @@
#endif #endif
extern char **environ;
#endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */ #endif /* _NGX_POSIX_CONFIG_H_INCLUDED_ */

View File

@ -88,4 +88,7 @@
#define NGX_HAVE_OS_SPECIFIC_INIT 1 #define NGX_HAVE_OS_SPECIFIC_INIT 1
extern char **environ;
#endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */ #endif /* _NGX_SOLARIS_CONFIG_H_INCLUDED_ */