This commit was generated by cvs2svn to compensate for changes in r26971,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Peter Wemm 1997-06-27 07:25:32 +00:00
commit 11e226045a
34 changed files with 758 additions and 528 deletions

View File

@ -1,4 +1,69 @@
$Id: CHANGES,v 8.52 1996/12/18 04:09:41 vixie Exp $
$Id: CHANGES,v 8.53 1997/06/01 20:34:25 vixie Exp vixie $
--- 4.9.6 released ---
805. [security] The server now caches only those response records
that are within the current query domain. (From BIND-8)
804. [security] another buffer overrun plugged, this time in res_search().
803. [bug] core leak fixed in ns_resp.c (twice).
802. [proto] RTT sorting was defeating round robin for nameserver A RRs.
801. [bug] res_send() now considers FD_SETSIZE usefully.
800. [bug] formatting errors corrected in precsize_aton().
799. [bug] now that inet_pton() is safe, we call it a little more often.
798. [bug] file descriptor leak plugged on systems without SO_LINGER.
797. [bug] named-xfer signal, exit, and stub bugs fixed.
798. [bug] tokens with merely _leading_ digits won't be taken as TTL's.
797. [port] Motorola 88K port integrated.
796. [doc] some spelling errors, omissions, and misdirections removed.
795. [security] "dig @0 version.bind chaos" no longer shows user names.
794. [bug] make d_rcnt larger; reorder databuf for packing efficiency.
793. [bug] we forgot to reset a pointer after a realloc (named_xfer.c).
792. [bug] RRset TTL was not being maintained coherently.
791. [doc] BOG was off by one in its ndots description.
790. [whining] preserve forwarded RRset order for one last release.
789. [bug] TCP timeouts were leaking file descriptors.
788. [bug] AXFR needs 64K to fit in, not PACKETSZ.
787. [bug] dangling CNAMEs caused erroneous forwarded responses.
786. [protocol] better checking of incoming additional data.
785. [bug] forced reload of parents after zone expiry had problems.
784. [bug] SRV RR's were not decoded properly.
783. [bug] BUFSIZ is less than PACKETSZ on some systems (overruns).
782. [bug] named could spin on invalid TCP input formats (ns_main.c).
781. [bug] short names of all hex digits were being handled incorrectly.
780. [bug] doupdate was handling BOGUSNS and syslog messages incorrectly.
779. [bug] named-xfer can now handle RFC1035-compliant zone transfers.
778. [security] wire protocol names now limited to MAXCDNAME octets.
777. [port] res_send name redefinition now covered by BIND_RES_POSIX3.
--- 4.9.5-p1 released ---

View File

@ -1,4 +1,4 @@
$Id: INSTALL,v 8.7 1996/11/11 06:36:40 vixie Exp $
$Id: INSTALL,v 8.8 1997/06/01 20:34:25 vixie Exp vixie $
THE FILES:
----------
@ -39,14 +39,14 @@ sure you turn any links into files:
2. (optional) If you have a typical site, you should find yourself only
editing Makefile and conf/options.h. Make backups of them now:
mv Makefile Makefile.tmp
cp Makefile.tmp Makefile ; rm Makefile.tmp
chmod u+w Makefile
mv conf/options.h conf/options.h.tmp
cp conf/options.h.tmp conf/options.h ; rm conf/options.h.tmp
mv conf/options.h conf/options.h.dist
cp conf/options.h.dist conf/options.h
chmod u+w conf/options.h
mv Makefile Makefile.dist
cp Makefile.dist Makefile
chmod u+w Makefile
3. Edit "conf/options.h" and turn on any options that you want. The
defaults are pretty reasonable for most installations.
@ -62,7 +62,7 @@ path if "make depend" fails and you think bin/mkdep will help you out.
*** NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE ***
The next step (#5) will burn down files which were supplied with
The next step (#6) will burn down files which were supplied with
your operating system. You should run the suggested "-n" first
and make sure you have saved any files you want to save.
@ -82,16 +82,18 @@ how to do it.
HOW TO GET HELP:
----------------
The "bind@uunet.uu.net" mailing list was created especially for people
to talk about and ask questions about installation, maintenance, etc.
It is highly recommended that you first help yourself by reading
the BOG (doc/bog) or a book on DNS and BIND.
The "bind-users@vix.com" mailing list was created especially for people to
talk about and ask questions about installation, maintenance, etc. It is
highly recommended that you first help yourself by reading the BOG (doc/bog)
or a book on DNS and BIND.
To be added to this mailing list, send mail to
bind-request@uunet.uu.net
To be added to this mailing list, send mail to <bind-users-request@vix.com>
Note that the bind-users mailing list is also available on Usenet as
comp.protocols.dns.bind
and that we would all prefer that you read it that way if you possibly can.
This INSTALL was originally written on 15Jul94 by Tom Limoncelli
<tal@bell-labs.org> Minor changes 23Dec95 by Christopher Davis
<ckd@kei.com> and then by Tom Limoncelli 16Oct96.
This INSTALL was...
originally written on 15Jul94 by Tom Limoncelli <tal@bell-labs.com>
changed in minor ways 23Dec95 by Christopher Davis <ckd@kei.com>
and then changed by Tom Limoncelli again 16Oct96.

View File

@ -1,10 +1,8 @@
# Makefile for BIND>=4.9 top level
# vixie@decwrl December, 1992 [original]
#
# $Id: Makefile,v 8.48 1996/11/26 10:11:13 vixie Exp $
# $Id: Makefile,v 8.49 1997/06/01 20:34:25 vixie Exp vixie $
## ++Copyright++ 1989
## -
## Copyright (c) 1989
## The Regents of the University of California. All rights reserved.
##
@ -35,7 +33,7 @@
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.
## -
##
## Portions Copyright (c) 1993 by Digital Equipment Corporation.
##
## Permission to use, copy, modify, and distribute this software for any
@ -53,10 +51,8 @@
## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
## SOFTWARE.
## -
## --Copyright--
VER = 4.9.5-P1
VER = 4.9.6-REL
SHELL = /bin/sh
MAKE = make
DESTDIR =
@ -301,7 +297,7 @@ PIC =
#otherwise uncomment the next line and hope for the best
#CC = cc $(CPPFLAGS)
#CDEBUG = -g
#CPPPFLAGS = -DSVR4 -D_SYS_STREAM_H
#CPPPFLAGS = -DSVR4 -D_SYS_STREAM_H -DMAXHOSTNAMELEN=256
#CPPFLAGS = $(CPPPFLAGS) $(SOLCOMPAT)
#INDOT = in.
#XFER_INDOT =
@ -824,6 +820,44 @@ PIC =
#MANROFF = ( tbl | nroff -man )
#MANDIR = man
#(MOTOROLA Rel FH40.4x ,m88k)
#Support for Motorola m88k machines. The compiler supports
#three compile flags for processor type
# -F88000 the generic 88k
# -F88100 for the 88100 chip
# -F88110 for the 88110 chip
#
# Set to which version of CPU is being used. This was
# compiled on a 197DP with the -F88110 flag
# Earlier boards (187 and V/88) need 88100 and 88000
#
# See /usr/ccs/lib/.compilerc
#
#CC = /usr/ccs/bin/cc $(CPPFLAGS)
#CDEBUG = -g -O
#CPPFLAGS = -F88110 -D_SYS_STREAM_H -DSVR4
#INDOT -in.
#XFER_INDOT =
#LEX = lex
#LIBS = -lsocket -lnsl -ll
#DESTBIN = /usr/bin
#DESTSBIN = /usr/sbin
#DESTEXEC = /etc
#DESTHELP = /usr/lib
#DESTLIB = /usr/lib
#DESTINC = /usr/include
#DESTMAN = /usr/share/man
#PIDDIR = /etc
#LDS = @:
#LDFLAGS=-s
#RANLIB = touch
#COMPINCL = compat/include
#CATEXT = $$$$N
#INSTALL_COMPAT = install-compat
#INSTALL = /usr/ucb/install
#PS =ps -p
#IOT = IOT
####################################################################
############ no user servicable parts beyond this point ############
####################################################################

View File

@ -1,228 +1,21 @@
The official place to get BIND is <URL:ftp://ftp.vix.com/pub/bind/release>.
The official version of BIND is now 8.1.1. This is 4.9.6, the last of 4.*
which we are releasing since it has some important security bugs fixed.
The official place to get BIND is <URL:ftp://ftp.isc.org/isc/bind/src>.
The official mailing lists are: bind-users@vix.com - users/admins
(use *-request@* for admin mail) bind-workers@vix.com - developers
The official Usenet newsgroups are: comp.protocols.tcp-ip.domains
comp.protocols.dns.bind
comp.protocols.dns.ops
comp.protocols.dns.std
BIND is currently sponsored by: The Internet Software Consortium
(send to <info@isc.org> for details.)
----- 4.9.3 BETA33 - December, 1995 - paul@vix.com
Take a look around in doc/misc/ and contrib/. Reread INSTALL. Have fun.
----- 4.9.3 BETA11, BETA12 release - December, 1994 - paul@vix.com
If you maintain a BSD or are otherwise running a 4.4BSD-based system and want
to integrate BIND into it, check out BSD/README.
BIND is currently maintained by: The Internet Software Consortium
(see <URL:http://www.isc.org/isc>.)
Read the top of CHANGES for interesting stuff.
Don't forget to purge all your secondary zone files before upgrading to this
BIND if your existing one came from a vendor.
The NOTIFY feature is turned off by default, but it's really cool and you
should consider turning it on if you are willing to risk having it not work
after the RFC process is complete (if the protocol has to change at all.)
It already does not conform to the draft protocol so you should consider it
"experimental" even if it happens to work fine.
----- 4.9.3 BETA10 release - August, 1994 - paul@vix.com
I recommend reading this ENTIRE FILE before you attempt to build or use BIND.
However, you can get started quickly by scanning down this file for "QUICK" in
the right margin and just reading those sections. You can also look at the
INSTALL file. You should look at doc/info/* if you have trouble building.
There are at least two known bugs in this BIND:
1. if you have two authoritative zones (primary or secondary) where
one is a subzone of the other, e.g.,
primary pa.dec.com z/pa.dec.com
primary dec.com z/dec.com
and you remove or comment out the subzone (pa.dec.com in our example)
and SIGHUP named, the delegation and other RR's at "pa.dec.com" will
be missing from your cache. to avoid this, you should "named.restart"
rather than SIGHUP ("named.reload") when making changes of this kind.
2. the /HS qualifier doesn't work on "cache" directives. you will have
to put your hesiod root information into your main "root.cache" file.
Also, you may find that your utilities will not link with this -lresolv
unless you also install lib44bsd.a and link with -lresolv -l44bsd. This
is because older systems do not include inet_aton() and other functions.
----- 4.9.3 BETA6 release - June, 1994 - paul@vix.com
Several private beta test releases have come and gone, and we've fixed a
number of things. See CHANGES for details.
There is a new Sun Shared Library update mechanism in place, and it works
quite well. See shres/*.
Versions of NSLOOKUP up through BIND 4.8.3's used IQUERY to ask the local
server for information about the server's own name. I assume that this was
done in a "what the heck, nothing uses these, how can we contrive a need?"
sort of spirit. I removed this code as of BIND 4.9's NSLOOKUP and had it
use the standard gethostbyaddr() mechanisms (which depend on normal queries
of PTR data). Disabling INVQ and putting "options fake-iquery" in the boot
file will cause IQUERY to be answered bogusly but in a way that old nslookup
programs won't trip on. INVQ is disabled by default in conf/options.h.
----- 4.9.3 BETA2 release - June, 1994 - paul@vix.com
News flash! BIND development is now funded by the Internet Software Consortium.
Look at CHANGES to see what's new. Check out doc/misc to see some interesting
papers from Purdue (and Bell Labs, if we're lucky) on DNS security that
motivated many of the security-related changes present in this release.
Check out shres/Makefile for SunOS4 shared library support.
INVQ now defaults to "undef". See OPTIONS and conf/options.h.
ALLOW_UPDATES is no longer available, and will be removed next release.
You should look hard at the SENSIBLE_DOTS option and convert your serial
numbers either to "sensible" ones or ones without dots (YYYYMMDD## preferred).
SENSIBLE_DOTS will be the default in the next release.
NCACHE and VALIDATE are _working_ now.
Read the BOG! It's been updated since the previous release.
If you are a vendor and are including some or all of this code in your product,
please drop me a line to let me know. I field a lot of questions about BIND
and it is helpful for me to know which vendor releases contain which versions
of BIND. It's also helpful for me to have contacts within the engineering
groups of the various vendors, since when I find a heinous bug I can let you
know.
----- 4.9.2 FINAL (940221) release - February, 1994 - paul@vix.com
If you look at the last entry in TODO, you'll see that there are a lot
of things in the queue waiting to go in. However, I'm holding the line
so that 4.9.2-FINAL can be the same as what goes out with 4.4BSD-Lite.
I expect to open 4.9.3-ALPHA fairly soon, with patches comprising new
work; 4.9.2-FINAL will have patches released for it only to correct bugs.
The official way to get BIND 4.9.2 is: ftp gatekeeper.dec.com OUT OF DATE!!!
cd pub/misc/vixie OUT OF DATE!!!
binary OUT OF DATE!!!
get bind-940221.tar.gz OUT OF DATE!!!
or: get bind-940221.tar.Z OUT OF DATE!!!
The official mailing lists are: bind-users@vix.com - users/admins
(use *-request for admin mail) bind-workers@vix.com - developers
The official Usenet newsgroups are: comp.protocols.tcp-ip.domains
My official e-mail address is: paul@vix.com
----- 4.9.2 BETA5 (931205) release - December, 1993 - paul@vix.com
no comments; see CHANGES file.
----- 4.9.2 BETA4 (931104) release - November, 1993 - paul@vix.com
All reported portability problems have been fixed. All core dumps have
had changes made for them and we are ready to have them tested again. As
usual, I am running this in production on my own zones and I am rather
confident in it. Note, again, that this is a BETA release and you should
not put it up for anon-ftp or otherwise republish it in any way.
----- 4.9.2 ALPHA2 (930908) release - September, 1993 - paul@vix.com
4.9.2 has fixes for most of the bugs that smb@bellcore's white paper talked
about, and CERT is going to be knocking on vendor's doors to get it shipped
with as many operating systems as possible.
----- 4.9.2 ALPHA1 (930506) release - July, 1993 - Paul Vixie <paul@vix.com>
I don't work for DEC any more, so note the new e-mail address. The old
<bind-4.9@pa.dec.com> list has been moved to <bind-workers@vix.com>; if
you intend to help hack BIND and you want to be advised of alpha-testing
releases, send mail to <bind-workers-request@vix.com> and ask to be added
to the list.
Note that 4.9.1 was an interrim, nonpublished release intended to catch
the porting changes needed for 4.4BSD. It never really existed separately.
----- 4.9 release - April, 1993 - Paul Vixie <vixie@pa.dec.com>
For information on what's new in 4.9, see OPTIONS and CHANGES. Also note
that the man page for named(8) in man/named.8, and the entire Bind Operations
Guide in doc/BOG/*, has been updated for 4.9. Both make excellent reading.
Those of you who are thinking of adding features should first read TODO to
see if someone else has already indicated an intention to work on the same
thing. If your feature is significant you should ask <bind-workers@vix.com>
before you hack, if for no other reason than to tell other maintainers to
expect a patch soon.
Note that the resolver has a number of routines that may already be present
on your system. Efforts have been made to avoid generating code for them on
systems where they aren't needed; don't worry about them if they're
generated unneccessarily since the linker will sort things out.
This software is protected under the U C Regents' copyright. Changes made
by or released through Digital Equipment Corporation are subject to a
subsidiary copyright. The entire copyright is as follows:
++Copyright++ 1989
-
Copyright (c) 1989
The Regents of the University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. All advertising materials mentioning features or use of this software
must display the following acknowledgement:
This product includes software developed by the University of
California, Berkeley and its contributors.
4. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software
without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-
Portions Copyright (c) 1993 by Digital Equipment Corporation.
Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies, and that
the name of Digital Equipment Corporation not be used in advertising or
publicity pertaining to distribution of the document or software without
specific, written prior permission.
THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
SOFTWARE.
-
--Copyright--
To build this: QUICK
(on SUNOS, use the BSD build environment or you will

View File

@ -1,7 +1,7 @@
/* portability.h - include or define things that aren't present on all systems
* vixie@decwrl 26dec92 [new]
*
* $Id: portability.h,v 8.20 1996/11/26 10:11:16 vixie Exp $
* $Id: portability.h,v 8.21 1997/06/01 20:34:27 vixie Exp $
*/
/*
@ -189,7 +189,8 @@
#endif
#if defined(_POSIX_SOURCE) || defined(__sgi) || defined(__ultrix) || \
defined(__hpux) || (defined(BSD) && (BSD >= 199103)) || defined(sun)
defined(__hpux) || (defined(BSD) && (BSD >= 199103)) || \
defined(sun) || defined(__m88k__)
# define USE_POSIX
#endif
@ -605,6 +606,16 @@ extern u_long htonl __P((u_long)), ntohl __P((u_long));
# define __BIND_RES_TEXT
#endif
/*
* Motorola FH40.43 and FH40.44 need specific macros for
* get/settimeofday as only one argument seems to be accepted
* by the compiler. NULL generates compile errors
*/
#if defined(__m88k__) && defined(__unix__)
# define gettimeofday(tp, tzp) gettimeofday(tp)
# define settimeofday(tp, tzp) settimeofday(tp)
#endif
/*
* We need to know the IPv6 address family number even on IPv4-only systems.
* Note that this is NOT a protocol constant, and that if the system has its

View File

@ -543,7 +543,7 @@ resolver variable. Supported options at this time are:
sets the \s-1RES_DEBUG\s+1 bit in \fB_res.options\fP.
.ip \fBndots:\fP\fIn\fP
sets the lower threshold (measured in ``number of dots'') on names given to
\fIres_query\fP() such that names with more than this number of dots will be
\fIres_query\fP() such that names with at least this number of dots will be
tried as absolute names before any \fIlocal-domain\fP or \fIsearch-list\fP
processing is done. The default for this internal variable is ``1''.
.\" .pp

View File

@ -55,7 +55,7 @@
/*
* @(#)netdb.h 8.1 (Berkeley) 6/2/93
* $Id: netdb.h,v 8.7 1996/05/09 05:59:09 vixie Exp $
* $Id: netdb.h,v 8.8 1997/06/01 20:34:32 vixie Exp $
*/
#ifndef _NETDB_H_
@ -167,4 +167,12 @@ struct rpcent *getrpcbyname(), *getrpcbynumber(), *getrpcent();
#endif /* __GNU_LIBRARY__ */
#endif /* sun */
/*
* The Motorola kernel will only support 64 characters for hostname
* also defined in /usr/ucbinclude/netdb.h
*/
#ifdef __m88k__
#define MAXHOSTNAMELEN 64
#endif
#endif /* !_NETDB_H_ */

View File

@ -55,7 +55,7 @@
/*
* @(#)resolv.h 8.1 (Berkeley) 6/2/93
* $Id: resolv.h,v 8.17 1996/11/26 10:11:20 vixie Exp $
* $Id: resolv.h,v 8.18 1997/06/01 20:34:32 vixie Exp $
*/
#ifndef _RESOLV_H_
@ -225,7 +225,6 @@ extern const struct res_sym __p_type_syms[];
#define dn_count_labels __dn_count_labels
#define dn_comp __dn_comp
#define res_randomid __res_randomid
#define res_send __res_send
#define res_isourserver __res_isourserver
#define res_nameinquery __res_nameinquery
#define res_queriesmatch __res_queriesmatch
@ -238,6 +237,7 @@ extern const struct res_sym __p_type_syms[];
#define res_search __res_search
#define res_querydomain __res_querydomain
#define res_mkquery __res_mkquery
#define res_send __res_send
#endif
__BEGIN_DECLS

View File

@ -1,4 +1,4 @@
.\" $Id: dig.1,v 8.1 1994/12/15 06:24:10 vixie Exp $
.\" $Id: dig.1,v 8.2 1997/06/01 20:34:33 vixie Exp $
.\"
.\" ++Copyright++ 1993
.\" -
@ -191,7 +191,7 @@ After query returns, execute a
.IR ping (@SYS_OPS_EXT@)
command
for response time comparison. This rather
unelegantly makes a call to the shell. The last
inelegantly makes a call to the shell. The last
three lines of statistics is printed for the
command:
.sp 1

View File

@ -1,14 +1,15 @@
/*
* @(#)Version.c 4.9 (Berkeley) 7/21/90
* $Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $
* $Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $
*/
#ifndef lint
char sccsid[] = "@(#)named %VERSION% %WHEN% %WHOANDWHERE%";
char rcsid[] = "$Id: Version.c,v 8.1 1994/12/15 06:24:14 vixie Exp $";
char rcsid[] = "$Id: Version.c,v 8.2 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
char Version[] = "named %VERSION% %WHEN%\n\t%WHOANDWHERE%";
char ShortVersion[] = "%VERSION%";
#ifdef COMMENT

View File

@ -1,6 +1,6 @@
/*
* from db.h 4.16 (Berkeley) 6/1/90
* $Id: db_defs.h,v 8.5 1996/08/27 08:33:23 vixie Exp $
* $Id: db_defs.h,v 8.6 1997/06/01 20:34:34 vixie Exp $
*/
/*
@ -76,6 +76,9 @@
*/
struct databuf {
struct databuf *d_next; /* linked list */
#ifdef STATS
struct nameser *d_ns; /* NS from whence this came */
#endif
u_int32_t d_ttl; /* time to live */
/* if d_zone == DB_Z_CACHE, then
* d_ttl is actually the time when
@ -91,12 +94,9 @@ struct databuf {
int16_t d_class; /* class number */
int16_t d_type; /* type number */
int16_t d_size; /* size of data area */
u_int32_t d_rcnt;
#ifdef NCACHE
unsigned d_rcode :4; /* rcode added for negative caching */
#endif
unsigned d_rcnt :12;
#ifdef STATS
struct nameser *d_ns; /* NS from whence this came */
#endif
u_int16_t d_nstime; /* NS response time, milliseconds */
u_char d_data[sizeof(char*)]; /* malloc'd (padded) */

View File

@ -1,6 +1,6 @@
/* db_proc.h - prototypes for functions in db_*.c
*
* $Id: db_func.h,v 8.12 1996/09/22 00:13:10 vixie Exp $
* $Id: db_func.h,v 8.13 1997/06/01 20:34:34 vixie Exp $
*/
/* ++from db_update.c++ */
@ -11,6 +11,7 @@ extern int db_update __P((char name[],
struct hashbuf *htp)),
db_cmp __P((struct databuf *,struct databuf *)),
findMyZone __P((struct namebuf *np, int class));
extern void fixttl __P((struct databuf *dp));
/* --from db_update.c-- */
/* ++from db_reload.c++ */

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_load.c 4.38 (Berkeley) 3/2/91";
static char rcsid[] = "$Id: db_load.c,v 8.31 1996/12/18 04:09:48 vixie Exp $";
static char rcsid[] = "$Id: db_load.c,v 8.32 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -323,6 +323,13 @@ db_load(filename, in_origin, zp, def_domain)
n = n * 10 + (*cp++ - '0');
}
while (isdigit(*cp));
if (*cp != '\0') {
errs++;
syslog(LOG_INFO,
"%s: Line %d: bad TTL: %s.\n",
filename, lineno, buf);
break;
}
if (zp->z_type == Z_CACHE) {
/* this allows the cache entry to age */
/* while sitting on disk (powered off) */
@ -1988,7 +1995,7 @@ get_netlist(fp, netlistp, allow, print_tag)
char *print_tag;
{
struct netinfo *ntp, **end;
char buf[BUFSIZ], *maskp;
char buf[MAXDNAME], *maskp;
struct in_addr ina;
for (end = netlistp; *end; end = &(**end).next)

View File

@ -1,5 +1,5 @@
#ifndef LINT
static char rcsid[] = "$Id: db_secure.c,v 8.6 1996/05/17 09:10:46 vixie Exp $";
static char rcsid[] = "$Id: db_secure.c,v 8.7 1997/06/01 20:34:34 vixie Exp $";
#endif
/* this file was contributed by Gregory Neil Shapiro of WPI in August 1993 */
@ -29,7 +29,7 @@ build_secure_netlist(zp)
struct zoneinfo *zp;
{
struct netinfo *ntp = NULL, **netlistp, **end;
char buf[BUFSIZ];
char buf[MAXDNAME];
struct hashbuf *htp;
struct namebuf *snp;
struct databuf *dp;

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)db_update.c 4.28 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: db_update.c,v 8.18 1996/10/08 04:51:03 vixie Exp $";
static char rcsid[] = "$Id: db_update.c,v 8.19 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -71,8 +71,6 @@ static char rcsid[] = "$Id: db_update.c,v 8.18 1996/10/08 04:51:03 vixie Exp $";
#include "named.h"
static void fixttl __P((struct databuf *));
/* int
* isRefByNS(name, htp)
* recurse through all of `htp' looking for NS RR's that refer to `name'.
@ -637,7 +635,7 @@ db_update(name, odp, newdp, flags, htp)
return (OK);
}
static void
void
fixttl(dp)
register struct databuf *dp;
{

View File

@ -92,7 +92,7 @@ char copyright[] =
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)named-xfer.c 4.18 (Berkeley) 3/7/91";
static char rcsid[] = "$Id: named-xfer.c,v 8.22 1996/12/02 09:17:21 vixie Exp $";
static char rcsid[] = "$Id: named-xfer.c,v 8.23 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -152,14 +152,27 @@ static char *ProgName;
static void usage __P((const char *));
static int getzone __P((struct zoneinfo *, u_int32_t, int)),
print_output __P((u_char *, int, u_char *)),
print_output __P((struct zoneinfo *, u_int32_t,
u_char *, int, u_char *)),
netread __P((int, char *, int, int));
static SIG_FN read_alarm __P(());
static SIG_FN term_handler __P(());
static const char *soa_zinfo __P((struct zoneinfo *, u_char *, u_char*));
struct zoneinfo zp_start, zp_finish;
extern char *optarg;
extern int optind, getopt();
void
cleanup_for_exit() {
#ifdef DEBUG
if (!debug)
#endif
(void) unlink(tmpname);
}
void
main(argc, argv)
int argc;
@ -451,11 +464,8 @@ main(argc, argv)
/* fall through */
case XFER_TIMEOUT:
case XFER_FAIL:
#ifdef DEBUG
if (!debug)
#endif
(void) unlink(tmpname);
exit(result); /* error or timeout */
cleanup_for_exit();
exit(result);
}
/*NOTREACHED*/
}
@ -493,7 +503,12 @@ usage(msg)
#define DEF_DNAME '\001' /* '\0' means the root domain */
/* XXX: The following variables should probably all be "static" */
int minimum_ttl = 0, got_soa = 0;
u_int32_t minimum_ttl = 0;
int soa_cnt = 0;
#ifdef STUBS
int ns_cnt = 0;
#endif
int query_type = 0;
int prev_comment = 0; /* was previous record a comment? */
char zone_top[MAXDNAME]; /* the top of the zone */
char prev_origin[MAXDNAME]; /* from most recent $ORIGIN line */
@ -509,14 +524,13 @@ getzone(zp, serial_no, port)
HEADER *hp;
u_int16_t len;
u_int32_t serial;
int s, n, l, nscnt, soacnt, error = 0;
int s, n, l, error = 0;
u_int cnt;
u_char *cp, *nmp, *eom, *tmp ;
u_char *buf = NULL;
u_int bufsize;
char name[MAXDNAME], name2[MAXDNAME];
struct sockaddr_in sin;
struct zoneinfo zp_start, zp_finish;
#ifdef POSIX_SIGNALS
struct sigaction sv, osv;
#else
@ -548,11 +562,19 @@ getzone(zp, serial_no, port)
/* sv.sa_flags = SA_ONSTACK; */
sigfillset(&sv.sa_mask);
(void) sigaction(SIGALRM, &sv, &osv);
bzero((char *)&sv, sizeof sv);
sv.sa_handler = (SIG_FN (*)()) term_handler;
sigfillset(&sv.sa_mask);
(void) sigaction(SIGTERM, &sv, &osv);
#else
bzero((char *)&sv, sizeof sv);
sv.sv_handler = read_alarm;
sv.sv_mask = ~0;
(void) sigvec(SIGALRM, &sv, &osv);
bzero((char *)&sv, sizeof sv);
sv.sv_handler = term_handler;
sv.sv_mask = ~0;
(void) sigvec(SIGTERM, &sv, &osv);
#endif
strcpy(zone_top, zp->z_origin);
@ -781,8 +803,10 @@ getzone(zp, serial_no, port)
dprintf(1, (ddt, "need update, serial %lu\n",
(u_long)zp_start.z_serial));
hp = (HEADER *) buf;
soacnt = 0;
nscnt = 0;
soa_cnt = 0;
#ifdef STUBS
ns_cnt = 0;
#endif
gettime(&tt);
for (l = Version; l; l = nl) {
size_t len;
@ -805,21 +829,19 @@ getzone(zp, serial_no, port)
inet_ntoa(sin.sin_addr),
ctimel(tt.tv_sec));
for (;;) {
if ((soacnt == 0) || (zp->z_type == Z_STUB)) {
int type;
if ((soa_cnt == 0) || (zp->z_type == Z_STUB)) {
#ifdef STUBS
if (zp->z_type == Z_STUB) {
if (!soacnt)
type = T_SOA;
else if (!nscnt)
type = T_NS;
else
type = T_SOA;
if (soa_cnt == 1 &&
ns_cnt == 0)
query_type = T_NS;
else
query_type = T_SOA;
} else
#endif
type = T_AXFR;
query_type = T_AXFR;
n = res_mkquery(QUERY, zp->z_origin,
curclass, type,
curclass, query_type,
NULL, 0,
NULL, buf, bufsize);
if (n < 0) {
@ -827,7 +849,7 @@ getzone(zp, serial_no, port)
#ifdef STUBS
if (zp->z_type == Z_STUB)
syslog(LOG_INFO,
(type == T_SOA)
(query_type == T_SOA)
? "zone %s: res_mkquery T_SOA failed"
: "zone %s: res_mkquery T_NS failed",
zp->z_origin);
@ -862,13 +884,27 @@ getzone(zp, serial_no, port)
* Receive length & response
*/
if (netread(s, (char *)buf, INT16SZ,
(soacnt == 0) ?300 :XFER_TIMER)
(soa_cnt == 0) ?300 :XFER_TIMER)
< 0) {
error++;
break;
}
if ((len = _getshort(buf)) == 0)
break;
if (len > bufsize) {
buf = (u_char *)realloc(buf, len);
if (buf == NULL) {
syslog(LOG_INFO,
"malloc(%u) failed for packet from server [%s], zone %s\n",
len,
inet_ntoa(sin.sin_addr),
zp->z_origin);
error++;
break;
}
bufsize = len;
}
hp = (HEADER *)buf;
eom = buf + len;
if (netread(s, (char *)buf, len, XFER_TIMER)
< 0) {
@ -907,30 +943,49 @@ getzone(zp, serial_no, port)
if (zp->z_type == Z_STUB) {
ancount = ntohs(hp->ancount);
for (n = cnt = 0 ; cnt < ancount ; cnt++) {
n = print_output(buf, bufsize, cp);
n = print_output(zp, serial_no, buf,
len, cp);
if (n < 0)
break;
cp += n;
}
/*
* If we've processed the answer section and
* didn't get any useful answers, bail out.
*/
if (query_type == T_SOA && soa_cnt == 0) {
syslog(LOG_ERR,
"stubs: no SOA in answer");
error++;
break;
}
if (query_type == T_NS && ns_cnt == 0) {
syslog(LOG_ERR,
"stubs: no NS in answer");
error++;
break;
}
if (n >= 0 && hp->nscount) {
/* we should not get here */
ancount = ntohs(hp->nscount);
for (cnt = 0 ; cnt < ancount ; cnt++) {
n = print_output(buf, bufsize, cp);
if (n < 0)
break;
cp += n;
for (cnt = 0; cnt < ancount; cnt++) {
n = print_output(zp,
serial_no,
buf, len, cp);
if (n < 0)
break;
cp += n;
}
}
ancount = ntohs(hp->arcount);
for (cnt = 0 ; n >= 0 && cnt < ancount ; cnt++) {
n = print_output(buf, bufsize, cp);
for (cnt = 0; n >= 0 && cnt < ancount; cnt++) {
n = print_output(zp, serial_no, buf,
len, cp);
cp += n;
}
if (n < 0) {
syslog(LOG_INFO,
"print_output: unparseable answer (%d), zone %s",
hp->rcode, zp->z_origin);
"print_output: unparseable answer (%d), zone %s",
hp->rcode, zp->z_origin);
error++;
break;
}
@ -941,12 +996,12 @@ getzone(zp, serial_no, port)
error++;
break;
}
} else {
#endif /*STUBS*/
ancount = ntohs(hp->ancount);
for (n = cnt = 0; cnt < ancount; cnt++) {
n = print_output(buf, bufsize, cp);
n = print_output(zp, serial_no, buf,
len, cp);
if (n < 0)
break;
cp += n;
@ -969,98 +1024,10 @@ getzone(zp, serial_no, port)
#ifdef STUBS
}
#endif
GETSHORT(n, tmp);
if (n == T_SOA) {
if (soacnt == 0) {
soacnt++;
if (dn_expand(buf, buf+PACKETSZ, nmp,
name, sizeof name) < 0) {
badsoa_msg = "soa name error";
goto badsoa;
}
if (strcasecmp(name, zp->z_origin)!=0){
syslog(LOG_INFO,
"wrong zone name in AXFR (wanted \"%s\", got \"%s\")",
zp->z_origin, name);
badsoa_msg = "wrong soa name";
goto badsoa;
}
if (eom - tmp
<= 2 * INT16SZ + INT32SZ) {
badsoa_msg = "soa header";
goto badsoa;
}
tmp += 2 * INT16SZ + INT32SZ;
if ((n = dn_skipname(tmp, eom)) < 0) {
badsoa_msg = "soa mname";
goto badsoa;
}
tmp += n;
if ((n = dn_skipname(tmp, eom)) < 0) {
badsoa_msg = "soa hname";
goto badsoa;
}
tmp += n;
if (eom - tmp <= INT32SZ) {
badsoa_msg = "soa dlen";
goto badsoa;
}
GETLONG(serial, tmp);
dprintf(3, (ddt,
"first SOA for %s, serial %lu\n",
name, (u_long)serial));
continue;
}
if (dn_expand(buf, buf+PACKETSZ, nmp,
name2, sizeof name2) == -1) {
badsoa_msg = "soa name error#2";
goto badsoa;
}
if (strcasecmp((char *)name,
(char *)name2) != 0) {
syslog(LOG_INFO,
"got extra SOA for \"%s\" in zone \"%s\"",
name2, name);
continue;
}
tmp -= INT16SZ; /* Put TYPE back. */
badsoa_msg = soa_zinfo(&zp_finish, tmp, eom);
if (badsoa_msg)
goto badsoa;
dprintf(2, (ddt,
"SOA, serial %lu\n",
(u_long)zp_finish.z_serial));
if (serial != zp_finish.z_serial) {
soacnt = 0;
got_soa = 0;
minimum_ttl = 0;
strcpy(prev_origin, zp->z_origin);
prev_dname[0] = DEF_DNAME;
dprintf(1, (ddt,
"serial changed, restart\n"
));
/*
* Flush buffer, truncate file
* and seek to beginning to restart.
*/
fflush(dbfp);
if (ftruncate(fileno(dbfp), 0) != 0) {
if (!quiet)
syslog(LOG_INFO,
"ftruncate %s: %m\n",
tmpname);
return (XFER_FAIL);
}
fseek(dbfp, 0L, 0);
} else
break;
#ifdef STUBS
} else if (zp->z_type == Z_STUB && n == T_NS) {
nscnt++;
} else if (zp->z_type == Z_STUB) {
if (soa_cnt >= 2)
break;
#endif
}
}
(void) my_close(s);
if (error == 0) {
@ -1099,6 +1066,12 @@ getzone(zp, serial_no, port)
return (XFER_FAIL);
}
static SIG_FN
term_handler() {
cleanup_for_exit();
_exit(XFER_FAIL); /* not safe to call exit() from a signal handler */
}
/*
* Set flag saying to read was interrupted
* used for a read timer
@ -1216,7 +1189,9 @@ soa_zinfo(zp, cp, eom)
* Does minimal error checking on the message content.
*/
static int
print_output(msg, msglen, rrp)
print_output(zp, serial_no, msg, msglen, rrp)
struct zoneinfo *zp;
u_int32_t serial_no;
u_char *msg;
int msglen;
u_char *rrp;
@ -1226,11 +1201,13 @@ print_output(msg, msglen, rrp)
u_int32_t addr, ttl;
int i, j, tab, result, class, type, dlen, n1, n;
char data[BUFSIZ];
u_char *cp1, *cp2, *temp_ptr;
u_char *cp1, *cp2, *temp_ptr, *eom, *rr_type_ptr;
u_char *cdata;
char *origin, *proto, dname[MAXDNAME];
char *ignore = "";
const char *badsoa_msg;
eom = msg + msglen;
cp = rrp;
n = dn_expand(msg, msg + msglen, cp, dname, sizeof dname);
if (n < 0) {
@ -1238,6 +1215,7 @@ print_output(msg, msglen, rrp)
return (-1);
}
cp += n;
rr_type_ptr = cp;
GETSHORT(type, cp);
GETSHORT(class, cp);
GETLONG(ttl, cp);
@ -1249,8 +1227,8 @@ print_output(msg, msglen, rrp)
else
origin++; /* move past the '.' */
dprintf(3, (ddt,
"print_output: dname %s type %d class %d ttl %d\n",
dname, type, class, ttl));
"print_output: dname %s type %d class %d ttl %lu\n",
dname, type, class, (u_long)ttl));
/*
* Convert the resource record data into the internal database format.
* CP points to the raw resource record.
@ -1316,6 +1294,10 @@ print_output(msg, msglen, rrp)
cp += n;
cp1 += strlen((char *) cp1) + 1;
if (type == T_SOA) {
if ((eom - cp) < (5 * INT32SZ)) {
hp->rcode = FORMERR;
return (-1);
}
temp_ptr = cp + 4 * INT32SZ;
GETLONG(minimum_ttl, temp_ptr);
n = 5 * INT32SZ;
@ -1375,14 +1357,14 @@ print_output(msg, msglen, rrp)
cp += INT16SZ;
if (type == T_SRV) {
bcopy((char *)cp, data, INT16SZ*2);
bcopy((char *)cp, cp1, INT16SZ*2);
cp1 += INT16SZ*2;
cp += INT16SZ*2;
}
/* get name */
n = dn_expand(msg, msg + msglen, cp,
(char *)cp1, sizeof data - INT16SZ);
(char *)cp1, sizeof data - (cp1-(u_char *)data));
if (n < 0)
return (-1);
cp += n;
@ -1470,13 +1452,99 @@ print_output(msg, msglen, rrp)
result = cp - rrp;
/*
* Only print one SOA per db file
* Special handling for SOA records.
*/
if (type == T_SOA) {
if (got_soa)
if (strcasecmp(dname, zp->z_origin) != 0) {
syslog(LOG_INFO,
"wrong zone name in AXFR (wanted \"%s\", got \"%s\")",
zp->z_origin, dname);
hp->rcode = FORMERR;
return (-1);
}
if (!soa_cnt) {
badsoa_msg = soa_zinfo(&zp_start, rr_type_ptr, eom);
if (badsoa_msg) {
syslog(LOG_INFO,
"malformed SOA for zone %s: %s",
zp->z_origin, badsoa_msg);
hp->rcode = FORMERR;
return (-1);
}
if (SEQ_GT(zp_start.z_serial, serial_no) ||
!serial_no)
soa_cnt++;
else {
syslog(LOG_INFO,
"serial went backwards after transfer started");
return (-1);
}
} else {
badsoa_msg = soa_zinfo(&zp_finish, rr_type_ptr, eom);
if (badsoa_msg) {
syslog(LOG_INFO,
"malformed SOA for zone %s: %s",
zp->z_origin, badsoa_msg);
hp->rcode = FORMERR;
return (-1);
}
dprintf(2, (ddt, "SOA, serial %lu\n",
(u_long)zp_finish.z_serial));
if (zp_start.z_serial != zp_finish.z_serial) {
dprintf(1, (ddt, "serial changed, restart\n"));
soa_cnt = 0;
#ifdef STUBS
ns_cnt = 0;
#endif
minimum_ttl = 0;
strcpy(prev_origin, zp->z_origin);
prev_dname[0] = DEF_DNAME;
/*
* Flush buffer, truncate file
* and seek to beginning to restart.
*/
fflush(dbfp);
if (ftruncate(fileno(dbfp), 0) != 0) {
if (!quiet)
syslog(LOG_INFO,
"ftruncate %s: %m\n",
tmpname);
return (-1);
}
fseek(dbfp, 0L, 0);
return (result);
}
soa_cnt++;
return (result);
}
}
#ifdef STUBS
if (zp->z_type == Z_STUB) {
if (query_type == T_NS && type == T_NS)
ns_cnt++;
/*
* If we're processing a response to an SOA query, we don't
* want to print anything from the response except for the SOA.
* We do want to check everything in the packet, which is
* why we do this check now instead of earlier.
*/
if (query_type == T_SOA && type != T_SOA)
return (result);
}
#endif
if (!soa_cnt || soa_cnt >= 2) {
char *gripe;
if (!soa_cnt)
gripe = "got RR before first SOA";
else
got_soa++;
gripe = "got RR after second SOA";
syslog(LOG_INFO, "%s in zone %s", gripe, zp->z_origin);
hp->rcode = FORMERR;
return (-1);
}
#ifdef NO_GLUE
@ -1570,7 +1638,7 @@ print_output(msg, msglen, rrp)
}
if (ttl != minimum_ttl)
(void) fprintf(dbfp, "%d\t", (int) ttl);
(void) fprintf(dbfp, "%lu\t", (u_long) ttl);
else if (tab)
(void) putc('\t', dbfp);
@ -1837,7 +1905,7 @@ print_output(msg, msglen, rrp)
cp++;
/* orig time to live (TTL)) */
(void) fprintf(dbfp," %d", _getlong((u_char*)cp));
(void) fprintf(dbfp," %lu", (u_long)_getlong((u_char*)cp));
cp += INT32SZ;
/* expiration time */
@ -1873,6 +1941,7 @@ print_output(msg, msglen, rrp)
}
if (ferror(dbfp)) {
syslog(LOG_ERR, "%s: %m", tmpname);
cleanup_for_exit();
exit(XFER_FAIL);
}
return (result);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_forw.c 4.32 (Berkeley) 3/3/91";
static char rcsid[] = "$Id: ns_forw.c,v 8.19 1996/12/02 09:27:36 vixie Exp $";
static char rcsid[] = "$Id: ns_forw.c,v 8.20 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -558,6 +558,13 @@ nslookup(nsp, qp, syslogdname, sysloginfo)
qs->ns = nsdp;
qs->nsdata = dp;
qs->nretry = 0;
/*
* If this A RR has no RTT, initialize its RTT to a
* small random value.
*/
if (dp->d_nstime == 0)
dp->d_nstime = 1 +
(int)(25.0*rand()/(RAND_MAX + 1.0));
/*
* if we are being asked to fwd a query whose
* nameserver list includes our own name/address(es),

View File

@ -1,6 +1,6 @@
/*
* from ns.h 4.33 (Berkeley) 8/23/90
* $Id: ns_glob.h,v 8.11 1996/11/11 06:36:49 vixie Exp $
* $Id: ns_glob.h,v 8.12 1997/06/01 20:34:34 vixie Exp $
*/
/*
@ -248,6 +248,7 @@ DECL const char sendtoStr[] INIT("sendto");
/* defined in version.c, can't use DECL/INIT */
extern char Version[];
extern char ShortVersion[];
/* max value of xfers_running */
DECL int max_xfers_running INIT(MAX_XFERS_RUNNING);

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_init.c 4.38 (Berkeley) 3/21/91";
static char rcsid[] = "$Id: ns_init.c,v 8.24 1996/12/02 09:17:21 vixie Exp $";
static char rcsid[] = "$Id: ns_init.c,v 8.25 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -233,7 +233,7 @@ boot_read(filename, includefile)
int includefile;
{
register struct zoneinfo *zp;
char buf[BUFSIZ], obuf[BUFSIZ], *source;
char buf[MAXDNAME], obuf[MAXDNAME], *source;
FILE *fp;
int type;
int class;
@ -576,21 +576,25 @@ boot_read(filename, includefile)
(strcmp(source, zp->z_source) ||
(stat(zp->z_source, &f_time) == -1 ||
(zp->z_ftime != f_time.st_mtime)))) {
dprintf(1, (ddt, "backup file changed\n"));
dprintf(1, (ddt,
"backup file changed or missing\n"));
free(zp->z_source);
zp->z_source = NULL;
zp->z_flags &= ~Z_AUTH;
zp->z_serial = 0; /* force xfer */
if (zp->z_flags & Z_AUTH) {
zp->z_flags &= ~Z_AUTH;
#ifdef CLEANCACHE
remove_zone(hashtab, zp - zones, 1);
remove_zone(hashtab, zp - zones, 1);
#else
remove_zone(hashtab, zp - zones);
remove_zone(hashtab, zp - zones);
#endif
/*
* reload parent so that NS records are
* present during the zone transfer.
*/
do_reload(zp->z_origin, zp->z_type, zp->z_class);
/*
* reload parent so that NS records are
* present during the zone transfer.
*/
do_reload(zp->z_origin, zp->z_type,
zp->z_class);
}
}
if (zp->z_source)
free(source);
@ -674,7 +678,7 @@ static void
get_forwarders(fp)
FILE *fp;
{
char buf[BUFSIZ];
char buf[MAXDNAME];
register struct fwdinfo *fip = NULL, *ftp = NULL;
#ifdef SLAVE_FORWARD

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_main.c 4.55 (Berkeley) 7/1/91";
static char rcsid[] = "$Id: ns_main.c,v 8.24 1996/11/26 10:11:22 vixie Exp $";
static char rcsid[] = "$Id: ns_main.c,v 8.25 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -172,7 +172,7 @@ main(argc, argv, envp)
const int on = 1;
int rfd, size, len;
time_t lasttime, maxctime;
u_char buf[BUFSIZ];
u_char buf[PACKETSZ];
#ifdef NeXT
int old_sigmask;
#endif
@ -833,7 +833,7 @@ main(argc, argv, envp)
malloc(rbufsize))
) {
sp->s_buf = buf;
sp->s_size = sizeof(buf);
sp->s_bufsize=sizeof(buf);
} else {
sp->s_bufsize = rbufsize;
}
@ -866,6 +866,12 @@ main(argc, argv, envp)
sp->s_bufp += n;
sp->s_size -= n;
}
if (sp->s_size > 0 &&
(n == -1) &&
(errno == PORT_WOULDBLK))
continue;
/*
* we don't have enough memory for the query.
* if we have a query id, then we will send an
@ -886,8 +892,10 @@ main(argc, argv, envp)
(void) writemsg(sp->s_rfd, sp->s_buf,
HFIXEDSZ);
}
sqrm(sp);
continue;
}
/*
* If the message is too short to contain a valid
* header, try to send back an error, and drop the
@ -908,10 +916,9 @@ main(argc, argv, envp)
(void) writemsg(sp->s_rfd, sp->s_buf,
HFIXEDSZ);
}
sqrm(sp);
continue;
}
if ((n == -1) && (errno == PORT_WOULDBLK))
continue;
if (n <= 0) {
sqrm(sp);
continue;

View File

@ -69,7 +69,7 @@ cache_n_resp(msg, msglen)
u_int16_t atype;
u_char *tp = cp;
u_char *cp1;
u_char data[BUFSIZ+MAXDNAME];
u_char data[MAXDNAME*2 + INT32SZ*5];
size_t len = sizeof data;
/* we store NXDOMAIN as T_SOA regardless of the query type */

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_req.c 4.47 (Berkeley) 7/1/91";
static char rcsid[] = "$Id: ns_req.c,v 8.27 1996/10/08 04:51:03 vixie Exp $";
static char rcsid[] = "$Id: ns_req.c,v 8.28 1997/06/01 20:34:34 vixie Exp $";
#endif /* not lint */
/*
@ -496,7 +496,7 @@ req_query(hp, cpp, eom, qsp, buflenp, msglenp, msg, dfd, from)
PUTLONG(0, *cpp); /* TTL */
tp = *cpp; /* Temp RdLength */
PUTSHORT(0, *cpp);
copyCharString(cpp, Version);
copyCharString(cpp, ShortVersion);
PUTSHORT((*cpp) - (tp + INT16SZ), tp); /* Real RdLength */
*msglenp = *cpp - msg; /* Total message length */
return (Finish);
@ -1693,7 +1693,7 @@ doaxfr(np, rfp, top, class)
struct namebuf *tnp; /* top namebuf */
struct databuf *tdp; /* top databuf */
struct namebuf **npp, **nppend;
u_char msg[PACKETSZ];
u_char msg[64*1024];
u_char *cp;
const char *fname;
char dname[MAXDNAME];
@ -2009,8 +2009,8 @@ startxfr(qsp, np, soa, soalen, class, dname)
*/
setsockopt(qsp->s_rfd, SOL_SOCKET, SO_LINGER,
(char *)&ll, sizeof ll);
close(qsp->s_rfd);
#endif
close(qsp->s_rfd);
_exit(0);
/* NOTREACHED */
}

View File

@ -1,6 +1,6 @@
#if !defined(lint) && !defined(SABER)
static char sccsid[] = "@(#)ns_resp.c 4.65 (Berkeley) 3/3/91";
static char rcsid[] = "$Id: ns_resp.c,v 8.37 1996/12/02 09:17:21 vixie Exp $";
static char rcsid[] = "$Id: ns_resp.c,v 8.38 1997/06/01 20:34:34 vixie Exp vixie $";
#endif /* not lint */
/*
@ -126,6 +126,7 @@ struct flush_set {
int fs_class;
u_int fs_cred;
struct db_list *fs_list;
struct db_list *fs_last;
};
static void rrsetadd __P((struct flush_set *, char *,
@ -136,7 +137,18 @@ static int rrsetcmp __P((char *, struct db_list *)),
check_root __P((void)),
check_ns __P((void)),
rrextract __P((u_char *, int, u_char *,
struct databuf **, char *, int));
struct databuf **, char *, int,
char **));
static void add_related_additional __P((char *));
static void free_related_additional __P((void));
static int related_additional __P((char *));
static void maybe_free __P((char **));
#define MAX_RELATED 100
static int num_related = 0;
static char *related[MAX_RELATED];
#ifdef LAME_LOGGING
static char *
@ -230,11 +242,11 @@ ns_resp(msg, msglen)
struct flush_set *flushset;
struct sockaddr_in *nsa;
struct databuf *nsp[NSMAX];
int i, c, n, qdcount, ancount, aucount, nscount, arcount;
int i, c, n, qdcount, ancount, aucount, nscount, arcount, arfirst;
int qtype, qclass, dbflags;
int restart; /* flag for processing cname response */
int validanswer;
int cname, lastwascname;
int cname, lastwascname, externalcname;
int count, founddata, foundname;
int buflen;
int newmsglen;
@ -250,6 +262,9 @@ ns_resp(msg, msglen)
struct namebuf *np;
struct netinfo *lp;
struct fwdinfo *fwd;
char *tname = NULL;
free_related_additional();
nameserIncr(from_addr.sin_addr, nssRcvdR);
nsp[0] = NULL;
@ -688,7 +703,8 @@ ns_resp(msg, msglen)
/*
* Add the info received in the response to the data base.
*/
c = ancount + aucount + arcount;
arfirst = ancount + aucount;
c = arfirst + arcount;
/* -ve $ing non-existence of record, must handle non-authoritative
* NOERRORs with c == 0.
@ -752,6 +768,7 @@ ns_resp(msg, msglen)
nscount = 0;
cname = 0;
lastwascname = 0;
externalcname = 0;
strcpy(aname, qname);
if (count) {
@ -767,12 +784,14 @@ ns_resp(msg, msglen)
struct databuf *dp;
int type;
maybe_free(&tname);
if (cp >= eom) {
formerrmsg = outofDataFinal;
goto formerr;
}
n = rrextract(msg, msglen, cp, &dp, name, sizeof name);
n = rrextract(msg, msglen, cp, &dp, name, sizeof name, &tname);
if (n < 0) {
maybe_free(&tname);
formerrmsg = outofDataFinal;
goto formerr;
}
@ -782,15 +801,23 @@ ns_resp(msg, msglen)
type = dp->d_type;
if (i < ancount) {
/* Answer section. */
if (strcasecmp(name, aname) != 0) {
syslog(LOG_DEBUG, "wrong ans. name (%s != %s)",
name, aname);
if (externalcname || strcasecmp(name, aname) != 0) {
if (!externalcname)
syslog(LOG_DEBUG,
"wrong ans. name (%s != %s)",
name, aname);
else
dprintf(3, (ddt,
"ignoring answer '%s' after external cname\n",
name));
db_free(dp);
continue;
}
if (type == T_CNAME &&
qtype != T_CNAME && qtype != T_ANY) {
strcpy(aname, (char *)dp->d_data);
if (!samedomain(aname, qp->q_domain))
externalcname = 1;
cname = 1;
lastwascname = 1;
} else {
@ -798,27 +825,95 @@ ns_resp(msg, msglen)
lastwascname = 0;
}
if (tname != NULL) {
add_related_additional(tname);
tname = NULL;
}
dp->d_cred = (hp->aa && !strcasecmp(name, qname))
? DB_C_AUTH
: DB_C_ANSWER;
} else {
/* After answer section. */
if (lastwascname) {
dprintf(3, (ddt,
"last was cname, ignoring auth. and add.\n"));
db_free(dp);
break;
}
if (i < ancount + aucount && type == T_NS) {
if (i < arfirst) {
/* Authority section. */
if (!samedomain(aname, name) ||
(!cname && !samedomain(name, qp->q_domain))
) {
switch (type) {
case T_NS:
case T_SOA:
if (!samedomain(aname, name)){
syslog(LOG_DEBUG,
"bad referral (%s !< %s)",
aname[0] ? aname : ".",
name[0] ? name : ".");
db_free(dp);
continue;
} else if (!samedomain(name,
qp->q_domain)) {
if (!externalcname)
syslog(LOG_DEBUG,
"bad referral (%s !< %s)",
name[0] ? name : ".",
qp->q_domain[0] ?
qp->q_domain : ".");
db_free(dp);
continue;
}
if (type == T_NS) {
nscount++;
add_related_additional(tname);
tname = NULL;
}
break;
case T_NXT:
case T_SIG:
break;
default:
syslog(LOG_DEBUG,
"bad referral (%s !< %s)",
name, qp->q_domain);
"invalid RR type '%s' in authority section (name = '%s') from %s",
p_type(type), name,
sin_ntoa(&from_addr));
db_free(dp);
continue;
}
} else {
/* Additional section. */
switch (type) {
case T_A:
case T_AAAA:
if (externalcname ||
!samedomain(name, qp->q_domain)) {
dprintf(3, (ddt,
"ignoring additional info '%s' type %s\n",
name, p_type(type)));
db_free(dp);
continue;
}
if (!related_additional(name)) {
syslog(LOG_DEBUG,
"unrelated additional info '%s' type %s from %s",
name, p_type(type),
sin_ntoa(&from_addr));
db_free(dp);
continue;
}
break;
case T_KEY:
case T_SIG:
break;
default:
syslog(LOG_DEBUG,
"invalid RR type '%s' in additional section (name = '%s') from %s",
p_type(type), name,
sin_ntoa(&from_addr));
db_free(dp);
continue;
}
nscount++;
}
dp->d_cred = (qp->q_flags & Q_PRIMING)
? DB_C_ANSWER
@ -826,6 +921,7 @@ ns_resp(msg, msglen)
}
rrsetadd(flushset, name, dp);
}
maybe_free(&tname);
if (flushset) {
rrsetupdate(flushset, dbflags);
for (i = 0; i < count; i++)
@ -833,7 +929,7 @@ ns_resp(msg, msglen)
free(flushset[i].fs_name);
free((char*)flushset);
}
if (lastwascname)
if (lastwascname && !externalcname)
syslog(LOG_DEBUG, "%s (%s)", danglingCname, aname);
if (cp > eom) {
@ -1100,7 +1196,11 @@ ns_resp(msg, msglen)
qp->q_fwd = fwdtab;
getname(np, tmpdomain, sizeof tmpdomain);
if (qp->q_domain != NULL)
free(qp->q_domain);
qp->q_domain = strdup(tmpdomain);
if (qp->q_domain == NULL)
panic(ENOMEM, "ns_resp: strdup failed");
if ((n = nslookup(nsp, qp, dname, "ns_resp")) <= 0) {
if (n < 0) {
@ -1146,17 +1246,20 @@ ns_resp(msg, msglen)
qp->q_cmsglen = qp->q_msglen;
} else if (qp->q_msg)
(void) free(qp->q_msg);
if ((qp->q_msg = (u_char *)malloc(BUFSIZ)) == NULL) {
if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) {
syslog(LOG_NOTICE, "resp: malloc error\n");
goto servfail;
}
n = res_mkquery(QUERY, dname, qclass, qtype,
NULL, 0, NULL, qp->q_msg, BUFSIZ);
NULL, 0, NULL, qp->q_msg, PACKETSZ);
if (n < 0) {
syslog(LOG_INFO, "resp: res_mkquery(%s) failed",
dname);
goto servfail;
}
if (qp->q_name != NULL)
free(qp->q_name);
qp->q_name = savestr(dname);
qp->q_msglen = n;
hp = (HEADER *) qp->q_msg;
hp->rd = 0;
@ -1255,29 +1358,35 @@ ns_resp(msg, msglen)
(void) send_msg((u_char *)hp, (qp->q_cmsglen ? qp->q_cmsglen : qp->q_msglen),
qp);
timeout:
if (qp->q_stream != QSTREAM_NULL)
sqrm(qp->q_stream);
qremove(qp);
free_nsp(nsp);
return;
}
static int
rrextract(msg, msglen, rrp, dpp, dname, namelen)
rrextract(msg, msglen, rrp, dpp, dname, namelen, tnamep)
u_char *msg;
int msglen;
u_char *rrp;
struct databuf **dpp;
char *dname;
int namelen;
char **tnamep;
{
register u_char *cp;
register int n;
int class, type, dlen, n1;
u_int32_t ttl;
u_char *cp1;
u_char data[BUFSIZ];
u_char data[MAXDNAME*2 + INT32SZ*5];
register HEADER *hp = (HEADER *)msg;
enum context context;
if (tnamep != NULL)
*tnamep = NULL;
*dpp = NULL;
cp = rrp;
if ((n = dn_expand(msg, msg + msglen, cp, dname, namelen)) < 0) {
@ -1362,6 +1471,8 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
cp += n;
cp1 = data;
n = strlen((char *)data) + 1;
if (tnamep != NULL && (type == T_NS || type == T_MB))
*tnamep = strdup((char *)cp1);
break;
case T_SOA:
@ -1469,7 +1580,7 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
if (type == T_SRV) {
/* Grab weight and port. */
bcopy(cp, data, INT16SZ*2);
bcopy(cp, cp1, INT16SZ*2);
cp1 += INT16SZ*2;
cp += INT16SZ*2;
}
@ -1488,6 +1599,9 @@ rrextract(msg, msglen, rrp, dpp, dname, namelen)
}
cp += n;
if (tnamep != NULL)
*tnamep = strdup((char *)cp1);
/* compute end of data */
cp1 += strlen((char *)cp1) + 1;
/* compute size of data */
@ -1647,12 +1761,12 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
int class, type;
struct databuf *dp;
char dname[MAXDNAME];
u_char data[BUFSIZ+MAX_MD5RSA_KEY_BYTES];
dprintf(3, (ddt, "doupdate(zone %d, savens %#lx, flags %#lx)\n",
zone, (u_long)savens, (u_long)flags));
if ((n = rrextract(msg, msglen, rrp, &dp, dname, sizeof(dname))) == -1)
if ((n = rrextract(msg, msglen, rrp, &dp, dname, sizeof(dname), NULL))
== -1)
return (-1);
if (!dp)
return (-1);
@ -1673,7 +1787,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
}
#endif
if (!bogus &&
((temp = strrchr((char *)data, '.')) != NULL) &&
((temp = strrchr((char *)dp->d_data, '.')) != NULL) &&
!strcasecmp(temp, ".arpa")
)
bogus++;
@ -1688,7 +1802,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
"bogus root NS"))
syslog(LOG_NOTICE,
"bogus root NS %s rcvd from %s on query for \"%s\"",
data, sin_ntoa(&from_addr), qname);
dp->d_data, sin_ntoa(&from_addr), qname);
db_free(dp);
return (cp - rrp);
}
@ -1698,7 +1812,7 @@ doupdate(msg, msglen, rrp, zone, savens, flags, cred)
"bogus nonroot NS"))
syslog(LOG_INFO,
"bogus nonroot NS %s rcvd from %s on query for \"%s\"",
data, sin_ntoa(&from_addr), qname);
dp->d_data, sin_ntoa(&from_addr), qname);
db_free(dp);
return (cp - rrp);
}
@ -2019,17 +2133,19 @@ sysquery(dname, class, type, nss, nsc, opcode)
qp->q_flags |= Q_SYSTEM;
getname(np, tmpdomain, sizeof tmpdomain);
if (qp->q_domain != NULL)
free(qp->q_domain);
qp->q_domain = strdup(tmpdomain);
if (!qp->q_domain)
if (qp->q_domain == NULL)
panic(ENOMEM, "ns_resp: strdup failed");
if ((qp->q_msg = (u_char *)malloc(BUFSIZ)) == NULL) {
if ((qp->q_msg = (u_char *)malloc(PACKETSZ)) == NULL) {
syslog(LOG_NOTICE, "sysquery: malloc failed");
goto err2;
}
n = res_mkquery(opcode, dname, class,
type, NULL, 0, NULL,
qp->q_msg, BUFSIZ);
qp->q_msg, PACKETSZ);
if (n < 0) {
syslog(LOG_INFO, "sysquery: res_mkquery(%s) failed", dname);
goto err2;
@ -2728,19 +2844,25 @@ rrsetadd(flushset, name, dp)
fs->fs_type = dp->d_type;
fs->fs_cred = dp->d_cred;
fs->fs_list = NULL;
fs->fs_last = NULL;
}
dbl = (struct db_list *)malloc(sizeof(struct db_list));
if (!dbl)
panic(-1, "rrsetadd: out of memory");
dbl->db_next = fs->fs_list;
dbl->db_next = NULL;
dbl->db_dp = dp;
fs->fs_list = dbl;
if (fs->fs_last == NULL)
fs->fs_list = dbl;
else
fs->fs_last->db_next = dbl;
fs->fs_last = dbl;
}
static int
ttlcheck(name,dbl)
ttlcheck(name,dbl,update)
char *name;
struct db_list *dbl;
int update;
{
int type = dbl->db_dp->d_type;
int class = dbl->db_dp->d_class;
@ -2764,6 +2886,9 @@ ttlcheck(name,dbl)
if (!match(dp, class, type))
continue;
if (first) {
/* we can't update zone data so return early */
if (dp->d_zone != 0)
return(0);
ttl = dp->d_ttl;
first = 0;
} else if (ttl != dp->d_ttl) {
@ -2791,6 +2916,19 @@ ttlcheck(name,dbl)
}
dbp = dbp->db_next;
}
/* update ttl if required */
if (update) {
for (dp = np->n_data; dp != NULL; dp = dp->d_next) {
if (!match(dp, class, type))
continue;
if (dp->d_ttl > ttl)
break;
dp->d_ttl = ttl;
fixttl(dp);
}
}
return(1);
}
@ -2871,8 +3009,8 @@ rrsetupdate(flushset, flags)
while (fs->fs_name) {
dprintf(1,(ddt, "rrsetupdate: %s\n",
fs->fs_name[0] ? fs->fs_name : "."));
if ((n = rrsetcmp(fs->fs_name,fs->fs_list)) &&
ttlcheck(fs->fs_name,fs->fs_list)) {
if ((n = rrsetcmp(fs->fs_name, fs->fs_list)) &&
ttlcheck(fs->fs_name, fs->fs_list, 0)) {
if (n > 0)
flushrrset(fs);
@ -2889,6 +3027,8 @@ rrsetupdate(flushset, flags)
free((char *)odbp);
}
} else {
if (n == 0)
(void)ttlcheck(fs->fs_name, fs->fs_list, 1);
dbp = fs->fs_list;
while (dbp) {
db_free(dbp->db_dp);
@ -2974,3 +3114,49 @@ delete_stale(np)
}
}
}
static void
add_related_additional(name)
char *name;
{
int i;
if (num_related >= MAX_RELATED - 1)
return;
for (i = 0; i < num_related; i++)
if (strcasecmp(name, related[i]) == 0)
return;
related[num_related++] = name;
}
static void
free_related_additional() {
int i;
for (i = 0; i < num_related; i++)
free(related[i]);
num_related = 0;
}
static int
related_additional(name)
char *name;
{
int i;
for (i = 0; i < num_related; i++)
if (strcasecmp(name, related[i]) == 0)
return (1);
return (0);
}
static void
maybe_free(tname)
char **tname;
{
if (tname == NULL || *tname == NULL)
return;
free(*tname);
*tname = NULL;
}

View File

@ -609,7 +609,7 @@ dovalidate(msg, msglen, rrp, zone, flags, qdomain, server, VCode)
u_int32_t ttl;
char dname[MAXDNAME];
u_char *cp1;
u_char data[BUFSIZ];
u_char data[MAXDNAME*2 + INT32SZ*5];
register HEADER *hp = (HEADER *) msg;
dprintf(2, (ddt, "dovalidate(zone %d, flags %x)\n",

View File

@ -1,6 +1,6 @@
#
# from @(#)Makefile 5.16 (Berkeley) 3/14/88
# $Id: Makefile,v 8.13 1996/08/08 22:49:48 vixie Exp $
# $Id: Makefile,v 8.14 1997/06/01 20:34:37 vixie Exp $
#
## ++Copyright++ 1988, 1995
@ -99,8 +99,7 @@ ${DESTDIR}${DESTLIB}/libresolv.a: libresolv.a
.c.o:
${CC} ${CFLAGS} -c $*.c
-${LDS} ld -x -r $*.o
${LDS} mv a.out $*.o
-${LDS} ld -x -r $*.o && ${LDS} mv a.out $*.o
clean: FRC
rm -f errs a.out core libresolv.a tags .depend

View File

@ -55,7 +55,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: gethnamaddr.c,v 8.20 1996/09/28 06:51:07 vixie Exp $";
static char rcsid[] = "$Id: gethnamaddr.c,v 8.21 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -210,6 +210,10 @@ getanswer(answer, anslen, qname, qtype)
* (i.e., with the succeeding search-domain tacked on).
*/
n = strlen(bp) + 1; /* for the \0 */
if (n >= MAXHOSTNAMELEN) {
h_errno = NO_RECOVERY;
return (NULL);
}
host.h_name = bp;
bp += n;
buflen -= n;
@ -254,11 +258,15 @@ getanswer(answer, anslen, qname, qtype)
/* Store alias. */
*ap++ = bp;
n = strlen(bp) + 1; /* for the \0 */
if (n >= MAXHOSTNAMELEN) {
had_error++;
continue;
}
bp += n;
buflen -= n;
/* Get canonical name. */
n = strlen(tbuf) + 1; /* for the \0 */
if (n > buflen) {
if (n > buflen || n >= MAXHOSTNAMELEN) {
had_error++;
continue;
}
@ -270,14 +278,14 @@ getanswer(answer, anslen, qname, qtype)
}
if (qtype == T_PTR && type == T_CNAME) {
n = dn_expand(answer->buf, eom, cp, tbuf, sizeof tbuf);
if ((n < 0) || !res_hnok(tbuf)) {
if (n < 0 || !res_dnok(tbuf)) {
had_error++;
continue;
}
cp += n;
/* Get canonical name. */
n = strlen(tbuf) + 1; /* for the \0 */
if (n > buflen) {
if (n > buflen || n >= MAXHOSTNAMELEN) {
had_error++;
continue;
}
@ -318,6 +326,10 @@ getanswer(answer, anslen, qname, qtype)
n = -1;
if (n != -1) {
n = strlen(bp) + 1; /* for the \0 */
if (n >= MAXHOSTNAMELEN) {
had_error++;
break;
}
bp += n;
buflen -= n;
}
@ -326,6 +338,10 @@ getanswer(answer, anslen, qname, qtype)
host.h_name = bp;
if (_res.options & RES_USE_INET6) {
n = strlen(bp) + 1; /* for the \0 */
if (n >= MAXHOSTNAMELEN) {
had_error++;
break;
}
bp += n;
buflen -= n;
map_v4v6_hostent(&host, &bp, &buflen);
@ -393,8 +409,8 @@ getanswer(answer, anslen, qname, qtype)
# endif /*RESOLVSORT*/
if (!host.h_name) {
n = strlen(qname) + 1; /* for the \0 */
if (n > buflen)
goto try_again;
if (n > buflen || n >= MAXHOSTNAMELEN)
goto no_recovery;
strcpy(bp, qname);
host.h_name = bp;
bp += n;
@ -405,8 +421,8 @@ getanswer(answer, anslen, qname, qtype)
h_errno = NETDB_SUCCESS;
return (&host);
}
try_again:
h_errno = TRY_AGAIN;
no_recovery:
h_errno = NO_RECOVERY;
return (NULL);
}
@ -506,7 +522,8 @@ gethostbyname2(name, af)
if (!isdigit(*cp) && *cp != '.')
break;
}
if (isxdigit(name[0]) || name[0] == ':')
if ((isxdigit(name[0]) && strchr(name, ':') != NULL) ||
name[0] == ':')
for (cp = name;; ++cp) {
if (!*cp) {
if (*--cp == '.')
@ -715,8 +732,7 @@ _gethtent()
if (!(cp = strpbrk(p, " \t")))
goto again;
*cp++ = '\0';
if ((_res.options & RES_USE_INET6) &&
inet_pton(AF_INET6, p, host_addr) > 0) {
if (inet_pton(AF_INET6, p, host_addr) > 0) {
af = AF_INET6;
len = IN6ADDRSZ;
} else if (inet_pton(AF_INET, p, host_addr) > 0) {
@ -753,12 +769,6 @@ _gethtent()
*cp++ = '\0';
}
*q = NULL;
if (_res.options & RES_USE_INET6) {
char *bp = hostbuf;
int buflen = sizeof hostbuf;
map_v4v6_hostent(&host, &bp, &buflen);
}
h_errno = NETDB_SUCCESS;
return (&host);
}

View File

@ -43,7 +43,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetent.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: getnetent.c,v 8.3 1996/08/05 08:31:35 vixie Exp $";
static char rcsid[] = "$Id: getnetent.c,v 8.4 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -122,7 +122,7 @@ getnetent()
if (netf == NULL && (netf = fopen(_PATH_NETWORKS, "r" )) == NULL)
return (NULL);
again:
p = fgets(line, BUFSIZ, netf);
p = fgets(line, sizeof line, netf);
if (p == NULL)
return (NULL);
if (*p == '#')

View File

@ -41,7 +41,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
static char rcsid[] = "$Id: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $";
static char rcsid[] = "$Id: getnetnamadr.c,v 8.8 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -102,7 +102,7 @@ getnetanswer(answer, anslen, net_i)
char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap,
*paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0;
static struct netent net_entry;
static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1];
static char *net_aliases[MAXALIASES], netbuf[PACKETSZ];
/*
* find first satisfactory answer

View File

@ -55,7 +55,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_comp.c,v 8.11 1996/12/02 09:17:22 vixie Exp $";
static char rcsid[] = "$Id: res_comp.c,v 8.12 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -94,7 +94,7 @@ dn_expand(msg, eomorig, comp_dn, exp_dn, length)
register char *dn;
register int n, c;
char *eom;
int len = -1, checked = 0;
int len = -1, checked = 0, octets = 0;
dn = exp_dn;
cp = comp_dn;
@ -108,6 +108,9 @@ dn_expand(msg, eomorig, comp_dn, exp_dn, length)
*/
switch (n & INDIR_MASK) {
case 0:
octets += (n + 1);
if (octets > MAXCDNAME)
return (-1);
if (dn != exp_dn) {
if (dn >= eom)
return (-1);
@ -179,6 +182,8 @@ dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
dn = (u_char *)exp_dn;
cp = comp_dn;
if (length > MAXCDNAME)
length = MAXCDNAME;
eob = cp + length;
lpp = cpp = NULL;
if (dnptrs != NULL) {

View File

@ -77,7 +77,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_debug.c,v 8.19 1996/11/26 10:11:23 vixie Exp $";
static char rcsid[] = "$Id: res_debug.c,v 8.20 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/param.h>
@ -1130,40 +1130,47 @@ static u_int8_t
precsize_aton(strptr)
char **strptr;
{
unsigned int mval = 0, cmval = 0;
u_int8_t retval = 0;
register char *cp;
register int exponent;
register int mantissa;
char *cp;
int exponent = 0;
int mantissa = 0;
cp = *strptr;
while (isdigit(*cp)) {
if (mantissa == 0)
mantissa = *cp - '0';
else
exponent++;
cp++;
}
while (isdigit(*cp))
mval = mval * 10 + (*cp++ - '0');
if (*cp == '.') { /* centimeters */
if (*cp == '.') {
cp++;
if (isdigit(*cp)) {
cmval = (*cp++ - '0') * 10;
if (mantissa == 0)
mantissa = *cp - '0';
else
exponent++;
cp++;
if (isdigit(*cp)) {
cmval += (*cp++ - '0');
if (mantissa == 0)
mantissa = *cp - '0';
else
exponent++;
cp++;
}
else
exponent++;
}
}
cmval = (mval * 100) + cmval;
for (exponent = 0; exponent < 9; exponent++)
if (cmval < poweroften[exponent+1])
break;
mantissa = cmval / poweroften[exponent];
if (mantissa > 9)
mantissa = 9;
else
exponent += 2;
if (mantissa == 0)
exponent = 0;
retval = (mantissa << 4) | exponent;
*strptr = cp;
return (retval);
}

View File

@ -55,7 +55,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93";
static char rcsid[] = "$Id: res_init.c,v 8.7 1996/09/28 06:51:07 vixie Exp $";
static char rcsid[] = "$Id: res_init.c,v 8.8 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -159,7 +159,7 @@ res_init()
register FILE *fp;
register char *cp, **pp;
register int n;
char buf[BUFSIZ];
char buf[MAXDNAME];
int nserv = 0; /* number of nameserver records read from file */
int haveenv = 0;
int havesearch = 0;

View File

@ -55,7 +55,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_query.c,v 8.9 1996/09/22 00:13:28 vixie Exp $";
static char rcsid[] = "$Id: res_query.c,v 8.10 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
@ -323,7 +323,7 @@ res_querydomain(name, domain, class, type, answer, anslen)
{
char nbuf[MAXDNAME];
const char *longname = nbuf;
int n;
int n, d;
if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
h_errno = NETDB_INTERNAL;
@ -339,15 +339,26 @@ res_querydomain(name, domain, class, type, answer, anslen)
* Check for trailing '.';
* copy without '.' if present.
*/
n = strlen(name) - 1;
if (n != (0 - 1) && name[n] == '.' && n < sizeof(nbuf) - 1) {
bcopy(name, nbuf, n);
n = strlen(name);
if (n >= MAXDNAME) {
h_errno = NO_RECOVERY;
return (-1);
}
n--;
if (n >= 0 && name[n] == '.') {
strncpy(nbuf, name, n);
nbuf[n] = '\0';
} else
longname = name;
} else
sprintf(nbuf, "%.*s.%.*s", MAXDNAME, name, MAXDNAME, domain);
} else {
n = strlen(name);
d = strlen(domain);
if (n + d + 1 >= MAXDNAME) {
h_errno = NO_RECOVERY;
return (-1);
}
sprintf(nbuf, "%s.%s", name, domain);
}
return (res_query(longname, class, type, answer, anslen));
}

View File

@ -55,7 +55,7 @@
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93";
static char rcsid[] = "$Id: res_send.c,v 8.12 1996/10/08 04:51:06 vixie Exp $";
static char rcsid[] = "$Id: res_send.c,v 8.13 1997/06/01 20:34:37 vixie Exp $";
#endif /* LIBC_SCCS and not lint */
/* change this to "0"
@ -601,6 +601,11 @@ res_send(buf, buflen, ans, anssiz)
if ((long) timeout.tv_sec <= 0)
timeout.tv_sec = 1;
timeout.tv_usec = 0;
if (s+1 > FD_SETSIZE) {
Perror(stderr, "s+1 > FD_SETSIZE", EMFILE);
res_close();
goto next_ns;
}
wait:
FD_ZERO(&dsmask);
FD_SET(s, &dsmask);

View File

@ -55,7 +55,7 @@
#ifndef lint
static char sccsid[] = "@(#)send.c 5.18 (Berkeley) 3/2/91";
static char rcsid[] = "$Id: send.c,v 8.1 1994/12/15 06:24:31 vixie Exp $";
static char rcsid[] = "$Id: send.c,v 8.2 1997/06/01 20:34:40 vixie Exp $";
#endif /* not lint */
/*
@ -332,8 +332,7 @@ SendRequest(nsAddrPtr, buf, buflen, answer, anslen, trueLenPtr)
* timeout
*/
if (_res.options & RES_DEBUG)
printf("timeout (%d secs)\n",
timeout.tv_sec);
printf("timeout\n");
#if BSD >= 43
gotsomewhere = 1;
#endif