[This changelog is out of date. Look at changelog.html] maradns-0.0.01: First version of MaraDNS package. Added iso-8859-1 support to JsStr routines. Added js_qappend and js_qprepend functions there. In addition to js_qfgrep. All tested functions work and are without error. (2001.02.17) maradns-0.0.02: MaraHash functions--assosciative array methods utilizing a hash--have been set up. This has the functions mhash_create, mhash_js, mhash_inc, mhash_put, mhash_get, mhash_undef, mhash_put_js, and mhash_get_js. Debugging done--these functions can perform basic get/put operatins with elements in an assosciative array. (2001.02.18) maradns-0.0.03: Some more work has been done. mhash_undef_js and mhash_resize functions written and compile. (2001.02.18) maradns-0.0.04: We now properly handle the case of trying to add an element already there (return an error), and have more error checking to make sure we don't crash because of corrupt hash data. Added an interactive test which lets the user interactively add, delete, and view hash elements. Time to go to bed (2001.02.18) maradns-0.0.05: Corrected mhash_resize to blank out the hash we resize to. Create mtest.c program to test the creation of hash elements. Time to get ready for church. (2001.02.18) maradns-0.0.06: Added mara_tuple support and verified that hash collisions are properly handled. Time to go to evening church recital. (2001.02.18) maradns-0.0.07: Good morning! Added mtuple_new, mtuple_put, and mtuple_get functions. Fixed bug where mhash_inc would allow a return value of 0. Fixed Makefile so make clean cleans up mtest binary. Added bounds testing to mhash_resize hashtable size. Time to eat breakfast. (2001.02.19) maradns-0.0.08: Added js_anq_chars, js_alpha_chars, and js_an_chars to JsStrCP object. (2001.02.19) maradns-0.1.00: Begin work on handlers to handle various data types that RFC1035 has. (2001.02.20) maradns-0.1.01: Added some more RFC1035 data to MaraDns.h (2001.02.20) maradns-0.1.02: Wrote first (test-only) server that listens on port 53. Using this server to determine what kind of data resolvers ask for. (2001.02.20) maradns-0.1.03: Began work on debugging routines in Query. Time to go to work (2001.02.20) maradns-0.1.04: Debugged routines in Query.c that convert a RFC1035 question in to a query. Added routine that converts a RFC1035 domain name (with class) in to a dotted-decimal hostname. (2001.02.20) maradns-0.1.05: Added hname_2rfc1035, which does the reverse of hname_translate. Beginning work on ctest, which is a test DNS client, to see what kind of replies we get from DNS servers. (2001.02.21) maradns-0.1.06: ctest now sends correctly formed DNS queries to a DNS server (2001.02.21) maradns-0.1.07: Fixed potential overflow in rtest (probably never exploitable) Discovered that DNS servers do not support QDCOUNT > 1 in DNS queries. Made notes in "doc" about this. (2001.02.21) maradns-0.1.08: Added read_rr_h. Also began work on decompress_data (Ugh. rfc1035 compression is horrible.) (2001.02.22) maradns-0.1.09: Had a good weekend. Got to see a friend of mine and his wife get baptised. Continued work on decompress_data. It is still buggy, but I am working out the bugs. (2001.02.26) maradns-0.1.10: You know how to handle buggy code? Rewirte the code so that it is simpler and less buggy. A lot of the overhead I had was not needed to keep things secure. The docs on how MaraDNS handles decompression have been revised also. RFC1035 decompression now works, still need to add MX and SOA, and possibly support for other data types that get compressed (SRV, the obscure RFC1035 datatypes, etc.) Also, get rid of some of the cruft variables in the decompression code. (2001.02.26) maradns-0.1.11: Support for MX and SOA, and a number of other formats that may have compressed data in them now added to the decompression routine. ctest now can parse any RR that MaraDNS fully supports except TXT (A, NS, SOA, MX, CNAME, HINFO), and is now a rather verbose dig replacment. Got rid of the cruft variables in the decompression routine. Next: Have a routine to decode TXT data. (2001.02.27) maradns-0.1.12: Added support for TXT in ctest resolver code. Made ctest code more hardy--it validates all input and returns an error if there is a problem at any point. (2001.02.27) maradns-0.1.13: Fixed bug where ctest resolver program did not print out SOA replies (2001.02.28) maradns-0.1.14: Beginning the retooling of code from the KiwiSpam package to use assosciative arrays in ParseMaraRC.c. This will be a fairly extensive code rewrite, considering the code I am modding is somewhat hacky itself. (2001.03.01) maradns-0.1.15: Continuing the retooling of code from the KiwiSpam package to use assosciative arrays in ParseMaraRC.c. Yes, this whole parser is a hack instead of a proper parser. Right now, the single line parser groks foo["bar"] = baz. Next: get it to grok foo = {} (2001.03.01) maradns-0.1.16: Modified js_anq_chars handle just numerics. Made it correctly handle just alphabetics. Renamed 'ctest' to 'askmara'. Rewrote askmara.c to have all labels in another file (askmara_labels_en.h), to make translation easier. (2001.03.02) maradns-0.1.17: More ParseMaraRC.c hacking. Now, it can parse 'foo = {}', 'foo["bar"] = "baz"', and 'foo = "bar"'. Next: Write the routine to read an entire maradnsrc (maybe we should just call this mararc) and fill up the hash table with the names of all of the zones. (2001.03.03) maradns-0.1.18: More ParseMaraRC hacking (this this is a real hack. A really bad hack. At least the elegant js_string lib stops it from being a security problem). It now has routines that can fill up an assosciative array based on user-specified keys and values. Next: Routine that reads the rc file, and, based on the data there, begins reading zone files. The zone files will then be read in turn, and then populate a hash. (2001.03.03) maradns-0.1.19: Added routines to handle getting all of the keys of a hash in series (in the semi-random order they are in the hash table). Corrected errors in parseline code, it now works with foo["bar"] = "baz" lines and no longer considers foo["bar"] = baz legal. foo["bar"] = 1 is still legal. (2001.03.04) maradns-0.1.20: I have decided that MaraDNS will use UTF-8 to support international characters in domain names. I have added the draft RFC for UTF8 domain names and a description of UTF8 in the docs. In terms of code, we now have code that converts ISO 8859-1 to UTF-8. In addition, I have written up a couple of documents describing the csv1 non-standard Zone file format, and how MaraDNS will resolve a domain name. (2001.03.06) maradns-0.1.21: Wrote utf8test to test the ability to convert ISO 8859-1 strings to UTF-8 strings. Found minor bug in code, fixed, and now ISO 8859-1 strings are correctly copied. I had to set up X and recompile xterm to support all this. Cleaned up the comments in the js_notmatch_offset code (they were never cleaned up from the Kiwi days). Clean up of some code in Queries.c. Wrote about half of the line parsing code for parsing csv1 lines. csv1 format doc clean up. (2001.03.07) maradns-0.1.22: Split off some of the routines in other files to new .c files: ParseCsv1.c and Utf8.c. Created js_addbyte routine. Added csv1test and example_csv1 files to test the csv1 parsing routines. Created js_changebyte routine. ParseCsv1 routine now parses all data types except for the SOA datatype. Next: SOA datatype, shortcut for PTR datatype. (2001.03.07) maradns-0.1.23: Changed js_atoi to return unsigned integers. Added support for TXT and SOA records. Tested to make sure error correction looks good. Next: PTR shorthand, more efficient Makefile. (2001.03.07) maradns-0.1.24: Added support for MX and "Unknown" (user-specified query type) data types. Added support for '\xxx'-style escape sequences, making it possible to have arbitrary data in the csv1 zone file. (2001.03.08) maradns-0.1.25: Added support for % in csv1 file. Revised csv1.format document. Next: figure out a way to store "star records" in the hash table in such a way as to not step on the EDNS standards. And implement that method. (2001.03.09) maradns-0.1.26: Made the code that parses mararc lines a little more senisible. It's still hackish, but is somewhat pedantic about what kind of syntax it accepts, returning errors when wrong syntax is given to it. (2001.03.10) maradns-0.1.27: Pasted in read/write/setup kvar code from the code that parsed the kiwirc file in the kiwi2 anti-spam package. Modified mararc code so that it can parse both simple strings and dictionaries (Assosciative arrays) Next: The code that populates the DNS lookup hash based on the data read from the mararc file. (2001.03.11) maradns-0.1.28: Made all of the string literals in ParseMaraRc.c labels which point to entries in ParseMaraRc_en.h. Wrote and documented Perl script which automates this kind of work. I did the same with ParseCsv1.c (ParseCsv1_en.h). (2001.03.11) maradns-0.1.29: Installed a new verison of Linux on my Laptop (Esware 2.0r2, a Spanish RedHat clone with the 2.4 kernel). Begun work on MaraDNS.c. Next: continue work on MaraDNS.c (2001.03.13) maradns-0.1.30: Worked on the routine to fill up the "big hash" with the appropriate data. Now, I need to replace the "dummy" add_rr_to_bighash with a routine that adds the appropriate rr to the big hash (if appropriate). (2001.03.14) maradns-0.1.31: Additional work on that routine. Now, it correctly make sure that we add the NS records for the zone before the NS records, and also fixed some other bugs in this routine. Next: Make add_rr_to_bighash really check the authority of a record and and data to the big hash (2001.03.15) maradns-0.1.32: More work on the the populate+bighash routine. Now, when a syntax error is encountered, MaraDNS makes a best-faith effort to continue processing zone files. (2001.03.16) maradns-0.1.33: Plugged up some memory leaks in MaraHash.c. Added a lot of code which starts populating the big hash with data. (2001.03.17) maradns-0.1.34: Added some more security features: It now chroot's and changes the uid if it is run as root. Also made a function that adds a RR to the end of a chain of RRs before the first NS RR. (2001.03.17) maradns-0.1.35: Verified that records are placed in the bug hash correctly. Next: We can now start making this a working DNS server. Bind to the port, answering UDP queries using a simple forking model. (2001.03.18) maradns-0.1.36: Now we convert star records (record which start off with a * label) to an EDNS-style format MaraDNS uses for its internal hash of RRs (2001.03.19) maradns-0.1.37: Placed the code that converts star records in a more sensible location. Added a new element in the rr answer which is a pointer to the query string (we need this so we can tell the resolver both the question and the answer with the NS records, and which IP addresses go with which answers in the AR records) (2001.03.21) maradns-0.1.38: Added the code that adds pointers to the corresponding A records for MX, NS, and CNAME records. (2001.03.23) maradns-0.1.39: At this point, MaraDNS binds to a port and listens to incoming data. Next: Actually process the data that she gets (2001.03.24) maradns-0.1.40: MaraDNS now resolves hosts. It doesn't handle a lot of cases where the resolution is not an exact match (NS records for stuff below us, star records, etc.) nor does it give us NS or AN records, nor the IP for a Cname record (if applicable), but at least MaraDNS is finally resolving. To do: js_string function for adding uint16s and uin32s in a single fell swoop, and real name resolution. (2001.03.25) maradns-0.2.00: Incremented minor number in light of the fact MaraDNS now actually resolves, albeit in a very limited fashion. Added some QuickStart notes, and added the ability for uint16s and uint32s to be added directly to the end of a JS_STRING object. (2001.03.25) maradns-0.2.01: Bugfix: SOA lines can now have percent escape sequences in them. (2001.03.25) maradns-0.2.02: Now, MaraDNS correctly returns NS records and AN records for every query where it has NS and AN records in its local database. While I wait for the clows at NSI to figure out why we can't make maradns.com and maradns.org use ns.maradns.com and ns.maradns.org as name servers for both domains, I can test things with www.z.maradns.org (2001.03.25) maradns-0.2.03: I have made the directory structure a little cleaner. The only problem I have now is that multiple Makefiles have to be changed if I add a new object file. I also have improved the way MaraDNS cleans up after her children. (2001.03.26) maradns-0.2.04: New security feature: Maxprocs, which is a mandatory way of limiting the resources MaraDNS uses. Added fix.perms tool. (2001.03.26) maradns-0.2.05: Cleaned up the makefile so that we don't have compiled binaries in any of the directories after a "make clean" is performed. Added support for CNAME and limited NS record support. (2001.03.26) maradns-0.2.06: A and CNAME queries are now case-insensitive. Changed the bs_process routine to have domain-labels converted to their lower-case format before octal processing is done (so we can still have 'A' in a domain label with '\101') Returns NS delegation if we asked for a host in a sub-delegated domain. (2001.03.27) maradns-0.2.07: Fixed bug in MaraDNS' handling of case folding. Added some support for star records. (2001.03.27) maradns-0.2.08: Added support for ddip addresses (An IP query for '127.1.1.1' gives the IP '127.1.1.1'). Added almost full support for star records. Only these somewhat silly star record cases are not supported: Star records pointing to CNAMEs and to NSs records. Added code that warns the user if they try to add an unsupported star record type. Next: The code to give out a "notfound" reply. (2001.03.28) maradns-0.2.09: Moved check for star records attached to CNAME or to NS RRs in the CSV1 parser, where it belongs. Added support for "notfound" reply. Next: RFC1035 compression (ugh). (2001.03.29) maradns-0.2.10: My theory is that they made DNS comprssion so difficult to implement out of fear that anyone would be crazy enough to write their own DNS server. Continued work on the compression routines. (2001.03.31) maradns-0.3.00: The DNS compression routines now work. Also set up the server to return "Not implemented" to the unimplemented requests for zone transfers and the unimplemented requests for all RRs attached to a hostname. (2001.04.01) maradns-0.3.01: Fixed bug where the MX preference changed on DNS compressing and DNS decompressing. (2001.04.01) maradns-0.3.02: Added support for truncating headers. Began work on getzone zone transfer client. (2001.04.03) maradns-0.3.03: The getzone program in tcp now generates working, albeit ugly (too many RR types are still marked 'U'), MaraDNS zone files based on the data from a zone transfer. Also found and fixed other bugs the popped up when stressing the various queries routines with a full Zone transfer. Unreleated to MaraDNS per se, MaraDNS now has a `real' web page. (Thanks, Leo!) (2001.04.04) maradns-0.3.04: TXT, A, and MX records are now "pretty printed" when downloaded from a foreign zone. All seven RR types supported by MaraDNS are now pretty printed. Fixed bug with the handling of "umbrella" NS records. Fixed bug with the handling of high serial numbers and extra-long TTL values. Next: the AXFR server. (2001.04.04) maradns-0.3.05: An entire parsing engine which processes ip-based ACLs has been created, complete with recursive aliases. Zoneserver now only needs the code that reads the client's request and send them the zone they ask for (as long as they have access). (2001.04.08) maradns-0.3.06: Security fix: The zone transfer client now checks for and disables any out-of-baliwick records it finds when performing a zone transfer. Feature enhancment: Maradns now has a working zone transfer server. (2001.04.10) maradns-0.4.00: Stable branch: This is the stable branch of MaraDNS, which will only be updated with security fixes. Made zoneserver check the query type, and drop connection on anything besides AXFR and IXFR (Hack: The zone server treats an IXFR exactly like an AXFR). Also cleaned up the error handling in the zone and udp server code in preparation to make maradns multithreaded. (2001.04.11) maradns-0.4.01: Bugfix: Fixed bug where SOA records were not properly loaded when we have multiple zones. (2001.04.11) maradns-0.4.02: Bigfix: Hacked zoneserver so that it can work as a zone server in cases where the zone transfer client asks for the SOA record before downloading the zone. Also: Added the ability to verbosely log invalid queries sent to the DNS server, and to have a log level of 0 make MaraDNS give out no logs whatsoever. Next: Fix bug where the last line of a csv1 file is not parsed. (2001.04.12) maradns-0.4.03: Bugfix: The zone server is now hacked up to give a plausable-looking answer to a SOA request on the TCP port. As a result, BIND 4 and BIND 8 will now transfer zones from the maradns zoneserver. (2001.04.12) maradns-0.4.04: More bug fixes: Plugged potential memory leaks in js_buf_getline. Fixed bug where the last line of a csv1 file was not read. Fixed makefile so that it cleans files in new location of the zonefile stuff--it's now in a directory called "tuzona". Next: Go from a multi-process model to a single process model. (2001.04.12) maradns-0.5.00: The UDP server no longer fork()s off processes to process queries. I performed a mild stress test, where MaraDNS was processing 81 queries a second for over an hour--MaraDNS performed beautifully--memory usage did not increase, and queries were fast during this test. I am making this release the stable branch. Next: Get string literals out of the code. (2001.04.12) maradns-0.5.01: Bugfix: Since mail exchangers routinely ask for "all records" queries (to get both A and MX records), I have hacked MaraDNS to deliver A and MX records if a request for all records is received. I still need to code the case of a request for "all records" pointing to a CNAME, though. Also, I have added a benchmark tool which times a DNS server by sending 50,000 queries to the server in question as quickly as possible. (2001.04.13) maradns-0.5.02: Most of the text messages that MaraDNS' various utilities generate have been moved to separate files, which will make localization easier. (2001.04.16) maradns-0.5.03: If a "give me all records for a given hostname" query appears, MaraDNS will now look for a CNAME with the same hostname, returning only that if found (and she will only look for a CNAME if an A and MX were not found), and if A, MX, and CNAME records are not found, MaraDNS will see if the person entered a dotted decimal ip and respond appropriately. (2001.04.16) maradns-0.5.04: Added more support for dotted decimal IPs in NS, CNAME, and MX records. Added handles for code which will warn the user of the presence of these dotted-decimal IP records. Fixed bug where js_copy was not returning an appropriate value on success (2001.04.17) maradns-0.5.05: Phil Homewood generously supplied a patch that makes this compiles on FreeBSD. In addition, he fixed a bug in the Makefile in dns/Makefile which made it so bobbit.c compiles instead of using the Linux-specific object file (Which I didn't catch, since make clean didn't remove it and make didn't recreate it). I also fixed a bug in getzone.c which was introduced when I put the string literals in a language-specific file. (2001.04.17) maradns-0.5.06: The zone server for MaraDNS can now be run from inetd. Due to the security implications of this (MaraDNS' IP-based ACLs stop working when run from inetd), this will be an undocumented feature. (2001.04.18) maradns-0.5.07: Plugged some memory leaks in the zoneserver which, while not currently a problem, could have been a problem if I had started coding threads before plugging the memory leaks. Some of the leaks were is the js_string library, so that code base is a lot cleaner now. Made the functions in ParseCsv1.c thread-safe. My friend Fatma generously supplied a German translation of the error strings in MaraDNS_en.h--we now have a MaraDNS_de.h which, while not perfect, will be appreciated by the Germans. (2001.04.18) maradns-0.5.08: Begin a "stable" brach for the only-authoritative non-threaded nameserver. Changed compiler option from -g to -O2. Made RPM of MaraDNS-0.5.08. (2001.04.19) maradns-0.5.09: The server crashes were causes by pointers that were not correctly initialized to zero. The pointers causing the crash have been initialized, and hopefully this one will be crashproof. Next: Look for other incorrectly initialized variables. (2001.04.20) maradns-0.5.10: Code cleanup: I added -Wall as an option in the libs, dns, and server directories. Cleanup of all the warnings that -Wall generated. Added /etc/mararc and /var/maradns/db.example.com to RPM file. (2001.04.20) maradns-0.5.11: Tollef Fog Heen generously ran autoconf for MaraDNS. The build process now consists of './configure;make'". (2001.04.21) maradns-0.5.12: Added better support for CNAME records: If the CNAME record points to an A record, and we have the A record "on file", MaraDNS will add the CNAME record to the ar section of the reply. Also added support for getting the version number for maradns via a 'erre-con-erre-cigarro.maradns.org.' TXT query. Set things up so we can both a autoconf-based and a non-autoconf-based build process, and we can switch between the two). Next: Branch off to development again, because I need to get the zone server multithreaded. (2001.04.22) maradns-0.5.13: Manpage for maradns added. (2001.04.22) maradns-0.5.14: Added "no_fingerprint" feature which minimizes the MaraDNS-specific features, making it more difficult to determine which DNS server one is running. (2001.04.23) [See CHANGELOG.html for newer changelog entries]