Skip to content

Commit f364c82

Browse files
committed
fixed incompatiblities in nginx 1.5.8 which breaks the resolver API in the nginx core.
1 parent 5a4199b commit f364c82

File tree

2 files changed

+142
-20
lines changed

2 files changed

+142
-20
lines changed

src/ngx_http_lua_socket_tcp.c

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,9 @@ ngx_http_lua_socket_tcp_connect(lua_State *L)
555555
}
556556

557557
rctx->name = host;
558+
#if !defined(nginx_version) || nginx_version < 1005008
558559
rctx->type = NGX_RESOLVE_A;
560+
#endif
559561
rctx->handler = ngx_http_lua_socket_resolve_handler;
560562
rctx->data = u;
561563
rctx->timeout = clcf->resolver_timeout;
@@ -623,7 +625,12 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
623625
ngx_http_lua_socket_tcp_upstream_t *u;
624626
u_char *p;
625627
size_t len;
628+
#if defined(nginx_version) && nginx_version >= 1005008
629+
socklen_t socklen;
630+
struct sockaddr *sockaddr;
631+
#else
626632
struct sockaddr_in *sin;
633+
#endif
627634
ngx_uint_t i;
628635
unsigned waiting;
629636

@@ -676,9 +683,25 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
676683

677684
#if (NGX_DEBUG)
678685
{
686+
# if defined(nginx_version) && nginx_version >= 1005008
687+
u_char text[NGX_SOCKADDR_STRLEN];
688+
ngx_str_t addr;
689+
# else
679690
in_addr_t addr;
691+
# endif
680692
ngx_uint_t i;
681693

694+
# if defined(nginx_version) && nginx_version >= 1005008
695+
addr.data = text;
696+
697+
for (i = 0; i < ctx->naddrs; i++) {
698+
addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,
699+
text, NGX_SOCKADDR_STRLEN, 0);
700+
701+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
702+
"name was resolved to %V", &addr);
703+
}
704+
# else
682705
for (i = 0; i < ctx->naddrs; i++) {
683706
dd("addr i: %d %p", (int) i, &ctx->addrs[i]);
684707

@@ -689,6 +712,7 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
689712
(addr >> 24) & 0xff, (addr >> 16) & 0xff,
690713
(addr >> 8) & 0xff, addr & 0xff);
691714
}
715+
# endif
692716
}
693717
#endif
694718

@@ -715,21 +739,43 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
715739

716740
dd("selected addr index: %d", (int) i);
717741

718-
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
742+
#if defined(nginx_version) && nginx_version >= 1005008
743+
socklen = ur->addrs[i].socklen;
719744

720-
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
745+
sockaddr = ngx_palloc(r->pool, socklen);
746+
if (sockaddr == NULL) {
747+
goto nomem;
748+
}
749+
750+
ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
751+
752+
switch (sockaddr->sa_family) {
753+
#if (NGX_HAVE_INET6)
754+
case AF_INET6:
755+
((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);
756+
break;
757+
#endif
758+
default: /* AF_INET */
759+
((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
760+
}
761+
762+
p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
721763
if (p == NULL) {
722-
ngx_resolve_name_done(ctx);
723-
u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;
764+
goto nomem;
765+
}
724766

725-
lua_pushnil(L);
726-
lua_pushliteral(L, "out of memory");
767+
len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
768+
ur->sockaddr = sockaddr;
769+
ur->socklen = socklen;
727770

728-
if (waiting) {
729-
ngx_http_run_posted_requests(c);
730-
}
771+
#else
772+
/* for nginx older than 1.5.8 */
731773

732-
return;
774+
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
775+
776+
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
777+
if (p == NULL) {
778+
goto nomem;
733779
}
734780

735781
sin = (struct sockaddr_in *) &p[len];
@@ -744,6 +790,7 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
744790

745791
ur->sockaddr = (struct sockaddr *) sin;
746792
ur->socklen = sizeof(struct sockaddr_in);
793+
#endif
747794

748795
ur->host.data = p;
749796
ur->host.len = len;
@@ -763,6 +810,20 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
763810
} else {
764811
(void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);
765812
}
813+
814+
return;
815+
816+
nomem:
817+
818+
ngx_resolve_name_done(ctx);
819+
u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_NOMEM;
820+
821+
lua_pushnil(L);
822+
lua_pushliteral(L, "no memory");
823+
824+
if (waiting) {
825+
ngx_http_run_posted_requests(c);
826+
}
766827
}
767828

768829

src/ngx_http_lua_socket_udp.c

Lines changed: 71 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,9 @@ ngx_http_lua_socket_udp_setpeername(lua_State *L)
349349
}
350350

351351
rctx->name = host;
352+
#if !defined(nginx_version) || nginx_version < 1005008
352353
rctx->type = NGX_RESOLVE_A;
354+
#endif
353355
rctx->handler = ngx_http_lua_socket_resolve_handler;
354356
rctx->data = u;
355357
rctx->timeout = clcf->resolver_timeout;
@@ -416,7 +418,12 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
416418
ngx_http_lua_socket_udp_upstream_t *u;
417419
u_char *p;
418420
size_t len;
421+
#if defined(nginx_version) && nginx_version >= 1005008
422+
socklen_t socklen;
423+
struct sockaddr *sockaddr;
424+
#else
419425
struct sockaddr_in *sin;
426+
#endif
420427
ngx_uint_t i;
421428
unsigned waiting;
422429

@@ -476,9 +483,25 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
476483

477484
#if (NGX_DEBUG)
478485
{
486+
# if defined(nginx_version) && nginx_version >= 1005008
487+
u_char text[NGX_SOCKADDR_STRLEN];
488+
ngx_str_t addr;
489+
# else
479490
in_addr_t addr;
491+
# endif
480492
ngx_uint_t i;
481493

494+
# if defined(nginx_version) && nginx_version >= 1005008
495+
addr.data = text;
496+
497+
for (i = 0; i < ctx->naddrs; i++) {
498+
addr.len = ngx_sock_ntop(ur->addrs[i].sockaddr, ur->addrs[i].socklen,
499+
text, NGX_SOCKADDR_STRLEN, 0);
500+
501+
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
502+
"name was resolved to %V", &addr);
503+
}
504+
# else
482505
for (i = 0; i < ctx->naddrs; i++) {
483506
dd("addr i: %d %p", (int) i, &ctx->addrs[i]);
484507

@@ -489,6 +512,7 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
489512
(addr >> 24) & 0xff, (addr >> 16) & 0xff,
490513
(addr >> 8) & 0xff, addr & 0xff);
491514
}
515+
# endif
492516
}
493517
#endif
494518

@@ -515,21 +539,43 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
515539

516540
dd("selected addr index: %d", (int) i);
517541

518-
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
542+
#if defined(nginx_version) && nginx_version >= 1005008
543+
socklen = ur->addrs[i].socklen;
519544

520-
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
545+
sockaddr = ngx_palloc(r->pool, socklen);
546+
if (sockaddr == NULL) {
547+
goto nomem;
548+
}
549+
550+
ngx_memcpy(sockaddr, ur->addrs[i].sockaddr, socklen);
551+
552+
switch (sockaddr->sa_family) {
553+
#if (NGX_HAVE_INET6)
554+
case AF_INET6:
555+
((struct sockaddr_in6 *) sockaddr)->sin6_port = htons(ur->port);
556+
break;
557+
#endif
558+
default: /* AF_INET */
559+
((struct sockaddr_in *) sockaddr)->sin_port = htons(ur->port);
560+
}
561+
562+
p = ngx_pnalloc(r->pool, NGX_SOCKADDR_STRLEN);
521563
if (p == NULL) {
522-
ngx_resolve_name_done(ctx);
523-
u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_RESOLVER;
564+
goto nomem;
565+
}
524566

525-
lua_pushnil(L);
526-
lua_pushliteral(L, "out of memory");
567+
len = ngx_sock_ntop(sockaddr, socklen, p, NGX_SOCKADDR_STRLEN, 1);
568+
ur->sockaddr = sockaddr;
569+
ur->socklen = socklen;
527570

528-
if (waiting) {
529-
ngx_http_run_posted_requests(c);
530-
}
571+
#else
572+
/* for nginx older than 1.5.8 */
531573

532-
return;
574+
len = NGX_INET_ADDRSTRLEN + sizeof(":65536") - 1;
575+
576+
p = ngx_pnalloc(r->pool, len + sizeof(struct sockaddr_in));
577+
if (p == NULL) {
578+
goto nomem;
533579
}
534580

535581
sin = (struct sockaddr_in *) &p[len];
@@ -544,6 +590,7 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
544590

545591
ur->sockaddr = (struct sockaddr *) sin;
546592
ur->socklen = sizeof(struct sockaddr_in);
593+
#endif
547594

548595
ur->host.data = p;
549596
ur->host.len = len;
@@ -563,6 +610,20 @@ ngx_http_lua_socket_resolve_handler(ngx_resolver_ctx_t *ctx)
563610
} else {
564611
(void) ngx_http_lua_socket_resolve_retval_handler(r, u, L);
565612
}
613+
614+
return;
615+
616+
nomem:
617+
618+
ngx_resolve_name_done(ctx);
619+
u->ft_type |= NGX_HTTP_LUA_SOCKET_FT_NOMEM;
620+
621+
lua_pushnil(L);
622+
lua_pushliteral(L, "no memory");
623+
624+
if (waiting) {
625+
ngx_http_run_posted_requests(c);
626+
}
566627
}
567628

568629

0 commit comments

Comments
 (0)