summaryrefslogtreecommitdiffstats
path: root/contrib/bind/bin/named/db_load.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/bin/named/db_load.c')
-rw-r--r--contrib/bind/bin/named/db_load.c151
1 files changed, 112 insertions, 39 deletions
diff --git a/contrib/bind/bin/named/db_load.c b/contrib/bind/bin/named/db_load.c
index 87bdaed..12d0197 100644
--- a/contrib/bind/bin/named/db_load.c
+++ b/contrib/bind/bin/named/db_load.c
@@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static const char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91";
-static const char rcsid[] = "$Id: db_load.c,v 8.113.2.1 2001/05/03 03:26:48 marka Exp $";
+static const char rcsid[] = "$Id: db_load.c,v 8.121 2001/11/12 21:22:22 marka Exp $";
#endif /* not lint */
/*
@@ -130,6 +130,7 @@ static const char rcsid[] = "$Id: db_load.c,v 8.113.2.1 2001/05/03 03:26:48 mark
#include <isc/eventlib.h>
#include <isc/logging.h>
#include <isc/memcluster.h>
+#include <isc/misc.h>
#include "port_after.h"
@@ -149,15 +150,16 @@ static int get_nxt_types(u_char *, FILE *, const char *);
static int parse_sig_rr(char *, int, u_char *, int, FILE *,
struct zoneinfo *, char *, u_int32_t ,
- enum context , enum transport , char **);
+ enum context, enum transport,
+ const char **);
static int parse_key_rr(char *, int, u_char *, int, FILE *,
- struct zoneinfo *, char *, enum context,
- enum transport, char **);
+ const char **);
-static int parse_cert_rr(char *, int, u_char *, int, FILE *, char **);
-static int parse_nxt_rr(char *, int, u_char *, int, FILE *,
+static int parse_cert_rr(char *, int, u_char *, int, FILE *,
+ const char **);
+static int parse_nxt_rr(char *, u_char *, int, FILE *,
struct zoneinfo *, char *, enum context,
- enum transport, char **);
+ enum transport, const char **);
static int wordtouint32_error = 0;
@@ -237,7 +239,7 @@ db_load(const char *filename, const char *in_origin,
char buf[MAXDATA];
char genlhs[MAXDNAME], genrhs[MAXDNAME];
u_char data[MAXDATA];
- int data_size = sizeof(data);
+ unsigned int data_size = sizeof(data);
int c, someclass, class, type, dbflags, dataflags, multiline = 0;
int slineno, i, errs, didinclude, ininclude, escape, success;
u_int32_t ttl, n, serial;
@@ -404,7 +406,7 @@ db_load(const char *filename, const char *in_origin,
ERRTOZ("$GENERATE missing LHS");
if (!getword(buf, sizeof(buf), fp, 0))
ERRTOZ("GENERATE missing TYPE");
- type = sym_ston(__p_type_syms, buf, &success);
+ type = res_nametotype(buf, &success);
if (success == 0 || type == ns_t_any) {
ns_info(ns_log_load,
"%s: Line %d: $GENERATE unknown type: %s.",
@@ -509,9 +511,10 @@ db_load(const char *filename, const char *in_origin,
empty_from, &rrcount, lineno,
filename);
if (c != OK) {
- if (c == CNAMEANDOTHER)
+ if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
}
+ db_detach(&dp);
}
endline(fp);
continue;
@@ -578,7 +581,7 @@ db_load(const char *filename, const char *in_origin,
}
/* Parse class (IN, etc) */
- someclass = sym_ston(__p_class_syms, buf, &success);
+ someclass = res_nametoclass(buf, &success);
if (success && someclass != zp->z_class) {
ns_info(ns_log_load,
"%s: Line %d: wrong class: %s.",
@@ -593,7 +596,7 @@ db_load(const char *filename, const char *in_origin,
}
/* Parse RR type (A, MX, etc) */
- type = sym_ston(__p_type_syms, buf, &success);
+ type = res_nametotype(buf, &success);
if (success == 0 || type == ns_t_any) {
ns_info(ns_log_load,
"%s: Line %d: Unknown type: %s.",
@@ -635,8 +638,52 @@ db_load(const char *filename, const char *in_origin,
case ns_t_ptr:
escape = 1;
break;
- default:
+ case ns_t_a:
+ case ns_t_md:
+ case ns_t_mf:
+ case ns_t_null:
+ case ns_t_hinfo:
+ case ns_t_mx:
+ case ns_t_txt:
+ case ns_t_afsdb:
+ case ns_t_x25:
+ case ns_t_isdn:
+ case ns_t_rt:
+ case ns_t_nsap:
+ case ns_t_nsap_ptr:
+ case ns_t_px:
+ case ns_t_gpos:
+ case ns_t_aaaa:
+ case ns_t_loc:
+ case ns_t_eid:
+ case ns_t_nimloc:
+ case ns_t_srv:
+ case ns_t_atma:
+ case ns_t_naptr:
+ case ns_t_kx:
+ case ns_t_dname:
+ case ns_t_sink:
+ escape = 0;
+ break;
+ case ns_t_opt:
+ case ns_t_tkey:
+ case ns_t_tsig:
+ case ns_t_ixfr:
+ case ns_t_axfr:
+ case ns_t_mailb:
+ case ns_t_maila:
+ case ns_t_any:
+ case ns_t_zxfr:
escape = 0;
+ ns_info(ns_log_load,
+ "%s: Line %d: meta type: %s.",
+ filename, lineno, p_type(type));
+ errs++;
+ break;
+ case ns_t_a6: /* not implemented */
+ default:
+ escape = 1;
+ break;
}
if (!getword(buf, sizeof buf, fp, escape))
break;
@@ -710,7 +757,8 @@ db_load(const char *filename, const char *in_origin,
ns_notice(ns_log_load,
"%s:%d: WARNING: new serial number < old (%lu < %lu)",
filename , lineno,
- zp->z_serial, serial);
+ (unsigned long)zp->z_serial,
+ (unsigned long)serial);
}
if (getttl(fp, filename, lineno, &n,
&multiline) <= 0) {
@@ -1004,7 +1052,7 @@ db_load(const char *filename, const char *in_origin,
case ns_t_key:
case ns_t_cert:
case ns_t_sig: {
- char *errmsg = NULL;
+ const char *errmsg = NULL;
int ret;
if (ttl == USE_MINIMUM) /* no ttl set */
ttl = 0;
@@ -1043,9 +1091,28 @@ db_load(const char *filename, const char *in_origin,
endline(fp);
break;
-
default:
- goto err;
+ if (strcmp(buf, "\\#") != 0)
+ goto err;
+ if (!getword(buf, sizeof buf, fp, 0) ||
+ !isdigit((unsigned char)buf[0]))
+ ERRTO("opaque length");
+ n = strtoul(buf, &cp, 10);
+ if (n > 0xffff || *cp != '\0')
+ ERRTO("opaque length");
+ multiline = 0;
+ i = isc_gethexstring(data, sizeof(data), n, fp,
+ &multiline);
+ if (i == -1)
+ ERRTO("opaque data read failed");
+ if (multiline) {
+ buf[0] = getnonblank(fp, filename, 1);
+ buf[1] = '\0';
+ if (buf[0] != ')')
+ ERRTO("\")\" expected");
+ multiline = 0;
+ }
+ endline(fp);
}
/*
* Ignore data outside the zone.
@@ -1072,8 +1139,9 @@ db_load(const char *filename, const char *in_origin,
&fcachetab : &hashtab,
empty_from, &rrcount, lineno,
filename);
- if (c == CNAMEANDOTHER)
+ if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
+ db_detach(&dp);
continue;
case ERRTOK:
@@ -1091,7 +1159,7 @@ db_load(const char *filename, const char *in_origin,
(dataflags & DB_F_HINT) ? &fcachetab : &hashtab,
empty_from, &rrcount, lineno, filename);
if (c != OK) {
- if (c == CNAMEANDOTHER)
+ if (c == CNAMEANDOTHER || c == NONGLUE)
errs++;
}
@@ -1130,7 +1198,7 @@ db_load(const char *filename, const char *in_origin,
while (filenames) {
fn = filenames;
filenames = filenames->next;
- freestr(fn->name);
+ fn->name = freestr(fn->name);
memput(fn, sizeof *fn);
}
if (errs != 0) {
@@ -1155,7 +1223,8 @@ db_load(const char *filename, const char *in_origin,
zp->z_ftime = 0;
}
#ifdef BIND_NOTIFY
- if (errs == 0 && (!ininclude) &&
+ if (errs == 0 && (!ininclude) && (initial_configuration == 0 ||
+ !NS_OPTION_P(OPTION_SUPNOTIFY_INITIAL)) &&
(zp->z_type == z_master || zp->z_type == z_slave))
ns_notify(zp->z_origin, zp->z_class, ns_t_soa);
#endif
@@ -1332,6 +1401,7 @@ getword(char *buf, size_t size, FILE *fp, int preserve) {
if (preserve == 1)
break;
case '\\':
+ case '#':
case '.':
case '0':
case '1':
@@ -1994,7 +2064,7 @@ get_nxt_types(u_char *data, FILE *fp, const char *filename) {
continue;
/* Parse RR type (A, MX, etc) */
- type = sym_ston(__p_type_syms, (char *)b, &success);
+ type = res_nametotype((char *)b, &success);
if ((!success) || type == ns_t_any) {
errs++;
ns_info(ns_log_db,
@@ -2064,7 +2134,8 @@ fixup_soa(const char *fn, struct zoneinfo *zp) {
static int
parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
FILE *fp, struct zoneinfo *zp, char *domain, u_int32_t ttl,
- enum context domain_ctx, enum transport transport, char **errmsg)
+ enum context domain_ctx, enum transport transport,
+ const char **errmsg)
{
/* The SIG record looks like this in the db file:
Name Cl SIG RRtype Algid [OTTL] Texp Tsig Kfoot Signer Sig
@@ -2097,7 +2168,7 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
u_int32_t origTTL;
enum context context;
time_t now;
- char *errtype = "SIG error";
+ const char *errtype = "SIG error";
int i, my_buf_size = MAXDATA, errs = 0;
@@ -2122,7 +2193,7 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
if (buf && buf_len == 0)
if (!getmlword((char*)buf, my_buf_size, fp, 0))
ERRTO("SIG record doesn't specify type");
- sig_type = sym_ston(__p_type_syms, buf, &success);
+ sig_type = res_nametotype(buf, &success);
if (!success || sig_type == ns_t_any) {
/*
* We'll also accept a numeric RR type,
@@ -2324,9 +2395,9 @@ parse_sig_rr(char *buf, int buf_len, u_char *data, int data_size,
}
static int
-parse_nxt_rr(char *buf, int buf_len, u_char *data, int data_size,
- FILE *fp, struct zoneinfo *zp, char *domain, enum context context,
- enum transport transport, char **errmsg)
+parse_nxt_rr(char *buf, u_char *data, int data_size, FILE *fp,
+ struct zoneinfo *zp, char *domain, enum context context,
+ enum transport transport, const char **errmsg)
{
/* The NXT record looks like:
@@ -2364,7 +2435,7 @@ parse_nxt_rr(char *buf, int buf_len, u_char *data, int data_size,
static int
parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
- FILE *fp, char **errmsg)
+ FILE *fp, const char **errmsg)
{
/* Cert record looks like:
* Type Key_tag Alg Cert
@@ -2375,7 +2446,7 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
*/
u_char *cp;
u_int32_t cert_type, key_tag, alg;
- char *errtype = "CERT parse error";
+ const char *errtype = "CERT parse error";
int certlen, i, n, success;
i = 0;
@@ -2386,6 +2457,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || cert_type > 0xFFFF)
ERRTO("CERT type out of range");
}
+ if (i + INT16SZ > data_size)
+ ERRTO("CERT no space");
PUTSHORT((u_int16_t)cert_type, cp);
i += INT16SZ;
@@ -2396,6 +2469,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || key_tag > 0xFFFF)
ERRTO("CERT KEY tag out of range");
+ if (i + INT16SZ > data_size)
+ ERRTO("CERT no space");
PUTSHORT((u_int16_t)key_tag, cp);
i += INT16SZ;
@@ -2408,7 +2483,8 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
if (wordtouint32_error || alg > 0xFF)
ERRTO("CERT KEY alg out of range");
}
-
+ if (i + 1 > data_size)
+ ERRTO("CERT no space");
data[i++] = (u_char)alg;
if (!getallwords(buf, buf_len, fp, 0)) {
@@ -2431,8 +2507,7 @@ parse_cert_rr(char *buf, int buf_len, u_char *data, int data_size,
static int
parse_key_rr(char *buf, int buf_len, u_char *data, int data_size,
- FILE *fp, struct zoneinfo *zp, char *domain, enum context context,
- enum transport transport, char **errmsg)
+ FILE *fp, const char **errmsg)
{
/* The KEY record looks like this in the db file:
* Name Cl KEY Flags Proto Algid PublicKeyData
@@ -2449,7 +2524,7 @@ parse_key_rr(char *buf, int buf_len, u_char *data, int data_size,
u_int32_t al, pr;
int nk, klen,i, n;
u_int32_t keyflags;
- char *errtype = "KEY error";
+ const char *errtype = "KEY error";
u_char *cp, *expstart;
u_int expbytes, modbytes;
@@ -2636,7 +2711,7 @@ int
parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
int data_size, FILE *fp, struct zoneinfo *zp,
char *domain, u_int32_t ttl, int type, enum context context,
- enum transport transport, char **errmsg)
+ enum transport transport, const char **errmsg)
{
int ret = -1;
@@ -2653,11 +2728,10 @@ parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
domain, ttl, context, transport, errmsg);
break;
case ns_t_key:
- ret = parse_key_rr(buf, buf_len, data, data_size, fp, zp,
- domain, context, transport, errmsg);
+ ret = parse_key_rr(buf, buf_len, data, data_size, fp, errmsg);
break;
case ns_t_nxt:
- ret = parse_nxt_rr(buf, buf_len, data, data_size, fp, zp,
+ ret = parse_nxt_rr(buf, data, data_size, fp, zp,
domain, context, transport, errmsg);
break;
case ns_t_cert:
@@ -2673,4 +2747,3 @@ parse_sec_rdata(char *buf, int buf_len, int buf_full, u_char *data,
endline(fp);
return (ret);
}
-
OpenPOWER on IntegriCloud