@@ -219,7 +219,7 @@ static ngx_int_t ngx_stream_upsync_check_index(
219
219
ngx_stream_upsync_server_t * upsync_server );
220
220
static ngx_int_t ngx_stream_upsync_consul_parse_json (void * upsync_server );
221
221
static ngx_int_t ngx_stream_upsync_etcd_parse_json (void * upsync_server );
222
- static ngx_int_t ngx_stream_upsync_check_key (u_char * key );
222
+ static ngx_int_t ngx_stream_upsync_check_key (u_char * key , ngx_str_t host );
223
223
static void * ngx_stream_upsync_servers (ngx_cycle_t * cycle ,
224
224
ngx_stream_upsync_server_t * upsync_server , ngx_flag_t flag );
225
225
static void * ngx_stream_upsync_addrs (ngx_pool_t * pool , u_char * sockaddr );
@@ -712,7 +712,7 @@ ngx_stream_upsync_check_index(ngx_stream_upsync_server_t *upsync_server)
712
712
NGX_INDEX_HEARDER_LEN ) == 0 ) {
713
713
p = ngx_strchr (state .headers [i ][1 ], '\r' );
714
714
* p = '\0' ;
715
- index = strtoull ((char * )state .headers [i ][1 ],
715
+ index = ngx_strtoull ((char * )state .headers [i ][1 ],
716
716
(char * * )NULL , 10 );
717
717
break ;
718
718
}
@@ -736,7 +736,7 @@ ngx_stream_upsync_check_index(ngx_stream_upsync_server_t *upsync_server)
736
736
NGX_INDEX_ETCD_HEARDER_LEN ) == 0 ) {
737
737
p = ngx_strchr (state .headers [i ][1 ], '\r' );
738
738
* p = '\0' ;
739
- index = strtoull ((char * )state .headers [i ][1 ],
739
+ index = ngx_strtoull ((char * )state .headers [i ][1 ],
740
740
(char * * )NULL , 10 );
741
741
break ;
742
742
}
@@ -1153,17 +1153,12 @@ ngx_stream_upsync_consul_parse_json(void *data)
1153
1153
{
1154
1154
cJSON * temp1 = cJSON_GetObjectItem (server_next , "Key" );
1155
1155
if (temp1 != NULL && temp1 -> valuestring != NULL ) {
1156
- p = (u_char * )ngx_strrchr (temp1 -> valuestring , '/' );
1157
- if (p == NULL ) {
1158
- ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1159
- "consul_upsync_parse_json: %s key format is "
1160
- "illegal, contains no slash ('/')" ,
1161
- temp1 -> valuestring );
1162
- continue ;
1163
- } else if (ngx_stream_upsync_check_key (p ) != NGX_OK ) {
1156
+ if (ngx_stream_upsync_check_key ((u_char * )temp1 -> valuestring ,
1157
+ upsync_server -> host ) != NGX_OK ) {
1164
1158
continue ;
1165
1159
}
1166
1160
1161
+ p = (u_char * )ngx_strrchr (temp1 -> valuestring , '/' );
1167
1162
upstream_conf = ngx_array_push (& ctx -> upstream_conf );
1168
1163
ngx_memzero (upstream_conf , sizeof (* upstream_conf ));
1169
1164
ngx_sprintf (upstream_conf -> sockaddr , "%*s" , ngx_strlen (p + 1 ), p + 1 );
@@ -1400,16 +1395,12 @@ ngx_stream_upsync_etcd_parse_json(void *data)
1400
1395
{
1401
1396
cJSON * temp0 = cJSON_GetObjectItem (server_next , "key" );
1402
1397
if (temp0 != NULL && temp0 -> valuestring != NULL ) {
1403
- p = (u_char * )ngx_strrchr (temp0 -> valuestring , '/' );
1404
- if (p == NULL ) {
1405
- ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1406
- "etcd_upsync_parse_json: %s key format is illegal,"
1407
- "contains no slash ('/')" , temp0 -> valuestring );
1408
- continue ;
1409
- } else if (ngx_stream_upsync_check_key (p ) != NGX_OK ) {
1398
+ if (ngx_stream_upsync_check_key ((u_char * )temp0 -> valuestring ,
1399
+ upsync_server -> host ) != NGX_OK ) {
1410
1400
continue ;
1411
1401
}
1412
1402
1403
+ p = (u_char * )ngx_strrchr (temp0 -> valuestring , '/' );
1413
1404
upstream_conf = ngx_array_push (& ctx -> upstream_conf );
1414
1405
ngx_memzero (upstream_conf , sizeof (* upstream_conf ));
1415
1406
ngx_sprintf (upstream_conf -> sockaddr , "%*s" , ngx_strlen (p + 1 ), p + 1 );
@@ -1552,30 +1543,44 @@ ngx_stream_upsync_etcd_parse_json(void *data)
1552
1543
1553
1544
1554
1545
static ngx_int_t
1555
- ngx_stream_upsync_check_key (u_char * key )
1546
+ ngx_stream_upsync_check_key (u_char * key , ngx_str_t host )
1556
1547
{
1557
- u_char * last , * ip_p , * port_p ;
1548
+ u_char * last , * ip_p , * port_p , * s_p ;
1558
1549
ngx_int_t port ;
1559
1550
1560
- port_p = (u_char * )ngx_strchr (key , ':' );
1551
+ s_p = (u_char * )ngx_strrchr (key , '/' );
1552
+ if (s_p == NULL ) {
1553
+ ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1554
+ "upsync_parse_json: %s key format is illegal, "
1555
+ "contains no slash ('/')" , key );
1556
+ return NGX_ERROR ;
1557
+ }
1558
+ if (* (s_p - host .len - 1 ) != '/' ) {
1559
+ return NGX_ERROR ;
1560
+ }
1561
+ if (ngx_strncmp ((s_p - host .len ), host .data , host .len ) != 0 ) {
1562
+ return NGX_ERROR ;
1563
+ }
1564
+
1565
+ port_p = (u_char * )ngx_strchr (s_p , ':' );
1561
1566
if (port_p == NULL ) {
1562
1567
ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1563
- "upsync_check_key: has no port in %s" , key );
1568
+ "upsync_check_key: has no port in %s" , s_p );
1564
1569
return NGX_ERROR ;
1565
1570
}
1566
1571
1567
- ip_p = key + 1 ;
1572
+ ip_p = s_p + 1 ;
1568
1573
if (ngx_inet_addr (ip_p , port_p - ip_p ) == INADDR_NONE ) {
1569
1574
ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1570
- "upsync_check_key: invalid ip in %s" , key );
1575
+ "upsync_check_key: invalid ip in %s" , s_p );
1571
1576
return NGX_ERROR ;
1572
1577
}
1573
1578
1574
1579
last = ip_p + ngx_strlen (ip_p );
1575
1580
port = ngx_atoi (port_p + 1 , last - port_p - 1 );
1576
1581
if (port < 1 || port > 65535 ) {
1577
1582
ngx_log_error (NGX_LOG_ERR , ngx_cycle -> log , 0 ,
1578
- "upsync_check_key: invalid port in %s" , key );
1583
+ "upsync_check_key: invalid port in %s" , s_p );
1579
1584
return NGX_ERROR ;
1580
1585
}
1581
1586
0 commit comments