comparison src/core/ngx_inet.c @ 5263:05ba5bce31e0

Core: extended ngx_sock_ntop() with socklen parameter. On Linux, sockaddr length is required to process unix socket addresses properly due to unnamed sockets (which don't have sun_path set at all) and abstract namespace sockets.
author Vladimir Homutov <vl@nginx.com>
date Thu, 11 Jul 2013 16:07:25 +0400
parents c9059bd5445b
children ec8594b9bf11
comparison
equal deleted inserted replaced
5262:626f288fa5ed 5263:05ba5bce31e0
172 172
173 #endif 173 #endif
174 174
175 175
176 size_t 176 size_t
177 ngx_sock_ntop(struct sockaddr *sa, u_char *text, size_t len, ngx_uint_t port) 177 ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len,
178 ngx_uint_t port)
178 { 179 {
179 u_char *p; 180 u_char *p;
180 struct sockaddr_in *sin; 181 struct sockaddr_in *sin;
181 #if (NGX_HAVE_INET6) 182 #if (NGX_HAVE_INET6)
182 size_t n; 183 size_t n;
228 #if (NGX_HAVE_UNIX_DOMAIN) 229 #if (NGX_HAVE_UNIX_DOMAIN)
229 230
230 case AF_UNIX: 231 case AF_UNIX:
231 saun = (struct sockaddr_un *) sa; 232 saun = (struct sockaddr_un *) sa;
232 233
234 /* on Linux sockaddr might not include sun_path at all */
235
236 if (socklen <= offsetof(struct sockaddr_un, sun_path)) {
237 p = ngx_snprintf(text, len, "unix:%Z");
238
239 } else {
240 p = ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path);
241 }
242
233 /* we do not include trailing zero in address length */ 243 /* we do not include trailing zero in address length */
234 244
235 return ngx_snprintf(text, len, "unix:%s%Z", saun->sun_path) - text - 1; 245 return (p - text - 1);
236 246
237 #endif 247 #endif
238 248
239 default: 249 default:
240 return 0; 250 return 0;
1018 p = ngx_pnalloc(pool, len); 1028 p = ngx_pnalloc(pool, len);
1019 if (p == NULL) { 1029 if (p == NULL) {
1020 goto failed; 1030 goto failed;
1021 } 1031 }
1022 1032
1023 len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1); 1033 len = ngx_sock_ntop((struct sockaddr *) sin, rp->ai_addrlen, p, len, 1);
1024 1034
1025 u->addrs[i].name.len = len; 1035 u->addrs[i].name.len = len;
1026 u->addrs[i].name.data = p; 1036 u->addrs[i].name.data = p;
1027 1037
1028 i++; 1038 i++;
1051 p = ngx_pnalloc(pool, len); 1061 p = ngx_pnalloc(pool, len);
1052 if (p == NULL) { 1062 if (p == NULL) {
1053 goto failed; 1063 goto failed;
1054 } 1064 }
1055 1065
1056 len = ngx_sock_ntop((struct sockaddr *) sin6, p, len, 1); 1066 len = ngx_sock_ntop((struct sockaddr *) sin6, rp->ai_addrlen, p,
1067 len, 1);
1057 1068
1058 u->addrs[i].name.len = len; 1069 u->addrs[i].name.len = len;
1059 u->addrs[i].name.data = p; 1070 u->addrs[i].name.data = p;
1060 1071
1061 i++; 1072 i++;
1136 p = ngx_pnalloc(pool, len); 1147 p = ngx_pnalloc(pool, len);
1137 if (p == NULL) { 1148 if (p == NULL) {
1138 return NGX_ERROR; 1149 return NGX_ERROR;
1139 } 1150 }
1140 1151
1141 len = ngx_sock_ntop((struct sockaddr *) sin, p, len, 1); 1152 len = ngx_sock_ntop((struct sockaddr *) sin,
1153 sizeof(struct sockaddr_in), p, len, 1);
1142 1154
1143 u->addrs[i].name.len = len; 1155 u->addrs[i].name.len = len;
1144 u->addrs[i].name.data = p; 1156 u->addrs[i].name.data = p;
1145 } 1157 }
1146 1158