diff options
Diffstat (limited to 'contrib/bind/bin/named/db_load.c')
-rw-r--r-- | contrib/bind/bin/named/db_load.c | 151 |
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); } - |