mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
481. [bug] nslookup:get_next_command() stack size exceeds
per thread limit. 480. [bug] strtok() is not thread safe. [RT #349] replaced strtok() w/ strsep().
This commit is contained in:
5
CHANGES
5
CHANGES
@@ -1,3 +1,8 @@
|
|||||||
|
481. [bug] nslookup:get_next_command() stack size exceeds
|
||||||
|
per thread limit.
|
||||||
|
|
||||||
|
480. [bug] strtok() is not thread safe. [RT #349]
|
||||||
|
|
||||||
479. [func] The test suite can now be run by typing "make check"
|
479. [func] The test suite can now be run by typing "make check"
|
||||||
or "make test" at the top level.
|
or "make test" at the top level.
|
||||||
|
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: dig.c,v 1.92 2000/09/13 00:27:21 mws Exp $ */
|
/* $Id: dig.c,v 1.93 2000/09/21 11:53:13 marka Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -586,6 +586,7 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
|
|||||||
char rcfile[132];
|
char rcfile[132];
|
||||||
#endif
|
#endif
|
||||||
isc_boolean_t nibble = ISC_FALSE;
|
isc_boolean_t nibble = ISC_FALSE;
|
||||||
|
char *input;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The semantics for parsing the args is a bit complex; if
|
* The semantics for parsing the args is a bit complex; if
|
||||||
@@ -618,11 +619,12 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
|
|||||||
batchfp) != 0) {
|
batchfp) != 0) {
|
||||||
debug("config line %s", batchline);
|
debug("config line %s", batchline);
|
||||||
bargc = 1;
|
bargc = 1;
|
||||||
bargv[bargc] = strtok(batchline, " \t\r\n");
|
input = batchline;
|
||||||
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
while ((bargv[bargc] != NULL) &&
|
while ((bargv[bargc] != NULL) &&
|
||||||
(bargc < 14)) {
|
(bargc < 14)) {
|
||||||
bargc++;
|
bargc++;
|
||||||
bargv[bargc] = strtok(NULL, " \t\r\n");
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
bargv[0] = argv[0];
|
bargv[0] = argv[0];
|
||||||
@@ -909,13 +911,14 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
|
|||||||
rv++;
|
rv++;
|
||||||
rc--;
|
rc--;
|
||||||
}
|
}
|
||||||
ptr = strtok(ptr,":");
|
input = ptr;
|
||||||
|
ptr = strsep(&input,":");
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
show_usage();
|
show_usage();
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
strncpy(keynametext, ptr, MXNAME);
|
strncpy(keynametext, ptr, MXNAME);
|
||||||
ptr = strtok(NULL, "");
|
ptr = strsep(&input, "");
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
show_usage();
|
show_usage();
|
||||||
exit(1);
|
exit(1);
|
||||||
@@ -1093,10 +1096,11 @@ parse_args(isc_boolean_t is_batchfile, isc_boolean_t config_only,
|
|||||||
if (fgets(batchline, sizeof(batchline), batchfp) != 0) {
|
if (fgets(batchline, sizeof(batchline), batchfp) != 0) {
|
||||||
debug("batch line %s", batchline);
|
debug("batch line %s", batchline);
|
||||||
bargc = 1;
|
bargc = 1;
|
||||||
bargv[bargc] = strtok(batchline, " \t\r\n");
|
input = batchline;
|
||||||
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
while ((bargv[bargc] != NULL) && (bargc < 14)) {
|
while ((bargv[bargc] != NULL) && (bargc < 14)) {
|
||||||
bargc++;
|
bargc++;
|
||||||
bargv[bargc] = strtok(NULL, " \t\r\n");
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
bargv[0] = argv[0];
|
bargv[0] = argv[0];
|
||||||
@@ -1132,6 +1136,7 @@ dighost_shutdown(void) {
|
|||||||
char batchline[MXNAME];
|
char batchline[MXNAME];
|
||||||
int bargc;
|
int bargc;
|
||||||
char *bargv[16];
|
char *bargv[16];
|
||||||
|
char *input;
|
||||||
|
|
||||||
|
|
||||||
if (batchname == NULL) {
|
if (batchname == NULL) {
|
||||||
@@ -1150,10 +1155,11 @@ dighost_shutdown(void) {
|
|||||||
if (fgets(batchline, sizeof(batchline), batchfp) != 0) {
|
if (fgets(batchline, sizeof(batchline), batchfp) != 0) {
|
||||||
debug("batch line %s", batchline);
|
debug("batch line %s", batchline);
|
||||||
bargc = 1;
|
bargc = 1;
|
||||||
bargv[bargc] = strtok(batchline, " \t\r\n");
|
input = batchline;
|
||||||
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
while ((bargv[bargc] != NULL) && (bargc < 14)) {
|
while ((bargv[bargc] != NULL) && (bargc < 14)) {
|
||||||
bargc++;
|
bargc++;
|
||||||
bargv[bargc] = strtok(NULL, " \t\r\n");
|
bargv[bargc] = strsep(&input, " \t\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
bargv[0] = argv0;
|
bargv[0] = argv0;
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: dighost.c,v 1.127 2000/09/14 20:11:47 mws Exp $ */
|
/* $Id: dighost.c,v 1.128 2000/09/21 11:53:14 marka Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Notice to programmers: Do not use this code as an example of how to
|
* Notice to programmers: Do not use this code as an example of how to
|
||||||
@@ -500,6 +500,7 @@ setup_system(void) {
|
|||||||
dig_server_t *srv;
|
dig_server_t *srv;
|
||||||
dig_searchlist_t *search;
|
dig_searchlist_t *search;
|
||||||
isc_boolean_t get_servers;
|
isc_boolean_t get_servers;
|
||||||
|
char *input;
|
||||||
|
|
||||||
debug("setup_system()");
|
debug("setup_system()");
|
||||||
|
|
||||||
@@ -521,12 +522,13 @@ setup_system(void) {
|
|||||||
/* XXX Use lwres resolv.conf reader */
|
/* XXX Use lwres resolv.conf reader */
|
||||||
if (fp != NULL) {
|
if (fp != NULL) {
|
||||||
while (fgets(rcinput, MXNAME, fp) != 0) {
|
while (fgets(rcinput, MXNAME, fp) != 0) {
|
||||||
ptr = strtok(rcinput, " \t\r\n");
|
input = rcinput;
|
||||||
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
if (get_servers &&
|
if (get_servers &&
|
||||||
strcasecmp(ptr, "nameserver") == 0) {
|
strcasecmp(ptr, "nameserver") == 0) {
|
||||||
debug("got a nameserver line");
|
debug("got a nameserver line");
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
srv = make_server(ptr);
|
srv = make_server(ptr);
|
||||||
ISC_LIST_APPEND
|
ISC_LIST_APPEND
|
||||||
@@ -534,7 +536,7 @@ setup_system(void) {
|
|||||||
srv, link);
|
srv, link);
|
||||||
}
|
}
|
||||||
} else if (strcasecmp(ptr, "options") == 0) {
|
} else if (strcasecmp(ptr, "options") == 0) {
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
if((strncasecmp(ptr, "ndots:",
|
if((strncasecmp(ptr, "ndots:",
|
||||||
6) == 0) &&
|
6) == 0) &&
|
||||||
@@ -547,7 +549,7 @@ setup_system(void) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (strcasecmp(ptr, "search") == 0){
|
} else if (strcasecmp(ptr, "search") == 0){
|
||||||
while ((ptr = strtok(NULL, " \t\r\n"))
|
while ((ptr = strsep(&input, " \t\r\n"))
|
||||||
!= NULL) {
|
!= NULL) {
|
||||||
debug("adding search %s",
|
debug("adding search %s",
|
||||||
ptr);
|
ptr);
|
||||||
@@ -572,7 +574,7 @@ setup_system(void) {
|
|||||||
} else if ((strcasecmp(ptr, "domain") == 0) &&
|
} else if ((strcasecmp(ptr, "domain") == 0) &&
|
||||||
(fixeddomain[0] == 0 )){
|
(fixeddomain[0] == 0 )){
|
||||||
have_domain = ISC_TRUE;
|
have_domain = ISC_TRUE;
|
||||||
while ((ptr = strtok(NULL, " \t\r\n"))
|
while ((ptr = strsep(&input, " \t\r\n"))
|
||||||
!= NULL) {
|
!= NULL) {
|
||||||
search = isc_mem_allocate(
|
search = isc_mem_allocate(
|
||||||
mctx, sizeof(struct
|
mctx, sizeof(struct
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: nslookup.c,v 1.45 2000/09/14 22:03:52 mws Exp $ */
|
/* $Id: nslookup.c,v 1.46 2000/09/21 11:53:16 marka Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@@ -193,6 +193,7 @@ printsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
|
|||||||
dns_rdataset_t *rdataset = NULL;
|
dns_rdataset_t *rdataset = NULL;
|
||||||
dns_rdata_t rdata;
|
dns_rdata_t rdata;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
char *input;
|
||||||
|
|
||||||
UNUSED(query);
|
UNUSED(query);
|
||||||
UNUSED(headers);
|
UNUSED(headers);
|
||||||
@@ -256,41 +257,41 @@ printsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
|
|||||||
check_result(result,
|
check_result(result,
|
||||||
"dns_rdata_totext");
|
"dns_rdata_totext");
|
||||||
((char *)isc_buffer_used(b))[0]=0;
|
((char *)isc_buffer_used(b))[0]=0;
|
||||||
ptr = strtok(isc_buffer_base(b),
|
input = isc_buffer_base(b);
|
||||||
" \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\torigin = %s\n",
|
printf("\torigin = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tmail addr = %s\n",
|
printf("\tmail addr = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tserial = %s\n",
|
printf("\tserial = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\trefresh = %s\n",
|
printf("\trefresh = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tretry = %s\n",
|
printf("\tretry = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\texpire = %s\n",
|
printf("\texpire = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tminimum = %s\n",
|
printf("\tminimum = %s\n",
|
||||||
@@ -347,6 +348,7 @@ detailsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
|
|||||||
dns_rdataset_t *rdataset = NULL;
|
dns_rdataset_t *rdataset = NULL;
|
||||||
dns_rdata_t rdata;
|
dns_rdata_t rdata;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
char *input;
|
||||||
|
|
||||||
UNUSED(query);
|
UNUSED(query);
|
||||||
|
|
||||||
@@ -404,41 +406,41 @@ detailsection(dig_query_t *query, dns_message_t *msg, isc_boolean_t headers,
|
|||||||
check_result(result,
|
check_result(result,
|
||||||
"dns_rdata_totext");
|
"dns_rdata_totext");
|
||||||
((char *)isc_buffer_used(b))[0]=0;
|
((char *)isc_buffer_used(b))[0]=0;
|
||||||
ptr = strtok(isc_buffer_base(b),
|
input = isc_buffer_base(b);
|
||||||
" \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\torigin = %s\n",
|
printf("\torigin = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tmail addr = %s\n",
|
printf("\tmail addr = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tserial = %s\n",
|
printf("\tserial = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\trefresh = %s\n",
|
printf("\trefresh = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tretry = %s\n",
|
printf("\tretry = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\texpire = %s\n",
|
printf("\texpire = %s\n",
|
||||||
ptr);
|
ptr);
|
||||||
ptr = strtok(NULL, " \t\r\n");
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
break;
|
break;
|
||||||
printf("\tminimum = %s\n",
|
printf("\tminimum = %s\n",
|
||||||
@@ -758,19 +760,24 @@ setsrv(char *opt) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
get_next_command(void) {
|
get_next_command(void) {
|
||||||
char input[COMMSIZE];
|
char *buf;
|
||||||
char *ptr, *arg;
|
char *ptr, *arg;
|
||||||
|
char *input;
|
||||||
|
|
||||||
|
buf = isc_mem_allocate(mctx, COMMSIZE);
|
||||||
|
if (buf == NULL)
|
||||||
|
fatal("Memory allocation failure.");
|
||||||
fputs("> ", stderr);
|
fputs("> ", stderr);
|
||||||
ptr = fgets(input, COMMSIZE, stdin);
|
ptr = fgets(buf, COMMSIZE, stdin);
|
||||||
if (ptr == NULL) {
|
if (ptr == NULL) {
|
||||||
in_use = ISC_FALSE;
|
in_use = ISC_FALSE;
|
||||||
return;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
ptr = strtok(input, " \t\r\n");
|
input = buf;
|
||||||
|
ptr = strsep(&input, " \t\r\n");
|
||||||
if (ptr == NULL)
|
if (ptr == NULL)
|
||||||
return;
|
goto cleanup;
|
||||||
arg = strtok(NULL, " \t\r\n");
|
arg = strsep(&input, " \t\r\n");
|
||||||
if ((strcasecmp(ptr, "set") == 0) &&
|
if ((strcasecmp(ptr, "set") == 0) &&
|
||||||
(arg != NULL))
|
(arg != NULL))
|
||||||
setoption(arg);
|
setoption(arg);
|
||||||
@@ -780,21 +787,23 @@ get_next_command(void) {
|
|||||||
setsrv(arg);
|
setsrv(arg);
|
||||||
} else if (strcasecmp(ptr, "exit") == 0) {
|
} else if (strcasecmp(ptr, "exit") == 0) {
|
||||||
in_use = ISC_FALSE;
|
in_use = ISC_FALSE;
|
||||||
return;
|
goto cleanup;
|
||||||
} else if (strcasecmp(ptr, "help") == 0 ||
|
} else if (strcasecmp(ptr, "help") == 0 ||
|
||||||
strcasecmp(ptr, "?") == 0)
|
strcasecmp(ptr, "?") == 0)
|
||||||
{
|
{
|
||||||
printf("The '%s' command is not yet implemented.\n", ptr);
|
printf("The '%s' command is not yet implemented.\n", ptr);
|
||||||
return;
|
goto cleanup;
|
||||||
} else if (strcasecmp(ptr, "finger") == 0 ||
|
} else if (strcasecmp(ptr, "finger") == 0 ||
|
||||||
strcasecmp(ptr, "root") == 0 ||
|
strcasecmp(ptr, "root") == 0 ||
|
||||||
strcasecmp(ptr, "ls") == 0 ||
|
strcasecmp(ptr, "ls") == 0 ||
|
||||||
strcasecmp(ptr, "view") == 0)
|
strcasecmp(ptr, "view") == 0)
|
||||||
{
|
{
|
||||||
printf("The '%s' command is not implemented.\n", ptr);
|
printf("The '%s' command is not implemented.\n", ptr);
|
||||||
return;
|
goto cleanup;
|
||||||
} else
|
} else
|
||||||
addlookup(ptr);
|
addlookup(ptr);
|
||||||
|
cleanup:
|
||||||
|
isc_mem_free(mctx, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Reference in New Issue
Block a user