mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-29 21:47:59 +00:00
1354. [bug] nsupdate was extremely wasteful of memory.
This commit is contained in:
parent
fd0b3725dd
commit
a6211a2f23
2
CHANGES
2
CHANGES
@ -1,3 +1,5 @@
|
|||||||
|
1354. [bug] nsupdate was extremely wasteful of memory.
|
||||||
|
|
||||||
1355. [tuning] Reduce the number of events / quantum for zone tasks.
|
1355. [tuning] Reduce the number of events / quantum for zone tasks.
|
||||||
|
|
||||||
1354. [bug] Fix DNSSEC wildcard proof for CNAME/DNAME.
|
1354. [bug] Fix DNSSEC wildcard proof for CNAME/DNAME.
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id: nsupdate.c,v 1.119 2002/06/17 02:30:40 marka Exp $ */
|
/* $Id: nsupdate.c,v 1.120 2002/08/06 03:21:59 marka Exp $ */
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
@ -84,8 +84,7 @@ extern int h_errno;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define MAXCMD (4 * 1024)
|
#define MAXCMD (4 * 1024)
|
||||||
#define INITDATA (32 * 1024)
|
#define MAXWIRE (64 * 1024)
|
||||||
#define MAXDATA (64 * 1024)
|
|
||||||
#define PACKETSIZE ((64 * 1024) - 1)
|
#define PACKETSIZE ((64 * 1024) - 1)
|
||||||
#define INITTEXT (2 * 1024)
|
#define INITTEXT (2 * 1024)
|
||||||
#define MAXTEXT (128 * 1024)
|
#define MAXTEXT (128 * 1024)
|
||||||
@ -697,12 +696,12 @@ parse_rdata(char **cmdlinep, dns_rdataclass_t rdataclass,
|
|||||||
dns_rdata_t *rdata)
|
dns_rdata_t *rdata)
|
||||||
{
|
{
|
||||||
char *cmdline = *cmdlinep;
|
char *cmdline = *cmdlinep;
|
||||||
isc_buffer_t source, *buf = NULL;
|
isc_buffer_t source, *buf = NULL, *newbuf = NULL;
|
||||||
|
isc_region_t r;
|
||||||
isc_lex_t *lex = NULL;
|
isc_lex_t *lex = NULL;
|
||||||
dns_rdatacallbacks_t callbacks;
|
dns_rdatacallbacks_t callbacks;
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
dns_name_t *rn;
|
dns_name_t *rn;
|
||||||
int bufsz = INITDATA;
|
|
||||||
|
|
||||||
while (*cmdline != 0 && isspace((unsigned char)*cmdline))
|
while (*cmdline != 0 && isspace((unsigned char)*cmdline))
|
||||||
cmdline++;
|
cmdline++;
|
||||||
@ -713,33 +712,31 @@ parse_rdata(char **cmdlinep, dns_rdataclass_t rdataclass,
|
|||||||
rn = userzone;
|
rn = userzone;
|
||||||
else
|
else
|
||||||
rn = origin;
|
rn = origin;
|
||||||
do {
|
|
||||||
result = isc_lex_create(mctx, strlen(cmdline), &lex);
|
result = isc_lex_create(mctx, strlen(cmdline), &lex);
|
||||||
check_result(result, "isc_lex_create");
|
check_result(result, "isc_lex_create");
|
||||||
isc_buffer_init(&source, cmdline, strlen(cmdline));
|
isc_buffer_init(&source, cmdline, strlen(cmdline));
|
||||||
isc_buffer_add(&source, strlen(cmdline));
|
isc_buffer_add(&source, strlen(cmdline));
|
||||||
result = isc_lex_openbuffer(lex, &source);
|
result = isc_lex_openbuffer(lex, &source);
|
||||||
check_result(result, "isc_lex_openbuffer");
|
check_result(result, "isc_lex_openbuffer");
|
||||||
if (buf != NULL)
|
result = isc_buffer_allocate(mctx, &buf, MAXWIRE);
|
||||||
isc_buffer_free(&buf);
|
|
||||||
if (bufsz > MAXDATA) {
|
|
||||||
fprintf(stderr, "could not allocate enough "
|
|
||||||
"space for the rdata\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
result = isc_buffer_allocate(mctx, &buf, bufsz);
|
|
||||||
check_result(result, "isc_buffer_allocate");
|
check_result(result, "isc_buffer_allocate");
|
||||||
result = dns_rdata_fromtext(rdata, rdataclass,
|
result = dns_rdata_fromtext(rdata, rdataclass, rdatatype, lex,
|
||||||
rdatatype,
|
rn, ISC_FALSE, mctx, buf,
|
||||||
lex, rn, ISC_FALSE, mctx,
|
&callbacks);
|
||||||
buf, &callbacks);
|
|
||||||
bufsz *= 2;
|
|
||||||
isc_lex_destroy(&lex);
|
isc_lex_destroy(&lex);
|
||||||
} while (result == ISC_R_NOSPACE);
|
if (result == ISC_R_SUCCESS) {
|
||||||
dns_message_takebuffer(msg, &buf);
|
isc_buffer_usedregion(buf, &r);
|
||||||
if (result != ISC_R_SUCCESS) {
|
result = isc_buffer_allocate(mctx, &newbuf, r.length);
|
||||||
|
check_result(result, "isc_buffer_allocate");
|
||||||
|
isc_buffer_putmem(newbuf, r.base, r.length);
|
||||||
|
isc_buffer_usedregion(newbuf, &r);
|
||||||
|
dns_rdata_fromregion(rdata, rdataclass, rdatatype, &r);
|
||||||
|
isc_buffer_free(&buf);
|
||||||
|
dns_message_takebuffer(msg, &newbuf);
|
||||||
|
} else {
|
||||||
fprintf(stderr, "invalid rdata format: %s\n",
|
fprintf(stderr, "invalid rdata format: %s\n",
|
||||||
isc_result_totext(result));
|
isc_result_totext(result));
|
||||||
|
isc_buffer_free(&buf);
|
||||||
return (STATUS_SYNTAX);
|
return (STATUS_SYNTAX);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user