<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=KenRaeburn</id>
		<title>K5Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://k5wiki.test.kerberos.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=KenRaeburn"/>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki/Special:Contributions/KenRaeburn"/>
		<updated>2026-05-14T17:13:26Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.27.4</generator>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Main_Page&amp;diff=4459</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Main_Page&amp;diff=4459"/>
				<updated>2011-11-21T04:01:49Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: Undo revision 4458 by Autumnqxho (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
'''K5Wiki''' is a wiki supporting the development of [[MIT Kerberos]], a reference implementation of [[wp:Kerberos (protocol)|the Kerberos network authentication protocol]].  MIT Kerberos is a project of the [http://www.kerberos.org/ MIT Kerberos Consortium].&lt;br /&gt;
&lt;br /&gt;
This wiki serves both as a place for coordination of development efforts on MIT Kerberos and as a means for potential contributors and other interested people to become more involved with MIT Kerberos development.  This wiki does not focus on the needs for the average end user, but it may nevertheless contain information that is useful to advanced users, such as system administrators who wish to make customizations.&lt;br /&gt;
&lt;br /&gt;
What can this wiki do for you?&lt;br /&gt;
* I have a [[Asking questions|question]]&lt;br /&gt;
* I want to [[Writing applications|write Kerberos application software]]&lt;br /&gt;
* I want to [[Reporting bugs|report bugs]]&lt;br /&gt;
* I want to [[Fixing bugs|fix bugs]]&lt;br /&gt;
* I want to [[Learning about the code|learn more about the code]]&lt;br /&gt;
* I have [[Suggesting enhancements|ideas for enhancements]]&lt;br /&gt;
* I want to [[Contributing code|contribute code]]&lt;br /&gt;
* I want to [[K5Wiki:Todo|help to improve this wiki]]&lt;br /&gt;
&lt;br /&gt;
== Releases ==&lt;br /&gt;
&lt;br /&gt;
The current release is [http://web.mit.edu/kerberos/krb5-1.9/ krb5-1.9].&lt;br /&gt;
&lt;br /&gt;
* [[Release 1.9 | Release 1.9 goals]]&lt;br /&gt;
&lt;br /&gt;
Additional information on future releases:&lt;br /&gt;
&lt;br /&gt;
* Development [[roadmap]]&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
&lt;br /&gt;
We recommend that end users use MIT Kerberos software packages built by their operating system vendor if possible, and use support resources provided by their site or by their vendor.  For those users (typically system administrators) who have a need to build MIT Kerberos from source code, we have some resources available on this wiki.&lt;br /&gt;
&lt;br /&gt;
* [[Building]] the MIT Kerberos software&lt;br /&gt;
* [[Reporting bugs]]&lt;br /&gt;
* [[Suggesting enhancements]]&lt;br /&gt;
* More [[user resources]]&lt;br /&gt;
&lt;br /&gt;
== System administrators ==&lt;br /&gt;
&lt;br /&gt;
We also recommend that most system administrators use MIT Kerberos software packages from their operating system vendor if possible.&lt;br /&gt;
&lt;br /&gt;
* [[Building]] the MIT Kerberos software&lt;br /&gt;
* [[Reporting bugs]]&lt;br /&gt;
* [[Suggesting enhancements]]&lt;br /&gt;
* [[IPv6]] support status&lt;br /&gt;
* More [[sysadmin resources]]&lt;br /&gt;
&lt;br /&gt;
== Developers ==&lt;br /&gt;
&lt;br /&gt;
Developers can include end users who have a need to customize the MIT Kerberos source code, or who would like to contribute patches for new features or for bug fixes.&lt;br /&gt;
&lt;br /&gt;
* [[Developer resources]]&lt;br /&gt;
&lt;br /&gt;
=== Contributing ===&lt;br /&gt;
&lt;br /&gt;
* [[How to contribute]] to the MIT Kerberos software&lt;br /&gt;
* [[Fixing bugs]]&lt;br /&gt;
* [[Suggesting enhancements]]&lt;br /&gt;
* [[Contributing code]]&lt;br /&gt;
&lt;br /&gt;
=== Background information ===&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Policies|Policies for development]]&lt;br /&gt;
* [[:Category:Lore|Lore]]&lt;br /&gt;
&lt;br /&gt;
=== Code quality ===&lt;br /&gt;
&lt;br /&gt;
* [[Coding style]]&lt;br /&gt;
* [[Test-driven development]]&lt;br /&gt;
* [[Manual_Testing|Manual testing procedures]]&lt;br /&gt;
&lt;br /&gt;
=== Planning ===&lt;br /&gt;
&lt;br /&gt;
* Development [[roadmap]]&lt;br /&gt;
* [[Projects]]&lt;br /&gt;
&lt;br /&gt;
=== Communication ===&lt;br /&gt;
&lt;br /&gt;
* [[Release_Meeting_Minutes|Release Meeting Minutes]]&lt;br /&gt;
* [[IRC and Jabber]]&lt;br /&gt;
* [http://blog.kerberos.org/ Blog]&lt;br /&gt;
&lt;br /&gt;
== Additional information ==&lt;br /&gt;
&lt;br /&gt;
* [[K5Wiki:Todo|A todo list  for work needing doing on this wiki]]&lt;br /&gt;
* [[Application_Maintenance|Notes on maintenance of the krb5 telnet/rlogin/gssftp applications]]&lt;br /&gt;
&lt;br /&gt;
We look forward to your contributions to K5Wiki and MIT Kerberos.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2011-01-18&amp;diff=3783</id>
		<title>Release Meeting Minutes/2011-01-18</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2011-01-18&amp;diff=3783"/>
				<updated>2011-01-28T21:04:01Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{minutes|2011}}&lt;br /&gt;
Greg Hudson, Tom Yu, Zhanna Tsitkova, Simo Sorce, Will Fiveash&lt;br /&gt;
&lt;br /&gt;
;Simo: Explain why there are 2 parts for each function doc.&lt;br /&gt;
&lt;br /&gt;
;Zhanna: Parameter names should match in header and .c file.&lt;br /&gt;
&lt;br /&gt;
;Simo: Not clear how to submit doc. In other projects, submissions to mailing list (main dev list).&lt;br /&gt;
&lt;br /&gt;
[ Discussion about whether krbdev is too high traffic. We might use the bug tracker and create a separate RT queue if there's too much traffic. ]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=3776</id>
		<title>Projects/Documentation Tasks</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Documentation_Tasks&amp;diff=3776"/>
				<updated>2011-01-14T06:23:18Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* API documentation */ remove extra nameless column on right edge of tables&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
To keep track of the various tasks that need to be documented such as function documentation, administration, troubleshooting etc.&lt;br /&gt;
&lt;br /&gt;
=== API documentation ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Matrix of Document-Type VS Intended Readership&lt;br /&gt;
|-&lt;br /&gt;
! Doc-type/Reader&lt;br /&gt;
! Architectural Guide&lt;br /&gt;
! Setup &amp;amp; Config of Kerberos&lt;br /&gt;
! Admin &amp;amp; Operations of Kerberos&lt;br /&gt;
! Custom Build&lt;br /&gt;
! API Description&lt;br /&gt;
! API Details&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| End-users || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Architects || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|System Admins || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Application Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|GSSAPI Developers || || || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|Kerberos Developers || || || || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Tier 1 - most commonly used API functions (in alphabetical order)&lt;br /&gt;
|-&lt;br /&gt;
! API&lt;br /&gt;
! who writes?&lt;br /&gt;
! who reviews?&lt;br /&gt;
! reviewed?&lt;br /&gt;
! comments&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|krb5_build_principal_alloc_val || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_build_principal_ext || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_close || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_default_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_destroy || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_cc_dup || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_get_type || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_initialize || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_new_unique || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_cc_resolve || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_change_password || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_context || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_error_message || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_free_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_fwd_tgt_cred || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_default_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_error_message || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_host_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_credentials || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_fallback_host_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_keytab || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_alloc || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_free || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_get_init_creds_opt_get_fast_flags || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_init || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_address_list || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_anonymous || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_canonicalize || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_change_password_prompt || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_etype_list || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_expire_callback || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_ccache_name  || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_fast_flags || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_forwardable || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_out_ccache || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_pa || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_preauth_list || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_proxiable || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_renew_life || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_salt || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_opt_set_tkt_life || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_init_creds_password || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_profile || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_prompt_types || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_renewed_creds || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_get_validated_creds || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_context || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_init_secure_context || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_config_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_is_thread_safe || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_close || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_default_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_get_type  || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kt_resolve || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_kuserok || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_parse_name_flags || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_any_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_principal_compare_flags || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_prompter_posix || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_realm_compare || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_recvauth_version || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_default_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|   krb5_set_password || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_password_using_ccache || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|  krb5_set_principal_realm || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_callback || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_set_trace_filename || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_sname_to_principal || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_ext || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_unparse_name_flags_ext || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_us_timeofday || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| krb5_verify_authdata_kdc_issued || || || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=3689</id>
		<title>Projects/Kerberos Documentation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Kerberos_Documentation&amp;diff=3689"/>
				<updated>2010-12-07T20:14:47Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Documenting functions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Purpose ==&lt;br /&gt;
&lt;br /&gt;
The goal of the project is to create an infrastructure  and process for the future development of the extensive Kerberos documentation.&lt;br /&gt;
&lt;br /&gt;
The actualized  documentation will be useful for developers and administrators, both for experienced ones and newcomers. It will address the following topics:&lt;br /&gt;
&lt;br /&gt;
* Complete reference - API, internal functions, data types, macros &lt;br /&gt;
* Tutorial for application developers - description on various tasks such as working with credentials, read and verify message, etc&lt;br /&gt;
* Cookbook for administrators  - Installation, configuration, troubleshooting&lt;br /&gt;
* Contributions to Kerberos code - topics on how to write plugins, kerberize cloud, etc&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The documentation will be built incrementally. We will analyze what works and what doesn't and correct the course of action as needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Details of source documentation ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Documenting functions ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Part_1'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The following fields ''must'' be included in the function documentation and should reside in the source code (as the most useful for those who update the code and fix the bugs) :&lt;br /&gt;
&lt;br /&gt;
# Function signature&lt;br /&gt;
# Brief function description&lt;br /&gt;
# Arguments - [in/out] with description&lt;br /&gt;
# Return value description&lt;br /&gt;
# Detailed description (optional)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Part_2''' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ''optional'' fields may include:&lt;br /&gt;
&lt;br /&gt;
# ''See also'' section to refer to the related functions, &lt;br /&gt;
# ''Note'' section to highlight the specifics of the behaivor&lt;br /&gt;
# Examples of the usage&lt;br /&gt;
# Snap-shot of the real code involving this function&lt;br /&gt;
# Links to KRB5 Wiki Project page, krbdev discussion, RFC document or its section etc&lt;br /&gt;
# Version of Kerberos when fuction was introduced or became obsolete&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This effectively means that we expect the Doxygen style comments in the headers in the following format:&lt;br /&gt;
&lt;br /&gt;
 /**&lt;br /&gt;
   * @brief Some brief descr&lt;br /&gt;
   * &lt;br /&gt;
   * Optional long and very detailed description &lt;br /&gt;
   * &lt;br /&gt;
   * @param[in]  context  A krb5 library context (see krb5_Z())&lt;br /&gt;
   *&lt;br /&gt;
   * @return Something useful&lt;br /&gt;
   */&lt;br /&gt;
  char * KRB5_CALLCONV &lt;br /&gt;
  krb5_X ( krb5_context context) &lt;br /&gt;
&lt;br /&gt;
Also, when available, we suggest to have Part_2  information associated with the particular function in ReST format. It will be kept in the separate file (one file per function). For example:&lt;br /&gt;
&lt;br /&gt;
 * Warnings and suggestions&lt;br /&gt;
   Warn about any potential mistakes.&lt;br /&gt;
   Point to other useful places.&lt;br /&gt;
&lt;br /&gt;
  * Links to RFC, wiki Projects, krbdev discussions&lt;br /&gt;
   :rfc:4120 &lt;br /&gt;
   Or if you want to reffer to the specific section of the RFC use the following notation: :rfc:4120#section-5.2&lt;br /&gt;
   Or link to Kerberos Project page, for example, Disable_DES project  &amp;lt;http://k5wiki.kerberos.org/wiki/Projects/Disable_DES&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  * Example&lt;br /&gt;
     The place for the function usage examples&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Workflow: Putting Part_1 and Part_2 together'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Configure Doxygen to generate output both in xml and html formats. Run Doxygen.&lt;br /&gt;
# For each function and data type generate document in ReST format. It is expected that it contains information from Part_1. For the function ''krb5_X()'' lets call it ''krb5_X_p1''.&lt;br /&gt;
# If the Part_2 documentation for  ''krb5_X()'' has been already written, there is a file called ''krb5_X_p2.rst'' in the designated directory. If not - nothing happens.&lt;br /&gt;
# Concatenate ''krb5_X_p1'' and  ''krb5_X_p2.rst'' (if it exists), add the link to Doxygen generated documentation for this function in html format (generated automatically)  and save as a file  ''krb5_X.rst''. &lt;br /&gt;
# File  ''krb5_X.rst''  can be used as input for Sphinx &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NOTE: We provide Python script to automate steps 2-4.&lt;br /&gt;
&lt;br /&gt;
==== Documenting data types ====&lt;br /&gt;
&lt;br /&gt;
TODO&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to contribute ==&lt;br /&gt;
&lt;br /&gt;
# The core team - the administrator - posts the initial list of the tasks (such as API, admin tasks, &amp;quot;How to&amp;quot;-s etc) and further supports it. &lt;br /&gt;
# Community can suggest new tasks &lt;br /&gt;
# The core team provides templates that, if helpful, may be used by the documentation writers. The most desirable format for the contributed documents is ReST as the easiest to integrate with the mainstream documentation.&lt;br /&gt;
# Community can provide the feedback on the documented tasks. There will be a designated mail box krbdoc@mit.edu for this purpose&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
* Doxygen 1.7.2 &amp;lt;http://www.stack.nl/~dimitri/doxygen/index.html&amp;gt;&lt;br /&gt;
* Sphinx 1.0.4  &amp;lt;http://sphinx.pocoo.org&amp;gt;&lt;br /&gt;
* Python 2.5+&lt;br /&gt;
* Restructured Text markup &amp;lt;http://docutils.sourceforge.net/docs/user/rst/quickstart.html&amp;gt;&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Parallel_KDC&amp;diff=3235</id>
		<title>Projects/Parallel KDC</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Parallel_KDC&amp;diff=3235"/>
				<updated>2010-03-27T19:50:58Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design of Proposed Solution */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Problem ==&lt;br /&gt;
&lt;br /&gt;
The KDC is a single-threaded daemon--once it receives a complete request from a client, it fully processes that request before receiving another.  The performance consequences of this are threefold:&lt;br /&gt;
&lt;br /&gt;
* Only one CPU services KDC requests, including cryptography operations.&lt;br /&gt;
* When the KDC is reading data from disk (such as the replay cache or a BDB database), it does nothing else.&lt;br /&gt;
* If the KDB module retrieves data from a remote source (such as an LDAP query), the KDC does nothing while waiting for a reply.&lt;br /&gt;
&lt;br /&gt;
Most KDCs experience only moderate load and can service requests quickly.  In some circumstances, higher performance may be required.&lt;br /&gt;
&lt;br /&gt;
== Candidate Solutions ==&lt;br /&gt;
&lt;br /&gt;
There are four possible solutions, the first of which is already possible:&lt;br /&gt;
&lt;br /&gt;
* The realm administrator can run multiple KDC processes on the same host, each listening on a different port, each accessing the same database.  This is possible with the current implementation, and SRV records can be used to avoid the need for client configuration; however, it does not yield optimal performance.  Each client request will select a port without knowing whether the KDC process servicing that port is busy, and will wait for a timeout before trying another port.  Moreover, MIT krb5 client code does not implement randomization of equal-priority SRV records, so randomization of SRV responses by the DNS infrastructure would be necessary for load-balancing to occur, and such randomization is sometimes defeated by caching.  Parallelism is limited to the number of KDC processes.&lt;br /&gt;
&lt;br /&gt;
* We could make the KDC event-oriented.  This approach would require refactoring the entire KDC code base and all KDB modules.  The DAL would have to provide KDB modules access to the listen_and_process main loop, and all DAL requests would have to be structured with callbacks or other mechanisms to allow the answer to arrive after further iterations of the main loop.  This approach would only solve the problem of allowing the KDC to perform work while waiting for remote data sources such as LDAP; it would not allow multiple CPUs to service KDC requests or allow the KDC to perform work while waiting for disk accesses to complete.&lt;br /&gt;
&lt;br /&gt;
* We could make the KDC multithreaded.  This approach would require eliminating all use of global state (in particular, the kdc_active_realm variable and all of the macros such as kdc_context which derive from it) and ensuring that all library code used by the KDC is thread-safe.  Any mistakes in thread-safety might result in difficult-to-debug race conditions, some of which might have security consequences.&lt;br /&gt;
&lt;br /&gt;
* We could make the KDC use a multi-process worker model.  After setting up its initial state including listener sockets, the KDC would fork multiple subprocesses.  The set of idle subprocesses would compete for UDP packets or incoming TCP connections on the listener sockets, invisibly to clients.  Once a worker process has obtained a request, it would service it according to the current single-threaded logic.  Parallelism would be limited to the number of worker processes.&lt;br /&gt;
&lt;br /&gt;
This project proposes to implement the fourth option, as it requires minimal code changes and does not introduce much additional risk.&lt;br /&gt;
&lt;br /&gt;
== Design of Proposed Solution ==&lt;br /&gt;
&lt;br /&gt;
A new option would need to be added to the getopt() loop in initialize_realms() to specify the number of worker threads.  The -w option is a reasonable option since it is currently unused.&lt;br /&gt;
&lt;br /&gt;
Code to create the worker processes would be invoked from main() after the call to write_pid_file().  The parent process would act as a proxy for SIGTERM and SIGHUP so that killing the pid in the pid file terminates or signals all worker processes.&lt;br /&gt;
&lt;br /&gt;
The network socket code would likely need to set the listening sockets to non-blocking, and process_packet() would need to ignore EAGAIN errors instead of logging them.&lt;br /&gt;
&lt;br /&gt;
When the host network is reconfigured, the KDC must rebind its UDP listening sockets, on platforms with no IP_PKTINFO support.  (This is necessary to send UDP replies from the same address we received the request at.)  This cannot be done in the worker subprocesses since multiple processes cannot all bind to the same port, so workers would have to be terminated and restarted to perform reconfiguration.  Alternatively, the network reconfiguration support could be disabled when worker processes are used, or removed entirely; an inventory of IP_PKTINFO platform support would be helpful to evaluate the viability of these options.&lt;br /&gt;
&lt;br /&gt;
The KDB module should be independently opened in each worker process (rather than opening it once and cloning the resulting process state).  It is also probably a good idea to open and then close the KDB module in the supervisor, prior to starting worker processes, in order to get a more controlled failure if the KDB module is misconfigured.&lt;br /&gt;
&lt;br /&gt;
The logging code would need to be examined to make sure that concurrent access to the same logging sinks would not create problems.&lt;br /&gt;
&lt;br /&gt;
Additional attention to bug #1671 (no file locking used by replay cache) may be necessary to evaluate whether there is a security impact on a multi-process KDC, keeping in mind that allowing one replay to each independent KDC processes is typically not considered a serious security threat in master/slave scenarios.&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
In most test scenarios, requests are processed too quickly by the KDC to measure any difference in behavior from a multi-process worker model.  It should be possible to test this by hand by temporarily modifying the BDB back end to sleep() for a minute when looking up a particular principal name such as &amp;quot;slowuser&amp;quot;.  While testing, note that libkrb5 will retry requests after a timeout, so a single &amp;quot;kinit slowuser&amp;quot; will cause multiple worker processes to block unless the retry logic is disabled in the client code.  Client retry logic can be disabled in lib/krb5/os/sendto_kdc.c by changing MAX_PASS from 3 to 1 and changing all assignments to socktype2 to 0 (e.g. instead of SOCK_STREAM).&lt;br /&gt;
&lt;br /&gt;
Automated testing of this functionality would be pretty tricky; we would need a special stub KDB back end to cause worker processes to block, as well as a way to control the client retry loop.&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
This project is currently on the back burner.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Random_Salt_Generation&amp;diff=1749</id>
		<title>Projects/Random Salt Generation</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Random_Salt_Generation&amp;diff=1749"/>
				<updated>2009-07-26T07:31:57Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Salt generation */ more observations on des_string_to_key&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
&lt;br /&gt;
The idea of this project is to deprecate the notion of &amp;quot;salt type&amp;quot; and generate a random salt for all new principals.  Because of the associated complications, there are no resources allocated to the project at this time.&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
When Kerberos keys are derived from password, they are usually combined with a salt, to prevent attackers from building up a pre-calculated dictionary of keys based on common passwords.  The default salt is specified by RFC 4120 as &amp;quot;the concatenation of the principal's realm and name components, in order, with no separators&amp;quot; but the KDC can also provide an alternate salt to the client in an AS-REP.  Note that RC4 keys are are an exception; they depend only on the password, not on a salt.&lt;br /&gt;
&lt;br /&gt;
The MIT KDC has an internal concept of &amp;quot;salt types&amp;quot; defined by the DB abstraction layer.  A salt type of SPECIAL indicates that the salt is stored in the database alongside the key; other salt types indicate various ways of computing the salt from the principal.  NORMAL indicates the default salt, but as of 1.7, the KDC explicitly communicates the salt to the client even if the salt type is NORMAL.  Salt types can be determined using enctype:salttype pairs either in the supported_enctypes krb5.conf variable or in the -e option to the add_principal or change_password kadmin commands.&lt;br /&gt;
&lt;br /&gt;
==Benefits==&lt;br /&gt;
&lt;br /&gt;
Generating random salts for keys has the following benefits:&lt;br /&gt;
&lt;br /&gt;
* Easier principal renaming -- currently when a principal with a computed salt is renamed, the old salt must be computed and stored in the DB entry.  This would be unnecessary for principals created with random salts.  Of course, the code to compute and store the old salt would still be necessary because of legacy DB entries.&lt;br /&gt;
* If a principal is renamed, the stored old value of the default salt would expose the old name of the principal.  In general this would not be sensitive information, but in rare cases it might be.  Randomly generated salts would avoid this exposure.&lt;br /&gt;
* Simpler principal canonicalization -- randomly generated salts avoid any ambiguity when a principal is canonicalized or a key set is shared between multiple canonical principal names.&lt;br /&gt;
* Simpler configuration -- without the concept of salt types, supported_enctypes can be a list of enctypes just like the other enctype variables.  This would allow supported enctypes to take advantage of the syntax extensions from [[Projects/Enctype_config_enhancements]].&lt;br /&gt;
&lt;br /&gt;
==Complications==&lt;br /&gt;
&lt;br /&gt;
* Our password history checking currently does not work if the salt changes (except for RC4 keys which are salt-independent); it only compares new keys against old keys.  This is arguably a bug; in any event, it would have to be changed to try generating keys wit the new password and old salts to match against old keys.&lt;br /&gt;
* Although RFC 4120 cautions that &amp;quot;it is not possible to generate a user's key reliably given a pass phrase without contacting the KDC, since it will not be known whether alternate salt or parameter values are required,&amp;quot; we have a ktutil command to do so anyway, which assumes the default salt.  This would need to be addressed, perhaps by making ktutil acquire credentials to determine the salt.&lt;br /&gt;
* Cross-realm TGTs are typically entered into both KDC databases using the same password.  If they use different salts, they won't have the same keys, and won't work.  This would have to be addressed, perhaps via an option to add_principal to use a fixed salt or the default salt.&lt;br /&gt;
* There may also be an issue with the creation of machine and service accounts for Windows, according to http://mailman.mit.edu/pipermail/krbdev/2009-July/007839.html&lt;br /&gt;
&lt;br /&gt;
==Salt generation==&lt;br /&gt;
&lt;br /&gt;
Salts should use only printable ASCII characters, as they must be transmitted to the client in a KerberosString.&lt;br /&gt;
&lt;br /&gt;
Ken Raeburn made the following notes about the length of the salt:&lt;br /&gt;
&lt;br /&gt;
* DES string-to-key uses a fan-fold technique that's likely to make some of the salt bits cancel each other out, depending on the password length; I'd suggest at least 112 bits but you can probably stare at it and figure it out for sure.&lt;br /&gt;
* DES3 uses 168-fold, where the efficacy of the mixing is again determined in part by the password length. It's better, but I'm not convinced 168 random bits expanded to a salt string will let you cover the whole possible key space (which I think would be desirable... though I suppose not absolutely required). I looked at it a while back but don't remember the specifics. It may just be that when password+salt has a length that's a multiple of 168 the fixed bits due to use of printable ASCII are just doomed to line up and cut powers of 2 off the possible generated key space.&lt;br /&gt;
* AES uses PBKDF2 with SHA-1; that's probably fine with 160 random bits. (Even for a 128-bit key, I'd probably use 160 random bits, to try to get maximum coverage of the output space for a given password before the truncation, but haven't thought about it much. It's not like it couldn't be changed later if more careful analysis determines that 128 random bits are sufficient.)&lt;br /&gt;
* Hm.. for DES I take it back -- you don't need 112 random bits, but 16 randomized printable-ASCII bytes; more than that and the non-fixed bits just start getting xor'ed with each other and don't help. You could tune it a bit by looking at the bit-value probabilities for printable ASCII and where they're going to get xor'ed, and see if you can guarantee that at least one of the bits going in has exactly 0.5 probability of being set.&lt;br /&gt;
** After some more contemplation, I think 16 characters where the low four bits are randomly chosen and the upper bits fixed (''e.g.'', 0x40-0x4F), 64 random bits total, after the fan-fold and XOR, may suffice to guarantee complete possible coverage of and flat distribution over the 56-bit intermediate key space; half the bytes will be bit-reversed for the XOR, randomizing the upper bits of the intermediate result, and while we don't know which ones, we can show that for 16 bytes, exactly one will contribute normally and exactly one bit-reversed will contribute to a given byte of the intermediate output.  It may be that only, say, the even bytes need four random bits and odd ones can get away with three (because we're reversing and combining 7-bit &amp;quot;bytes&amp;quot;), getting us down to 56 random bits of input, but that should be analyzed more closely to be sure.  But, see below re: &amp;quot;whatever&amp;quot; and not caring too much. :-)  --[[User:KenRaeburn|KenRaeburn]] 03:31, 26 July 2009 (EDT)&lt;br /&gt;
* (In case it's not clear why I'm thinking about that, consider two-bit values permitted to vary from 0 to 2. Chosen randomly from the range, the low bit has a 2/3 probability of being set. If you xor two of these together, the low bit has a 2*2/3*1/3 = 4/9 probability of being set, giving uneven distribution across the possible resulting 2-bit strings. For printable ASCII, c&amp;amp;0x70 will range from 2-7 and 0x7f will presumably be left out; it's not as skewed as my example, but it's not an even distribution. Then again, DES is being phased out, and choosing 16 bytes randomly from 0x20-0x7e is still a lot better than what we have now, so, whatever.)&lt;br /&gt;
* And on the more general salt-length issue, I think I've mentioned it before, but if the salts are big enough to ensure coverage of most or all of the possible key space even with weak passwords, an attacker can't effectively build up dictionaries of common passwords plus all possible salts, or cutting large ranges of possible keys out of a brute-force search. It's probably true that multiplying the work factor by 2**64 or less would be adequate, as long as we can be confident that there aren't classes of salt strings or salt+password combinations that the attacker can handle efficiently for certain cryptosystems (e.g., because certain pairs of bits only influence the result via their xor, making them effectively single bits). Like I already said, the details can be tuned later depending on risk analysis. And sending more bits rather than fewer until the analysis is done doesn't really cost much.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=1299</id>
		<title>Test suite</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=1299"/>
				<updated>2009-06-30T12:55:59Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Software needed for running &amp;quot;make check&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lore]]&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
* ''svn checkout svn://anonsvn.mit.edu/krb5/trunk''&lt;br /&gt;
* Navigate to trunk/src&lt;br /&gt;
* ''util/reconf''&lt;br /&gt;
* ''./configure''&lt;br /&gt;
* ''make''&lt;br /&gt;
* ''make check''&lt;br /&gt;
* ''make install'' (as root, unless you gave a --prefix option to configure which you can write to as yourself)&lt;br /&gt;
&lt;br /&gt;
== Software needed for running &amp;quot;make check&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
On Ubuntu or Debian systems, a number of packages need to be installed in order for &amp;quot;make check&amp;quot; to function.  These include:&lt;br /&gt;
&lt;br /&gt;
* dejagnu&lt;br /&gt;
* expect&lt;br /&gt;
* tcl&lt;br /&gt;
* tcl-dev (needed by test programs that are extensions to the tcl program)&lt;br /&gt;
* portmap (needed by lib/rpc-unit-test)&lt;br /&gt;
* csh (or maybe tcsh; needed by some of the libdb2 tests)&lt;br /&gt;
* g++&lt;br /&gt;
* byacc or bison (bison if you configure with &amp;quot;--enable-maintainer-mode&amp;quot; and need to rebuild certain of the parsers where we check in the generated C files)&lt;br /&gt;
* ncurses-dev&lt;br /&gt;
* libtool libltd13-dev&lt;br /&gt;
&lt;br /&gt;
== Known test suite issues ==&lt;br /&gt;
&lt;br /&gt;
On Linux systems, sometimes the &amp;lt;code&amp;gt;--disable-rpath&amp;lt;/code&amp;gt; option to &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; is required in order to avoid problems with previously-installed versions of MIT krb5.  Alternatively, you can run &amp;quot;make install&amp;quot; before &amp;quot;make check&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The calls to krb5_c_random_os_entropy that pass the value 1 in the &amp;lt;code&amp;gt;strong&amp;lt;/code&amp;gt; argument, which causes the library to read from the strong OS random number source, can cause stalls and timeouts in the test suite.  Changing those calls to pass 0 instead will reduce the stalls.  We need to have a better way to disable the reading of strong random numbers during tests.  This is primarily a problem on Linux systems.&lt;br /&gt;
&lt;br /&gt;
If an existing kdc.conf exists in the &amp;quot;installed&amp;quot; location, it can disrupt the automated tests, especially if it contains syntax errors.&lt;br /&gt;
&lt;br /&gt;
On recent Debian or Ubuntu systems, a bug in &amp;lt;code&amp;gt;expect&amp;lt;/code&amp;gt; that can cause stalls in the dejagnu parts of the test suite is documented at http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421187&lt;br /&gt;
&lt;br /&gt;
The testing user's shell must be listed in /etc/shells or the gssftp tests will fail.  This will cease to be a concern for the main krb5 test suite if and when the applications are unbundled into a separate package.&lt;br /&gt;
&lt;br /&gt;
The rlogin and telnet dejagnu tests require root access; without it, the test suite will skip those tests.  To run these tests, you can either run the test suite as root, or arrange for &amp;quot;rlogin &amp;lt;localhostname&amp;gt; -l root -x&amp;quot; to succeed.  (The environment variables RLOGIN and RLOGIN_FLAGS can override the &amp;quot;rlogin&amp;quot; and &amp;quot;-x&amp;quot; parts of that command line.)  This will also cease to be a concern for the main krb5 test suite if and when the applications are unbundled.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=1298</id>
		<title>Test suite</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Test_suite&amp;diff=1298"/>
				<updated>2009-06-30T12:54:20Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Software needed for running &amp;quot;make check&amp;quot; */ bison's only for maintainer mode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Lore]]&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
* ''svn checkout svn://anonsvn.mit.edu/krb5/trunk''&lt;br /&gt;
* Navigate to trunk/src&lt;br /&gt;
* ''util/reconf''&lt;br /&gt;
* ''./configure''&lt;br /&gt;
* ''make''&lt;br /&gt;
* ''make check''&lt;br /&gt;
* ''make install'' (as root, unless you gave a --prefix option to configure which you can write to as yourself)&lt;br /&gt;
&lt;br /&gt;
== Software needed for running &amp;quot;make check&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
On Ubuntu or Debian systems, a number of packages need to be installed in order for &amp;quot;make check&amp;quot; to function.  These include:&lt;br /&gt;
&lt;br /&gt;
* dejagnu&lt;br /&gt;
* expect&lt;br /&gt;
* tcl&lt;br /&gt;
* tcl-dev (needed by test programs that are extensions to the tcl program)&lt;br /&gt;
* portmap (needed by lib/rpc-unit-test)&lt;br /&gt;
* csh (or maybe tcsh; needed by some of the libdb2 tests)&lt;br /&gt;
* g++&lt;br /&gt;
* byacc (or bison if you configure with &amp;quot;--enable-maintainer-mode&amp;quot; and need to rebuild one of the parsers where we check in the generated C files)&lt;br /&gt;
* ncurses-dev&lt;br /&gt;
* libtool libltd13-dev&lt;br /&gt;
&lt;br /&gt;
== Known test suite issues ==&lt;br /&gt;
&lt;br /&gt;
On Linux systems, sometimes the &amp;lt;code&amp;gt;--disable-rpath&amp;lt;/code&amp;gt; option to &amp;lt;code&amp;gt;configure&amp;lt;/code&amp;gt; is required in order to avoid problems with previously-installed versions of MIT krb5.  Alternatively, you can run &amp;quot;make install&amp;quot; before &amp;quot;make check&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The calls to krb5_c_random_os_entropy that pass the value 1 in the &amp;lt;code&amp;gt;strong&amp;lt;/code&amp;gt; argument, which causes the library to read from the strong OS random number source, can cause stalls and timeouts in the test suite.  Changing those calls to pass 0 instead will reduce the stalls.  We need to have a better way to disable the reading of strong random numbers during tests.  This is primarily a problem on Linux systems.&lt;br /&gt;
&lt;br /&gt;
If an existing kdc.conf exists in the &amp;quot;installed&amp;quot; location, it can disrupt the automated tests, especially if it contains syntax errors.&lt;br /&gt;
&lt;br /&gt;
On recent Debian or Ubuntu systems, a bug in &amp;lt;code&amp;gt;expect&amp;lt;/code&amp;gt; that can cause stalls in the dejagnu parts of the test suite is documented at http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=421187&lt;br /&gt;
&lt;br /&gt;
The testing user's shell must be listed in /etc/shells or the gssftp tests will fail.  This will cease to be a concern for the main krb5 test suite if and when the applications are unbundled into a separate package.&lt;br /&gt;
&lt;br /&gt;
The rlogin and telnet dejagnu tests require root access; without it, the test suite will skip those tests.  To run these tests, you can either run the test suite as root, or arrange for &amp;quot;rlogin &amp;lt;localhostname&amp;gt; -l root -x&amp;quot; to succeed.  (The environment variables RLOGIN and RLOGIN_FLAGS can override the &amp;quot;rlogin&amp;quot; and &amp;quot;-x&amp;quot; parts of that command line.)  This will also cease to be a concern for the main krb5 test suite if and when the applications are unbundled.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Debugging_tips&amp;diff=1225</id>
		<title>Debugging tips</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Debugging_tips&amp;diff=1225"/>
				<updated>2009-04-30T15:46:18Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Compile-Time Flags */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents krb5-specific techniques which may help debug problems.  Feel free to add additional techniques.&lt;br /&gt;
&lt;br /&gt;
As always, the basic tools are helpful: debuggers like gdb or dbx, system call tracing tools like strace or truss, shared library tracing tools like ltrace or sotruss, and memory debugging tools like valgrind or Purify.&lt;br /&gt;
&lt;br /&gt;
==Compile-Time Flags==&lt;br /&gt;
&lt;br /&gt;
You can build the tree with additional flags like so:&lt;br /&gt;
&lt;br /&gt;
  make clean&lt;br /&gt;
  make CPPFLAGS=-DFLAGNAME&lt;br /&gt;
&lt;br /&gt;
or in a new build tree:&lt;br /&gt;
&lt;br /&gt;
  .../configure CPPFLAGS=-DFLAGNAME&lt;br /&gt;
  make&lt;br /&gt;
&lt;br /&gt;
===DEBUG_ERROR_LOCATIONS===&lt;br /&gt;
&lt;br /&gt;
The DEBUG_ERROR_LOCATIONS flag causes verbose error messages generated from the krb5 libraries to include file and line number information.  It can be useful if you're having trouble tracking down where an error message is generated.  It will not work in cases where an error code is generated with no call to krb5_set_error_message or krb5int_set_error; in that case you will have to track it down the slow way with gdb or whatever.  If you are seeing an error with no corresponding krb5_set_error_message_call, consider whether the error case is &amp;quot;likely&amp;quot; and perhaps add a krb5_set_error_message to make it clearer what is going on.&lt;br /&gt;
&lt;br /&gt;
==Debugging the KDC==&lt;br /&gt;
&lt;br /&gt;
krb5kdc can be run with the -n flag to prevent it from backgrounding itself, allowing you to set breakpoints before it starts.  Alternatively, you can attach to the process after it forks.  The process_as_req and process_tgs_req functions are the entry points to handling client requests.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=1214</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=1214"/>
				<updated>2009-03-21T18:32:36Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* January 2009 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==February 2009==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2009-02-03 | February 3, 2009 (2009-02-03)]]&lt;br /&gt;
&lt;br /&gt;
==January 2009==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2009-01-27 | January 27, 2009 (2009-01-27)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2009-01-13 | January 13, 2009 (2009-01-13)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2009-01-06 | January 6, 2009 (2009-01-06)]]&lt;br /&gt;
&lt;br /&gt;
==October 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-10-14 | October 14, 2008 (2008-10-14)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-10-07 | October 7, 2008 (2008-10-07)]]&lt;br /&gt;
&lt;br /&gt;
==September 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-30 | September 30, 2008 (2008-09-30)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-09 | September 9, 2008 (2008-09-09)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-02 | September 2, 2008 (2008-09-02)]]&lt;br /&gt;
&lt;br /&gt;
==August 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-26 | August 26, 2008 (2008-08-26)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-04 | August 4, 2008 (2008-08-04)]]&lt;br /&gt;
&lt;br /&gt;
==July 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-21 | July 21, 2008 (2008-07-21)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-14 | July 14, 2008 (2008-07-14)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-07 | July 7, 2008 (2008-07-07)]]&lt;br /&gt;
&lt;br /&gt;
==June 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-30 | June 30, 2008 (2008-06-30)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-23 | June 23, 2008 (2008-06-23)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-16 | June 16, 2008 (2008-06-16)]]&lt;br /&gt;
&lt;br /&gt;
==May 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-19 | May 19, 2008 (2008-05-19)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-12 | May 12, 2008 (2008-05-12)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-05 | May 5, 2008 (2008-05-05)]]&lt;br /&gt;
&lt;br /&gt;
==April 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-04-28 | April 28, 2008 (2008-04-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-04-14 | April 14, 2008 (2008-04-14)]]&lt;br /&gt;
&lt;br /&gt;
==March 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-03-31 |March 31, 2008 (2008-03-31)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-24 |March 24, 2008 (2008-03-24)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-17 |March 17, 2008 (2008-03-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-10 |March 10, 2008 (2008-03-10)]]&lt;br /&gt;
&lt;br /&gt;
==February 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-02-04 |February 4, 2008 (2008-02-04)]]&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2009-01-27&amp;diff=1213</id>
		<title>Release Meeting Minutes/2009-01-27</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2009-01-27&amp;diff=1213"/>
				<updated>2009-03-21T18:32:06Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: '''Release Meeting Minutes for 2009-01-27'''  Present: Zhanna, Greg, Tom, Thomas, Ken, Will  Updates: * Ken: reviewed Will's code, working on update_princ_encryption * Tom: doing disable D...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Release Meeting Minutes for 2009-01-27'''&lt;br /&gt;
&lt;br /&gt;
Present: Zhanna, Greg, Tom, Thomas, Ken, Will&lt;br /&gt;
&lt;br /&gt;
Updates:&lt;br /&gt;
* Ken: reviewed Will's code, working on update_princ_encryption&lt;br /&gt;
* Tom: doing disable DES by default capability, simpler version with allow_weak_crypto config var; working on bug db, release notes&lt;br /&gt;
* Zhanna: referrals more or less done, working on bugs&lt;br /&gt;
* Greg: Will be working on &amp;quot;kdb5_util sync_stash&amp;quot; command after spinning up on mkey_migrate; should it be renamed or merged into &amp;quot;kdb5_util stash&amp;quot;?&lt;br /&gt;
* Will: &amp;quot;kdb5_util dump&amp;quot; mkey convert option - tried implementing with some add_mkey code, running into a deadlock problem; looks like db2 back end has mutex locks in a couple places where not needed, will fix.  Most of Ken's major review points have been addressed.  Will address mkey-convert, do more testing, tackle &amp;quot;kdb5_util purge_mkeys&amp;quot;.  Can run &amp;quot;make check&amp;quot; successfully.  Needs Ken's script for filtering valgrind log files to find errors.&lt;br /&gt;
&lt;br /&gt;
1.7 planning:&lt;br /&gt;
* Schedule for cut = Friday noon.  Try to wrap things up by Thursday.&lt;br /&gt;
* Will can add tests for mkey-migration later, but needs to get a schedule to Tom by Friday.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2009-01-06&amp;diff=1212</id>
		<title>Release Meeting Minutes/2009-01-06</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2009-01-06&amp;diff=1212"/>
				<updated>2009-03-21T18:32:03Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: '''Meeting notes for 2009-01-06'''  Present: Greg H, Zhanna T, Steve B, Tom Y, Ken R, Sam H, Will F  Updates: * Will: Estimate ~17 days' work left.  Might help to get someone to review wor...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Meeting notes for 2009-01-06'''&lt;br /&gt;
&lt;br /&gt;
Present: Greg H, Zhanna T, Steve B, Tom Y, Ken R, Sam H, Will F&lt;br /&gt;
&lt;br /&gt;
Updates:&lt;br /&gt;
* Will: Estimate ~17 days' work left.  Might help to get someone to review work done so far, may be able to get changes to the trunk by the 31st.  Will try to commit work done so far to branch in MIT repository for review.  Still working with same design previously discussed.  Might be able to get some manpower to help out.&lt;br /&gt;
* Sam: Luke &amp;amp; Sam's work is about 95% done.  Open issues: Project writeup for non-DCE GSSAPI changes; get aliasing project writeup into review; enctype nego writeup is in review as of today.  Want to get to some more reviewing of code for some of the very latest changes, but probably okay if that doesn't happen.  Still need an answer: Luke's code adds encrypted pa-data structure for referral data, changing an ABI, probably not in a horrible way, but we'd need to discuss it, should at least run by Apple and Sun.  We might be able to just take it out.  Waiting on answer to a question from Larry regarding cases where Windows behavior doesn't match Larry's understanding; might affect this.  ...Some discussion of Luke's statement of work and current states of things....&lt;br /&gt;
* Zhanna: Working on domain_realm mapping in KDC, close to done.&lt;br /&gt;
* Greg: Working on replay cache hashes, about half done.  Might want to change some internal interfaces to the replay cache.  Hash values may be needed only for rd-req, not rd-safe or rd-priv cases where we don't know if there are any collisions happening in pracice.&lt;br /&gt;
* Ken: Looking over Luke &amp;amp; Sam's changes, have some test suite failures.  Need to revisit the KDC logging code after the merge.&lt;br /&gt;
* Tom: Looking at the client realm referral handling code.&lt;br /&gt;
&lt;br /&gt;
Action items:&lt;br /&gt;
* Will: Commit current work to branch in MIT repository.  Talk to Anup about extra resources.&lt;br /&gt;
* Ken: Fully committed for this week.  Try to look at Will's branch next week.  Review KDC logging again.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1184</id>
		<title>Coding style/Practices</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1184"/>
				<updated>2009-01-26T21:10:39Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Misc. to be sorted */ we use small struct passing internally, have for a while; it's not a problem. omit -Wconversion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== String Handling ==&lt;br /&gt;
&lt;br /&gt;
Code should not use any of the following functions: strcpy, strcat, sprintf, or any *scanf function.&lt;br /&gt;
&lt;br /&gt;
Dynamically allocated buffers are preferred to fixed-sized buffers.  When using dynamic buffers:&lt;br /&gt;
* Use strdup or asprintf for simple constructions.&lt;br /&gt;
* Use the k5buf module (k5-buf.h) for complex constructions.  If this is not desirable, strlcpy and strlcat are valid alternatives.&lt;br /&gt;
&lt;br /&gt;
Substitute versions of strlcpy, strlcat, and asprintf, for operating systems that don't supply them, are declared in k5-platform.h and defined in the support library (which practically everything in the tree links directly against).&lt;br /&gt;
&lt;br /&gt;
When using fixed-sized buffers:&lt;br /&gt;
* Use strlcpy for simple copies.&lt;br /&gt;
* Use snprintf for simple compound constructions.  Avoid using precision or field width specifiers in snprintf format strings.&lt;br /&gt;
* To check for truncation when using snprintf, use the following approach:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
result = snprintf(buffer, sizeof(buffer), &amp;quot;format string&amp;quot;, ...);&lt;br /&gt;
if (SNPRINTF_OVERFLOW(result, sizeof(buffer))&lt;br /&gt;
    handle_overflow_error;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SNPRINTF_OVERFLOW macro is defined in k5-platform.h.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly conforms, with some exceptions.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
It is relatively common to audit a code base such as krb5 and flag all uses of strcpy and similar functions, even if they are used safely.  Verifying that the function is used safely requires manual inspection.  Using safer alternatives does not guarantee code safety, but does reduce the likelihood of a catastrophic buffer overflow vulnerability.&lt;br /&gt;
&lt;br /&gt;
In some compilation environments under Solaris, field widths and precisions are computed using screen columns rather than bytes.&lt;br /&gt;
&lt;br /&gt;
sprintf returns a signed integer; buffer sizes are typically size_t (which is an unsigned type).  Comparing the two directly will result in a warning from some compilers, and has unpredictable semantics depending on the relative widths of int and size_t.  Also, some sprintf implementations, such as the one in Solaris prior to version 10, return -1 on a buffer overflow, whereas the C99 behavior returns the number of bytes which would have been written to the string.  The SNPRINTF_OVERFLOW macro uses casts to address both issues.&lt;br /&gt;
&lt;br /&gt;
The k5buf module safely allows multi-step string construction within fixed-size or dynamic buffers without performing an error check on each append, and without pre-computing lengths.  Errors need only be checked when the resulting string needs to be read or handed off to another function.&lt;br /&gt;
&lt;br /&gt;
== Exception Handling ==&lt;br /&gt;
&lt;br /&gt;
If a function allocates several resources and has many exit paths, use the following general structure when possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  krb5_error_code retval;&lt;br /&gt;
  char *ptr1 = NULL;&lt;br /&gt;
  krb5_blah *ptr2 = NULL;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  retval = another_function(...);&lt;br /&gt;
  if (retval != 0)&lt;br /&gt;
    goto cleanup;&lt;br /&gt;
...&lt;br /&gt;
cleanup:&lt;br /&gt;
  if (ptr1)&lt;br /&gt;
    free(ptr1);&lt;br /&gt;
  if (ptr2)&lt;br /&gt;
    kbr5_free_blah(ptr2);&lt;br /&gt;
  return retval;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simpler functions may use simpler structures, but do not get to the point of freeing the same resource in several different places within a function depending on the exit path.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly conforms, with some exceptions.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This is the most reliable way to avoid resource leaks within the constraints of the krb5 code base.  Within libraries, the code base does not abort on memory allocation failure, so tends to have many exit paths within some functions.&lt;br /&gt;
&lt;br /&gt;
== Output parameter handling ==&lt;br /&gt;
&lt;br /&gt;
If a function has output parameters, it should initialize them in all cases, even if it returns failure.  Most of the time, this means setting pointer output parameters to NULL and numeric output parameters to zero at the beginning of the function.  The real output values should not be assigned to the output parameters until successful completion from the function is guaranteed.  A typical function with output parameters should look something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
krb5_error_code&lt;br /&gt;
function_with_output_param(type *input_param, type *out_ptr, int *out_len)&lt;br /&gt;
{&lt;br /&gt;
  declarations here;&lt;br /&gt;
&lt;br /&gt;
  *out_ptr = NULL;&lt;br /&gt;
  *out_len = 0;&lt;br /&gt;
&lt;br /&gt;
  stuff that can go wrong here;&lt;br /&gt;
&lt;br /&gt;
  *out_ptr = ptr;&lt;br /&gt;
  *out_len = len;&lt;br /&gt;
  return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
  cleanup code here;&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple wrappers do not need to worry about this rule unless they are invoking functions through pointers.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly does not conform.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This practice makes it clear to static analysis tools that the previous value of the output parameter will not be used, and also helps convey under what circumstances an output parameter is initialized.  If there happens to be a bug in the function such that it returns success but does not set output parameters, or in the caller such that it uses an output parameter even though the function returned failure, then the bug will result in predictable behavior (generally a NULL pointer dereference) with no security consequences beyond a denial of service attack.&lt;br /&gt;
&lt;br /&gt;
== Assignments as truth values ==&lt;br /&gt;
&lt;br /&gt;
Do not use assignments as truth values.  Rather than this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if ((retval = krb5_foo()))&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
retval = krb5_foo();&lt;br /&gt;
if (retval)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code varies widely.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This makes the code easier to read, and also makes it easier to use&lt;br /&gt;
debuggers.  It may be excusable to put assignments into the&lt;br /&gt;
conditional espression of a &amp;quot;while&amp;quot; statement, though, like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ((ch = getopt(argc, argv, &amp;quot;abn&amp;quot;)) != -1)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using assignments as truth values in conditional expressions (&amp;quot;ternary expressions&amp;quot;) may make&lt;br /&gt;
code particularly impenetrable.&lt;br /&gt;
&lt;br /&gt;
== The many names of zero ==&lt;br /&gt;
&lt;br /&gt;
There are at least three types of &amp;quot;zero&amp;quot; known to C.  These are the&lt;br /&gt;
integer zero (0), the null pointer constant (NULL), and the character&lt;br /&gt;
constant zero ('\0').  Yes, these are usually all technically the&lt;br /&gt;
integer zero.  Use them in their correct contexts.  (Purists will&lt;br /&gt;
point out that 0 is a valid null pointer constant; still, do not use 0&lt;br /&gt;
to specify a null pointer constant.  For further unconfusion, read the&lt;br /&gt;
section on null pointer constants in the C FAQ.)  Do not use a lone&lt;br /&gt;
variable as a truth value unless it's of integer type.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i;&lt;br /&gt;
char *cp;&lt;br /&gt;
/* ... */&lt;br /&gt;
if (i)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
if (cp != NULL) {&lt;br /&gt;
    while (*cp != '\0')&lt;br /&gt;
        /* ... */;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not cast uses of NULL unless you're calling a function with a&lt;br /&gt;
variable number of arguments, in which case you should cast it to to&lt;br /&gt;
the appropriate pointer type.  (NULL may be defined as 0, and an integer 0&lt;br /&gt;
may not be the same size in the argument list as a pointer on a 64-bit&lt;br /&gt;
platform.)  Likewise, do not cast the return value&lt;br /&gt;
from malloc() and friends; the prototype should declare them properly&lt;br /&gt;
as returning a void * and thus shouldn't require an explicit cast.&lt;br /&gt;
&lt;br /&gt;
In any case, reading the section in the C FAQ on null pointers is&lt;br /&gt;
highly recommended to remove confusion regarding null pointers in C,&lt;br /&gt;
since this is a subject of much confusion to even experienced&lt;br /&gt;
programmers.  In particular, if you do not understand why using&lt;br /&gt;
calloc() to allocate a struct that contains pointer members or why&lt;br /&gt;
calling memset() to initialize such a struct to all-bytes-zero is&lt;br /&gt;
wrong, reread that section again.  (Note that there are *lots* of&lt;br /&gt;
examples of code in the krb5 source tree that erroneously calls&lt;br /&gt;
memset() to zero a struct, and we should fix these somehow&lt;br /&gt;
eventually.)&lt;br /&gt;
&lt;br /&gt;
== Brace placement ==&lt;br /&gt;
&lt;br /&gt;
Control flow statements that have a single statement as their body&lt;br /&gt;
should nevertheless have braces around their bodies if the body is&lt;br /&gt;
more than one line long, especially in the case of stacked multiple&lt;br /&gt;
if-else clauses; use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (x) {&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if (x)&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which, while legible to the compiler, may confuse human readers and&lt;br /&gt;
make the code less maintainable, especially if new branches get added&lt;br /&gt;
to any of the clauses.&lt;br /&gt;
&lt;br /&gt;
If you are writing a do-while loop that has only one statement in its&lt;br /&gt;
body, put braces around it anyway, since the while clause may be&lt;br /&gt;
mistaken for a while loop with an empty body.  Don't do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
do&lt;br /&gt;
    foo();&lt;br /&gt;
while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead, write this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
do {&lt;br /&gt;
    foo();&lt;br /&gt;
} while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preprocessor conditionals ==&lt;br /&gt;
&lt;br /&gt;
Instead of scattering &amp;lt;code&amp;gt;#ifdef&amp;lt;/code&amp;gt; or other preprocessor conditionals throughout the code use preprocessor conditionals to control the definition of a function-like macro, or similar construct, which is used instead of embedded preprocessor conditionals in code.&lt;br /&gt;
&lt;br /&gt;
Instead of this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    do_something();&lt;br /&gt;
    /* bad style */&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    fprintf(stderr, &amp;quot;did something\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    do_something_else();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do something more like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
#define DPRINTF(x) fprintf(stderr, x)&lt;br /&gt;
#else&lt;br /&gt;
#define DPRINTF(x)		/* empty */&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* ... */&lt;br /&gt;
&lt;br /&gt;
    do_something();&lt;br /&gt;
    /* better style */&lt;br /&gt;
    DPRINTF((&amp;quot;did something\n&amp;quot;));&lt;br /&gt;
    do_something_else();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not intersperse conditional compilation&lt;br /&gt;
directives with control flow statements, as some combination of&lt;br /&gt;
&amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;d symbols may result in statements getting eaten by dangling&lt;br /&gt;
bits of control flow statements.  When it is not possible to avoid&lt;br /&gt;
this questionable practice (you really should rewrite the relevant&lt;br /&gt;
code section), make use of redundant braces to ensure that a compiler&lt;br /&gt;
error will result in preference to incorrect runtime behavior (such as&lt;br /&gt;
inadvertently providing someone with a root shell).&lt;br /&gt;
&lt;br /&gt;
Do not intersperse conditional compilation directives with control&lt;br /&gt;
flow statements in such a way that confuses emacs cc-mode.  Not only&lt;br /&gt;
does emacs get confused, but the code becomes more difficult to read&lt;br /&gt;
and maintain.  Therefore, avoid code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /* bad style */&lt;br /&gt;
    if (x) {&lt;br /&gt;
        f();&lt;br /&gt;
    }&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
    else if (y) {&lt;br /&gt;
#else&lt;br /&gt;
    else {&lt;br /&gt;
#endif&lt;br /&gt;
        g();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put comments after conditional compilation directives such as &amp;quot;#else&amp;quot;&lt;br /&gt;
and &amp;quot;#endif&amp;quot;.  Make them correspond to the sense of the value that&lt;br /&gt;
controls the compilation of the section they are closing, i.e.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !FOO */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !FOO */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, in the case of more complex conditional compilation directives,&lt;br /&gt;
write the comments like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if defined(FOO) || defined(BAR)&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly does not conform.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
Instances of &amp;quot;ifdef soup&amp;quot; make code more difficult to read, and make it more difficult to recognize bugs.&lt;br /&gt;
&lt;br /&gt;
== Local variables ==&lt;br /&gt;
&lt;br /&gt;
Do not declare variables in an inner scope, e.g. inside the compound&lt;br /&gt;
substatement of an if statement, unless the complexity of the code&lt;br /&gt;
really demands that the variables be declared that way.  In such&lt;br /&gt;
situations, the function could probably stand to be broken up into&lt;br /&gt;
smaller chunks anyway.  Do not declare variables in an inner scope&lt;br /&gt;
that shadow ones in an outer scope, since this leads to confusion.&lt;br /&gt;
Also, some debugging environments, such as gdb under Solaris, can't&lt;br /&gt;
see variables declared in an inner scope, so declaring such variables&lt;br /&gt;
will make maintenance more difficult as well.&lt;br /&gt;
&lt;br /&gt;
== Placement of parentheses ==&lt;br /&gt;
&lt;br /&gt;
Parenthesize expressions that may be confusing, particularly where C's&lt;br /&gt;
precedences are broken.  For example, the shift operators have lower&lt;br /&gt;
precedence than the +, -, *, /, and % operators.  Perhaps the most&lt;br /&gt;
familiar C precedence quirk is that equality and relational operators&lt;br /&gt;
are of higher precedence than assignment operators.  Less well known&lt;br /&gt;
is that the bitwise operators are of a lower precedence than equality&lt;br /&gt;
and relational operators.&lt;br /&gt;
&lt;br /&gt;
The sizeof operator takes either a unary expression or a parenthesized&lt;br /&gt;
type name.  It is not necessary to parenthesize the operand of sizeof&lt;br /&gt;
if it is applied to a unary expression, but still, always parenthesize&lt;br /&gt;
the operand of the sizeof operator.  The sizeof operator does not&lt;br /&gt;
evaluate its operand if it is a unary expression, so usages such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = sizeof(++foo);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should be avoided for the sake of sanity and readability.&lt;br /&gt;
&lt;br /&gt;
== Function-like macros ==&lt;br /&gt;
&lt;br /&gt;
Macros should have all-uppercase names.  If it is necessary to use&lt;br /&gt;
multiple statements, use braces, and wrap the whole thing in a&lt;br /&gt;
do-while(0) construct, such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define FOOMACRO(x, y) do {                     \&lt;br /&gt;
    foo = (x) + (y);                            \&lt;br /&gt;
    f(y);                                       \&lt;br /&gt;
} while (0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave off the semicolon at the end of a function-like macro, so that&lt;br /&gt;
it can be mostly used like a call to a function without a return&lt;br /&gt;
value.  Line up the backslashes to make it more readable.  Use M-x&lt;br /&gt;
c-backslash-region in emacs to do neat lined-up backslashes.&lt;br /&gt;
Parenthesize uses of arguments in the replacement text of a macro in&lt;br /&gt;
order to prevent weird interactions.&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
The C standard reserves a bunch of namespaces for the implementation.&lt;br /&gt;
Don't stomp on them.  For practical purposes, any identifier with a&lt;br /&gt;
leading underscore should not be used.  (Technically, ^_[a-z].* are&lt;br /&gt;
reserved only for file scope, so should be safe for things smaller&lt;br /&gt;
than file scope, but it's better to be paranoid in this case.)&lt;br /&gt;
&lt;br /&gt;
POSIX reserves typedef names ending with _t as well.&lt;br /&gt;
&lt;br /&gt;
Recall that errno is a reserved identifier, and is permitted to be a&lt;br /&gt;
macro.  Therefore, do not use errno as the name of a structure member,&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
Reserved namespaces are somewhat more restricted than this; read the&lt;br /&gt;
appropriate section of the C standard if you have questions.&lt;br /&gt;
&lt;br /&gt;
If you're writing new library code, pick a short prefix and stick with&lt;br /&gt;
it for any identifier with external linkage.  If for some reason a&lt;br /&gt;
library needs to have external symbols that should not be visible to&lt;br /&gt;
the application, pick another (related) prefix to use for the internal&lt;br /&gt;
globals.  This applies to typedef names, tag names, and preprocessor&lt;br /&gt;
identifiers as well.&lt;br /&gt;
&lt;br /&gt;
For the krb5 library, the prefix for public global symbols is &amp;quot;krb5_&amp;quot;.&lt;br /&gt;
Use &amp;quot;krb5int_&amp;quot; as a prefix for library internal globals.  Avoid using&lt;br /&gt;
&amp;quot;__&amp;quot; in symbol names, as it may confuse C++ implementations.  There&lt;br /&gt;
are admittedly a number of places where we leak thing into the&lt;br /&gt;
namespace; we should try to fix these.&lt;br /&gt;
&lt;br /&gt;
Header files should also not leak symbols.  Usually using the upcased&lt;br /&gt;
version of the prefix you've picked will suffice, e.g. &amp;quot;KRB5_&amp;quot; as a&lt;br /&gt;
CPP symbol prefix corresponding to &amp;quot;krb5_&amp;quot;.  In general, do not define&lt;br /&gt;
macros that are lowercase, in order to avoid confusion and to prevent&lt;br /&gt;
namespace collisions.&lt;br /&gt;
&lt;br /&gt;
The C standard only guarantees six case-insensitive characters to be&lt;br /&gt;
significant in external identifiers; this is largely regarded as&lt;br /&gt;
obsolescent even in 1989 and we will ignore it.  It does, however,&lt;br /&gt;
only guarantee 31 case-sensitive characters to be signficant in&lt;br /&gt;
internal identifiers, so do not use identifiers that differ beyond the&lt;br /&gt;
31st character.  This is unlikely to be a problem, though.&lt;br /&gt;
&lt;br /&gt;
== Misc. to be sorted ==&lt;br /&gt;
&lt;br /&gt;
Assume, for most purposes, working ANSI/ISO C ('89, not '99) support,&lt;br /&gt;
both for internal use and for applications compiling against Kerberos&lt;br /&gt;
header files and libraries.  Some exceptions are noted below.&lt;br /&gt;
&lt;br /&gt;
While it is syntactically correct to call through a function pointer&lt;br /&gt;
without applying a dereference operator to it, do not write code that&lt;br /&gt;
does this.  It is easier to see that the function call is actually&lt;br /&gt;
taking place through a function pointer if you write an explicit&lt;br /&gt;
dereference.  However, do not explicitly take the address of a&lt;br /&gt;
function in order to assign it to a function pointer, since a function&lt;br /&gt;
name degrades into a pointer.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int (*fp)(void);&lt;br /&gt;
int foofunc(void);&lt;br /&gt;
fp = foofunc;&lt;br /&gt;
x = (*fp)();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In general, do not take the address of an array.  It does not return a&lt;br /&gt;
pointer to the first element; it returns a pointer to the array&lt;br /&gt;
itself.  These are often identical when cast to an integral type, but&lt;br /&gt;
they are inherently of different types themselves.  Functions that&lt;br /&gt;
take array types or pointers to array types as arguments can be&lt;br /&gt;
particularly trouble-prone.&lt;br /&gt;
&lt;br /&gt;
If a function is declared to return a value, do not call &amp;quot;return&amp;quot;&lt;br /&gt;
without an argument or allow the flow of control to fall off the end&lt;br /&gt;
of the function.&lt;br /&gt;
&lt;br /&gt;
Always declare the return type of a function, even if it returns int.&lt;br /&gt;
Yes, this means declaring main() to return int, since main() is&lt;br /&gt;
required to return int by the standard.  If a function is not supposed&lt;br /&gt;
to return a value, declare it as returning void rather than omitting&lt;br /&gt;
the return type, which will default the return type to int.&lt;br /&gt;
&lt;br /&gt;
Try to use ANSI C prototype-style function definitions in preference&lt;br /&gt;
to K&amp;amp;R style definitions.  When using K&amp;amp;R style function definitions,&lt;br /&gt;
declare all the argument types, even those that are int, but beware of&lt;br /&gt;
any narrow types in the argument list.&lt;br /&gt;
&lt;br /&gt;
Don't pass or return structures in API functions except by address.&lt;br /&gt;
&lt;br /&gt;
For new functions, input parameters should go before output parameters&lt;br /&gt;
in the call signature.  There are exceptions, such as a context-like&lt;br /&gt;
parameter.&lt;br /&gt;
&lt;br /&gt;
Every function should have block comment preceding it describing&lt;br /&gt;
briefly in complete sentences what it does, what inputs and outputs it&lt;br /&gt;
has, and what error codes it can return.  It should also describe any&lt;br /&gt;
unusual aspects of the function.  At some point we will want to put&lt;br /&gt;
some of this information into a machine-parsable form.&lt;br /&gt;
&lt;br /&gt;
Strive to make your code capable of compiling using &amp;quot;gcc -Wall&lt;br /&gt;
-Wmissing-prototypes -Wtraditional -Wcast-qual -Wcast-align&lt;br /&gt;
-pedantic&amp;quot; [XXX need to rethink this&lt;br /&gt;
somewhat] without generating any errors or warnings.  Do not, however,&lt;br /&gt;
compile using the &amp;quot;-ansi&amp;quot; flag to gcc, since that can result in odd&lt;br /&gt;
behavior with header files on some systems, causing some necessary&lt;br /&gt;
symbols to not be defined.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1183</id>
		<title>Coding style/Practices</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1183"/>
				<updated>2009-01-26T19:21:16Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* The many names of zero */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== String Handling ==&lt;br /&gt;
&lt;br /&gt;
Code should not use any of the following functions: strcpy, strcat, sprintf, or any *scanf function.&lt;br /&gt;
&lt;br /&gt;
Dynamically allocated buffers are preferred to fixed-sized buffers.  When using dynamic buffers:&lt;br /&gt;
* Use strdup or asprintf for simple constructions.&lt;br /&gt;
* Use the k5buf module (k5-buf.h) for complex constructions.  If this is not desirable, strlcpy and strlcat are valid alternatives.&lt;br /&gt;
&lt;br /&gt;
Substitute versions of strlcpy, strlcat, and asprintf, for operating systems that don't supply them, are declared in k5-platform.h and defined in the support library (which practically everything in the tree links directly against).&lt;br /&gt;
&lt;br /&gt;
When using fixed-sized buffers:&lt;br /&gt;
* Use strlcpy for simple copies.&lt;br /&gt;
* Use snprintf for simple compound constructions.  Avoid using precision or field width specifiers in snprintf format strings.&lt;br /&gt;
* To check for truncation when using snprintf, use the following approach:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
result = snprintf(buffer, sizeof(buffer), &amp;quot;format string&amp;quot;, ...);&lt;br /&gt;
if (SNPRINTF_OVERFLOW(result, sizeof(buffer))&lt;br /&gt;
    handle_overflow_error;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SNPRINTF_OVERFLOW macro is defined in k5-platform.h.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly conforms, with some exceptions.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
It is relatively common to audit a code base such as krb5 and flag all uses of strcpy and similar functions, even if they are used safely.  Verifying that the function is used safely requires manual inspection.  Using safer alternatives does not guarantee code safety, but does reduce the likelihood of a catastrophic buffer overflow vulnerability.&lt;br /&gt;
&lt;br /&gt;
In some compilation environments under Solaris, field widths and precisions are computed using screen columns rather than bytes.&lt;br /&gt;
&lt;br /&gt;
sprintf returns a signed integer; buffer sizes are typically size_t (which is an unsigned type).  Comparing the two directly will result in a warning from some compilers, and has unpredictable semantics depending on the relative widths of int and size_t.  Also, some sprintf implementations, such as the one in Solaris prior to version 10, return -1 on a buffer overflow, whereas the C99 behavior returns the number of bytes which would have been written to the string.  The SNPRINTF_OVERFLOW macro uses casts to address both issues.&lt;br /&gt;
&lt;br /&gt;
The k5buf module safely allows multi-step string construction within fixed-size or dynamic buffers without performing an error check on each append, and without pre-computing lengths.  Errors need only be checked when the resulting string needs to be read or handed off to another function.&lt;br /&gt;
&lt;br /&gt;
== Exception Handling ==&lt;br /&gt;
&lt;br /&gt;
If a function allocates several resources and has many exit paths, use the following general structure when possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  krb5_error_code retval;&lt;br /&gt;
  char *ptr1 = NULL;&lt;br /&gt;
  krb5_blah *ptr2 = NULL;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  retval = another_function(...);&lt;br /&gt;
  if (retval != 0)&lt;br /&gt;
    goto cleanup;&lt;br /&gt;
...&lt;br /&gt;
cleanup:&lt;br /&gt;
  if (ptr1)&lt;br /&gt;
    free(ptr1);&lt;br /&gt;
  if (ptr2)&lt;br /&gt;
    kbr5_free_blah(ptr2);&lt;br /&gt;
  return retval;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simpler functions may use simpler structures, but do not get to the point of freeing the same resource in several different places within a function depending on the exit path.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly conforms, with some exceptions.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This is the most reliable way to avoid resource leaks within the constraints of the krb5 code base.  Within libraries, the code base does not abort on memory allocation failure, so tends to have many exit paths within some functions.&lt;br /&gt;
&lt;br /&gt;
== Output parameter handling ==&lt;br /&gt;
&lt;br /&gt;
If a function has output parameters, it should initialize them in all cases, even if it returns failure.  Most of the time, this means setting pointer output parameters to NULL and numeric output parameters to zero at the beginning of the function.  The real output values should not be assigned to the output parameters until successful completion from the function is guaranteed.  A typical function with output parameters should look something like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
krb5_error_code&lt;br /&gt;
function_with_output_param(type *input_param, type *out_ptr, int *out_len)&lt;br /&gt;
{&lt;br /&gt;
  declarations here;&lt;br /&gt;
&lt;br /&gt;
  *out_ptr = NULL;&lt;br /&gt;
  *out_len = 0;&lt;br /&gt;
&lt;br /&gt;
  stuff that can go wrong here;&lt;br /&gt;
&lt;br /&gt;
  *out_ptr = ptr;&lt;br /&gt;
  *out_len = len;&lt;br /&gt;
  return 0;&lt;br /&gt;
&lt;br /&gt;
error:&lt;br /&gt;
  cleanup code here;&lt;br /&gt;
  return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simple wrappers do not need to worry about this rule unless they are invoking functions through pointers.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly does not conform.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This practice makes it clear to static analysis tools that the previous value of the output parameter will not be used, and also helps convey under what circumstances an output parameter is initialized.  If there happens to be a bug in the function such that it returns success but does not set output parameters, or in the caller such that it uses an output parameter even though the function returned failure, then the bug will result in predictable behavior (generally a NULL pointer dereference) with no security consequences beyond a denial of service attack.&lt;br /&gt;
&lt;br /&gt;
== Assignments as truth values ==&lt;br /&gt;
&lt;br /&gt;
Do not use assignments as truth values.  Rather than this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if ((retval = krb5_foo()))&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
retval = krb5_foo();&lt;br /&gt;
if (retval)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code varies widely.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This makes the code easier to read, and also makes it easier to use&lt;br /&gt;
debuggers.  It may be excusable to put assignments into the&lt;br /&gt;
conditional espression of a &amp;quot;while&amp;quot; statement, though, like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ((ch = getopt(argc, argv, &amp;quot;abn&amp;quot;)) != -1)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using assignments as truth values in conditional expressions (&amp;quot;ternary expressions&amp;quot;) may make&lt;br /&gt;
code particularly impenetrable.&lt;br /&gt;
&lt;br /&gt;
== The many names of zero ==&lt;br /&gt;
&lt;br /&gt;
There are at least three types of &amp;quot;zero&amp;quot; known to C.  These are the&lt;br /&gt;
integer zero (0), the null pointer constant (NULL), and the character&lt;br /&gt;
constant zero ('\0').  Yes, these are usually all technically the&lt;br /&gt;
integer zero.  Use them in their correct contexts.  (Purists will&lt;br /&gt;
point out that 0 is a valid null pointer constant; still, do not use 0&lt;br /&gt;
to specify a null pointer constant.  For further unconfusion, read the&lt;br /&gt;
section on null pointer constants in the C FAQ.)  Do not use a lone&lt;br /&gt;
variable as a truth value unless it's of integer type.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i;&lt;br /&gt;
char *cp;&lt;br /&gt;
/* ... */&lt;br /&gt;
if (i)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
if (cp != NULL) {&lt;br /&gt;
    while (*cp != '\0')&lt;br /&gt;
        /* ... */;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not cast uses of NULL unless you're calling a function with a&lt;br /&gt;
variable number of arguments, in which case you should cast it to to&lt;br /&gt;
the appropriate pointer type.  (NULL may be defined as 0, and an integer 0&lt;br /&gt;
may not be the same size in the argument list as a pointer on a 64-bit&lt;br /&gt;
platform.)  Likewise, do not cast the return value&lt;br /&gt;
from malloc() and friends; the prototype should declare them properly&lt;br /&gt;
as returning a void * and thus shouldn't require an explicit cast.&lt;br /&gt;
&lt;br /&gt;
In any case, reading the section in the C FAQ on null pointers is&lt;br /&gt;
highly recommended to remove confusion regarding null pointers in C,&lt;br /&gt;
since this is a subject of much confusion to even experienced&lt;br /&gt;
programmers.  In particular, if you do not understand why using&lt;br /&gt;
calloc() to allocate a struct that contains pointer members or why&lt;br /&gt;
calling memset() to initialize such a struct to all-bytes-zero is&lt;br /&gt;
wrong, reread that section again.  (Note that there are *lots* of&lt;br /&gt;
examples of code in the krb5 source tree that erroneously calls&lt;br /&gt;
memset() to zero a struct, and we should fix these somehow&lt;br /&gt;
eventually.)&lt;br /&gt;
&lt;br /&gt;
== Brace placement ==&lt;br /&gt;
&lt;br /&gt;
Control flow statements that have a single statement as their body&lt;br /&gt;
should nevertheless have braces around their bodies if the body is&lt;br /&gt;
more than one line long, especially in the case of stacked multiple&lt;br /&gt;
if-else clauses; use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (x) {&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if (x)&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which, while legible to the compiler, may confuse human readers and&lt;br /&gt;
make the code less maintainable, especially if new branches get added&lt;br /&gt;
to any of the clauses.&lt;br /&gt;
&lt;br /&gt;
If you are writing a do-while loop that has only one statement in its&lt;br /&gt;
body, put braces around it anyway, since the while clause may be&lt;br /&gt;
mistaken for a while loop with an empty body.  Don't do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
do&lt;br /&gt;
    foo();&lt;br /&gt;
while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead, write this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
do {&lt;br /&gt;
    foo();&lt;br /&gt;
} while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preprocessor conditionals ==&lt;br /&gt;
&lt;br /&gt;
Instead of scattering &amp;lt;code&amp;gt;#ifdef&amp;lt;/code&amp;gt; or other preprocessor conditionals throughout the code use preprocessor conditionals to control the definition of a function-like macro, or similar construct, which is used instead of embedded preprocessor conditionals in code.&lt;br /&gt;
&lt;br /&gt;
Instead of this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    do_something();&lt;br /&gt;
    /* bad style */&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
    fprintf(stderr, &amp;quot;did something\n&amp;quot;);&lt;br /&gt;
#endif&lt;br /&gt;
    do_something_else();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do something more like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef DEBUG&lt;br /&gt;
#define DPRINTF(x) fprintf(stderr, x)&lt;br /&gt;
#else&lt;br /&gt;
#define DPRINTF(x)		/* empty */&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
/* ... */&lt;br /&gt;
&lt;br /&gt;
    do_something();&lt;br /&gt;
    /* better style */&lt;br /&gt;
    DPRINTF((&amp;quot;did something\n&amp;quot;));&lt;br /&gt;
    do_something_else();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not intersperse conditional compilation&lt;br /&gt;
directives with control flow statements, as some combination of&lt;br /&gt;
&amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;d symbols may result in statements getting eaten by dangling&lt;br /&gt;
bits of control flow statements.  When it is not possible to avoid&lt;br /&gt;
this questionable practice (you really should rewrite the relevant&lt;br /&gt;
code section), make use of redundant braces to ensure that a compiler&lt;br /&gt;
error will result in preference to incorrect runtime behavior (such as&lt;br /&gt;
inadvertently providing someone with a root shell).&lt;br /&gt;
&lt;br /&gt;
Do not intersperse conditional compilation directives with control&lt;br /&gt;
flow statements in such a way that confuses emacs cc-mode.  Not only&lt;br /&gt;
does emacs get confused, but the code becomes more difficult to read&lt;br /&gt;
and maintain.  Therefore, avoid code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /* bad style */&lt;br /&gt;
    if (x) {&lt;br /&gt;
        f();&lt;br /&gt;
    }&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
    else if (y) {&lt;br /&gt;
#else&lt;br /&gt;
    else {&lt;br /&gt;
#endif&lt;br /&gt;
        g();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put comments after conditional compilation directives such as &amp;quot;#else&amp;quot;&lt;br /&gt;
and &amp;quot;#endif&amp;quot;.  Make them correspond to the sense of the value that&lt;br /&gt;
controls the compilation of the section they are closing, i.e.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !FOO */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !FOO */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, in the case of more complex conditional compilation directives,&lt;br /&gt;
write the comments like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if defined(FOO) || defined(BAR)&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly does not conform.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
Instances of &amp;quot;ifdef soup&amp;quot; make code more difficult to read, and make it more difficult to recognize bugs.&lt;br /&gt;
&lt;br /&gt;
== Local variables ==&lt;br /&gt;
&lt;br /&gt;
Do not declare variables in an inner scope, e.g. inside the compound&lt;br /&gt;
substatement of an if statement, unless the complexity of the code&lt;br /&gt;
really demands that the variables be declared that way.  In such&lt;br /&gt;
situations, the function could probably stand to be broken up into&lt;br /&gt;
smaller chunks anyway.  Do not declare variables in an inner scope&lt;br /&gt;
that shadow ones in an outer scope, since this leads to confusion.&lt;br /&gt;
Also, some debugging environments, such as gdb under Solaris, can't&lt;br /&gt;
see variables declared in an inner scope, so declaring such variables&lt;br /&gt;
will make maintenance more difficult as well.&lt;br /&gt;
&lt;br /&gt;
== Placement of parentheses ==&lt;br /&gt;
&lt;br /&gt;
Parenthesize expressions that may be confusing, particularly where C's&lt;br /&gt;
precedences are broken.  For example, the shift operators have lower&lt;br /&gt;
precedence than the +, -, *, /, and % operators.  Perhaps the most&lt;br /&gt;
familiar C precedence quirk is that equality and relational operators&lt;br /&gt;
are of higher precedence than assignment operators.  Less well known&lt;br /&gt;
is that the bitwise operators are of a lower precedence than equality&lt;br /&gt;
and relational operators.&lt;br /&gt;
&lt;br /&gt;
The sizeof operator takes either a unary expression or a parenthesized&lt;br /&gt;
type name.  It is not necessary to parenthesize the operand of sizeof&lt;br /&gt;
if it is applied to a unary expression, but still, always parenthesize&lt;br /&gt;
the operand of the sizeof operator.  The sizeof operator does not&lt;br /&gt;
evaluate its operand if it is a unary expression, so usages such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = sizeof(++foo);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should be avoided for the sake of sanity and readability.&lt;br /&gt;
&lt;br /&gt;
== Function-like macros ==&lt;br /&gt;
&lt;br /&gt;
Macros should have all-uppercase names.  If it is necessary to use&lt;br /&gt;
multiple statements, use braces, and wrap the whole thing in a&lt;br /&gt;
do-while(0) construct, such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define FOOMACRO(x, y) do {                     \&lt;br /&gt;
    foo = (x) + (y);                            \&lt;br /&gt;
    f(y);                                       \&lt;br /&gt;
} while (0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave off the semicolon at the end of a function-like macro, so that&lt;br /&gt;
it can be mostly used like a call to a function without a return&lt;br /&gt;
value.  Line up the backslashes to make it more readable.  Use M-x&lt;br /&gt;
c-backslash-region in emacs to do neat lined-up backslashes.&lt;br /&gt;
Parenthesize uses of arguments in the replacement text of a macro in&lt;br /&gt;
order to prevent weird interactions.&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
The C standard reserves a bunch of namespaces for the implementation.&lt;br /&gt;
Don't stomp on them.  For practical purposes, any identifier with a&lt;br /&gt;
leading underscore should not be used.  (Technically, ^_[a-z].* are&lt;br /&gt;
reserved only for file scope, so should be safe for things smaller&lt;br /&gt;
than file scope, but it's better to be paranoid in this case.)&lt;br /&gt;
&lt;br /&gt;
POSIX reserves typedef names ending with _t as well.&lt;br /&gt;
&lt;br /&gt;
Recall that errno is a reserved identifier, and is permitted to be a&lt;br /&gt;
macro.  Therefore, do not use errno as the name of a structure member,&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
Reserved namespaces are somewhat more restricted than this; read the&lt;br /&gt;
appropriate section of the C standard if you have questions.&lt;br /&gt;
&lt;br /&gt;
If you're writing new library code, pick a short prefix and stick with&lt;br /&gt;
it for any identifier with external linkage.  If for some reason a&lt;br /&gt;
library needs to have external symbols that should not be visible to&lt;br /&gt;
the application, pick another (related) prefix to use for the internal&lt;br /&gt;
globals.  This applies to typedef names, tag names, and preprocessor&lt;br /&gt;
identifiers as well.&lt;br /&gt;
&lt;br /&gt;
For the krb5 library, the prefix for public global symbols is &amp;quot;krb5_&amp;quot;.&lt;br /&gt;
Use &amp;quot;krb5int_&amp;quot; as a prefix for library internal globals.  Avoid using&lt;br /&gt;
&amp;quot;__&amp;quot; in symbol names, as it may confuse C++ implementations.  There&lt;br /&gt;
are admittedly a number of places where we leak thing into the&lt;br /&gt;
namespace; we should try to fix these.&lt;br /&gt;
&lt;br /&gt;
Header files should also not leak symbols.  Usually using the upcased&lt;br /&gt;
version of the prefix you've picked will suffice, e.g. &amp;quot;KRB5_&amp;quot; as a&lt;br /&gt;
CPP symbol prefix corresponding to &amp;quot;krb5_&amp;quot;.  In general, do not define&lt;br /&gt;
macros that are lowercase, in order to avoid confusion and to prevent&lt;br /&gt;
namespace collisions.&lt;br /&gt;
&lt;br /&gt;
The C standard only guarantees six case-insensitive characters to be&lt;br /&gt;
significant in external identifiers; this is largely regarded as&lt;br /&gt;
obsolescent even in 1989 and we will ignore it.  It does, however,&lt;br /&gt;
only guarantee 31 case-sensitive characters to be signficant in&lt;br /&gt;
internal identifiers, so do not use identifiers that differ beyond the&lt;br /&gt;
31st character.  This is unlikely to be a problem, though.&lt;br /&gt;
&lt;br /&gt;
== Misc. to be sorted ==&lt;br /&gt;
&lt;br /&gt;
Assume, for most purposes, working ANSI/ISO C ('89, not '99) support,&lt;br /&gt;
both for internal use and for applications compiling against Kerberos&lt;br /&gt;
header files and libraries.  Some exceptions are noted below.&lt;br /&gt;
&lt;br /&gt;
While it is syntactically correct to call through a function pointer&lt;br /&gt;
without applying a dereference operator to it, do not write code that&lt;br /&gt;
does this.  It is easier to see that the function call is actually&lt;br /&gt;
taking place through a function pointer if you write an explicit&lt;br /&gt;
dereference.  However, do not explicitly take the address of a&lt;br /&gt;
function in order to assign it to a function pointer, since a function&lt;br /&gt;
name degrades into a pointer.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int (*fp)(void);&lt;br /&gt;
int foofunc(void);&lt;br /&gt;
fp = foofunc;&lt;br /&gt;
x = (*fp)();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In general, do not take the address of an array.  It does not return a&lt;br /&gt;
pointer to the first element; it returns a pointer to the array&lt;br /&gt;
itself.  These are often identical when cast to an integral type, but&lt;br /&gt;
they are inherently of different types themselves.  Functions that&lt;br /&gt;
take array types or pointers to array types as arguments can be&lt;br /&gt;
particularly trouble-prone.&lt;br /&gt;
&lt;br /&gt;
If a function is declared to return a value, do not call &amp;quot;return&amp;quot;&lt;br /&gt;
without an argument or allow the flow of control to fall off the end&lt;br /&gt;
of the function.&lt;br /&gt;
&lt;br /&gt;
Always declare the return type of a function, even if it returns int.&lt;br /&gt;
Yes, this means declaring main() to return int, since main() is&lt;br /&gt;
required to return int by the standard.  If a function is not supposed&lt;br /&gt;
to return a value, declare it as returning void rather than omitting&lt;br /&gt;
the return type, which will default the return type to int.&lt;br /&gt;
&lt;br /&gt;
Try to use ANSI C prototype-style function definitions in preference&lt;br /&gt;
to K&amp;amp;R style definitions.  When using K&amp;amp;R style function definitions,&lt;br /&gt;
declare all the argument types, even those that are int, but beware of&lt;br /&gt;
any narrow types in the argument list.&lt;br /&gt;
&lt;br /&gt;
Don't pass around structures except by address.  We may relax this&lt;br /&gt;
restriction for non-API functions, though.&lt;br /&gt;
&lt;br /&gt;
For new functions, input parameters should go before output parameters&lt;br /&gt;
in the call signature.  There are exceptions, such as a context-like&lt;br /&gt;
parameter.&lt;br /&gt;
&lt;br /&gt;
Every function should have block comment preceding it describing&lt;br /&gt;
briefly in complete sentences what it does, what inputs and outputs it&lt;br /&gt;
has, and what error codes it can return.  It should also describe any&lt;br /&gt;
unusual aspects of the function.  At some point we will want to put&lt;br /&gt;
some of this information into a machine-parsable form.&lt;br /&gt;
&lt;br /&gt;
Strive to make your code capable of compiling using &amp;quot;gcc -Wall&lt;br /&gt;
-Wmissing-prototypes -Wtraditional -Wcast-qual -Wcast-align&lt;br /&gt;
-Wconversion -Waggregate-return -pedantic&amp;quot; [XXX need to rethink this&lt;br /&gt;
somewhat] without generating any errors or warnings.  Do not, however,&lt;br /&gt;
compile using the &amp;quot;-ansi&amp;quot; flag to gcc, since that can result in odd&lt;br /&gt;
behavior with header files on some systems, causing some necessary&lt;br /&gt;
symbols to not be defined.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=1181</id>
		<title>Projects/Master Key Migration</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/Master_Key_Migration&amp;diff=1181"/>
				<updated>2009-01-23T23:13:50Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design of implementation */ speling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-approved}}&lt;br /&gt;
&lt;br /&gt;
==Desired changes==&lt;br /&gt;
&lt;br /&gt;
This project will provide the ability to add a new master key (with an&lt;br /&gt;
enctype differing from the current master key) to the master key&lt;br /&gt;
principal and stash file and then migrate the encryption of existing&lt;br /&gt;
principals long term keys to use the new master key.  In addition&lt;br /&gt;
deletion of master keys will be provided.&lt;br /&gt;
&lt;br /&gt;
==Functional Requirements==&lt;br /&gt;
&lt;br /&gt;
The KDC must be able to deal with multiple master keys and determine&lt;br /&gt;
which key to use when decrypting a principal's long term secret key.&lt;br /&gt;
The KDC must be able to access any of the master key (K/M) principal's&lt;br /&gt;
keys as long as it has access to a master key that is in use.&lt;br /&gt;
&lt;br /&gt;
The administrator must be able re-encrypt principal keys using a&lt;br /&gt;
specified mkey and be able to specifying the set of principals is to be&lt;br /&gt;
re-encrypted.  The command doing this must be able to determine if a&lt;br /&gt;
principal's keys are protected by the current master key or not.  This&lt;br /&gt;
implies that some set of principals may be protected with a non-current&lt;br /&gt;
master key.&lt;br /&gt;
&lt;br /&gt;
Slave KDC's must be able to access all master keys currently protecting&lt;br /&gt;
principal entries and therefore have access to the principal's secret&lt;br /&gt;
keys regardless of which master key is used to encrypt the key.&lt;br /&gt;
&lt;br /&gt;
The administrator will be able to:&lt;br /&gt;
&lt;br /&gt;
* Add a new master key to master key principal and optionally to the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Enable a new master key (make it the current master key used to protect newly created principals or principal rekeys).&lt;br /&gt;
&lt;br /&gt;
* List all master keys associated with the master key principal.&lt;br /&gt;
&lt;br /&gt;
* Delete a particular master key from the master key principal and optionally from the masterkey keytab stash.&lt;br /&gt;
&lt;br /&gt;
* Purge unused master keys (keys not used to protect any principal).&lt;br /&gt;
&lt;br /&gt;
==Design of implementation==&lt;br /&gt;
&lt;br /&gt;
Fundamentally the current implementation must be changed to support&lt;br /&gt;
multiple master keys.  And possession of any master key stored with the&lt;br /&gt;
K/M principal allows access to all master keys.  In addition, a&lt;br /&gt;
principal's secret key may be encrypted by any of the master keys in use&lt;br /&gt;
and the KDC must be able to decrypt that principal's key.&lt;br /&gt;
&lt;br /&gt;
In order to accommodate this, these changes will be made:&lt;br /&gt;
&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKVNO, would apply to all principals except the K/M and would store the version number of the master key used to encrypt the keys of that principal.  The db2 back end would store it as opaque TL-data, the LDAP back end has a slot for it.&lt;br /&gt;
* A new TL-data type, KRB5_TL_ACTKVNO, would apply to all principals and will be a set of {actkvno, start_time} tuples where actkvno is the &amp;quot;active&amp;quot; KVNO and start_time indicates when actkvno is valid for use.&lt;br /&gt;
** When set for the K/M principal this indicates the master key to be used when encrypting principal's long term keys.  If this TL-data type is not found in the K/M record then the default value for this will be 1 which is the default MKVNO.&lt;br /&gt;
** When set for service principals this indicates the key to be used when the KDC issues service tickets.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* The krb5_key_data array in the krb5_db_entry for the K/M principal will hold all master keys in use.  All the keys in this array will be encrypted using the most recently created master key.&lt;br /&gt;
* A new TL-data type, KRB5_TL_MKEY_AUX, would apply only to the K/M principal.  This new TL data would contain:&lt;br /&gt;
** A set of copies of the latest master key, each encrypted by one of the other supported mkeys, in {old-mkvno, keydata} tuples.  Thus the &amp;quot;master key&amp;quot; used in DAL (DB abstraction layer) need only be any one of these keys.&lt;br /&gt;
** Trailing stuff is ignored for now, making the structure extensible.&lt;br /&gt;
* kdc_realm_t will be modified to hold all master keys (including KVNO and enctype) associated with a realm.  It will also hold the current mkey KVNO that should be used when encrypting a principal's keys.  To facilitate this, a new struct will be defined:&lt;br /&gt;
&lt;br /&gt;
  typedef struct _krb5_keylist_node {&lt;br /&gt;
        krb5_keyblock *keyblock;&lt;br /&gt;
        krb5_kvno      kvno;&lt;br /&gt;
        struct _krb5_keylist_node *next;&lt;br /&gt;
  } krb5_keyblock_node;&lt;br /&gt;
&lt;br /&gt;
This will be used to create a list of mkeys.  kdc_realm_t will also have&lt;br /&gt;
a current_realm_mkey which will point to the krb5_keyblock_node that&lt;br /&gt;
contains the current mkey (used when encrypting a principal's keys, does&lt;br /&gt;
not apply the K/M mkeys).&lt;br /&gt;
&lt;br /&gt;
The initialization of the list of mkeys will occur in init_realm().&lt;br /&gt;
&lt;br /&gt;
Any code needing to decrypt principal keys will need to determine which&lt;br /&gt;
mkey to use.  A function will be created to return the mkey to use for&lt;br /&gt;
decrypting a principal's keys given the principal's krb5_db_entry and&lt;br /&gt;
realm_mkeys list as input args.  If the principals krb5_db_entry does&lt;br /&gt;
not contain KRB5_TL_MKVNO TL-data the function will default to choosing&lt;br /&gt;
the mkey with KVNO 1.  If the princ krb5_db_entry does have&lt;br /&gt;
KRB5_TL_MKVNO data and no matching mkey is found the function will get&lt;br /&gt;
the K/M princ KDB entry, update the list of mkeys if new mkeys are found&lt;br /&gt;
and return a matching mkey if found.  An error will be returned if a&lt;br /&gt;
matching mkey is not found.&lt;br /&gt;
&lt;br /&gt;
This function would be called prior to calling&lt;br /&gt;
krb5_dbekd_decrypt_key_data() to determine which mkey to pass in.&lt;br /&gt;
&lt;br /&gt;
Similarly, any code calling krb5_dbekd_encrypt_key_data() will be&lt;br /&gt;
modified to pass in the current_realm_mkey (mentioned above).&lt;br /&gt;
&lt;br /&gt;
kdb5_util will be modified to support these new commands:&lt;br /&gt;
&lt;br /&gt;
; add_mkey [-s] : Add a new master key to K/M.  The optional -s will add the mkey to the stash file.&lt;br /&gt;
&lt;br /&gt;
; use_mkey &amp;lt;KVNO&amp;gt; [startdate] : Set the current mkey KVNO.  This controls which master key is used when encrypting principal keys.  The kadmind and krb5kdc should be restarted after this command successfully completes.&lt;br /&gt;
&lt;br /&gt;
; list_mkeys : Shows all master keys from most recent to earliest in K/M principal.  The output will show the KVNO, enctype and salt for each mkey similar to kadmin getprinc output.  A * following an mkey denotes the current mkey.&lt;br /&gt;
&lt;br /&gt;
; purge_mkeys [-f] : Delete mkeys from K/M princ that are not used to protect any principals.  With -f, does not prompt user.  The prompt will be &amp;quot;Delete version 3 master key for the FOO.COM realm? [y/n] &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
; sync_stash [-f] : Sync up the set of keys in the keytab stash with those in the K/M princ entry in the KDB.  Keys in keytab stash not found in K/M will be removed.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
; update_princ_encryption [-f] [expression] : Use current mkey to encrypt principals (other than K/M) secret keys if not already encrypted by that mkey.  Should support either doing all princs if no argument given or a subset specified by expression (supports shell-style globbing, similar to kadmin).  Both the principal's secret keys and key history will first be decrypted with the original encrypting mkey then encrypted with the current mkey.  If the current mkey kvno is that of the mkey that originally encrypted the principal's keys the code will stop processing that principal and go on to the next.  With -f, does not prompt user.&lt;br /&gt;
&lt;br /&gt;
The kdb5_util dump -mkey_convert will be modified to update the&lt;br /&gt;
KRB5_TL_MKVNO of all principals except the K/M principal with the KVNO&lt;br /&gt;
of the mkey used for the conversion.  The K/M KRB5_TL_MKEY_AUX TL data&lt;br /&gt;
will be updated to include the new mkey used for the conversion.&lt;br /&gt;
&lt;br /&gt;
==Tasks/milestones==&lt;br /&gt;
&lt;br /&gt;
* project start.  Aug 29, 2008&lt;br /&gt;
* project review.  ~2 week&lt;br /&gt;
* Implementation.  ~6 weeks&lt;br /&gt;
* test.  ~4 week&lt;br /&gt;
* code review.  ~2 week&lt;br /&gt;
* documentation.  ~3 day&lt;br /&gt;
&lt;br /&gt;
==Desired integration and release goals==&lt;br /&gt;
&lt;br /&gt;
==Testing plan==&lt;br /&gt;
&lt;br /&gt;
Unit testing of all new and modified commands will be done to verify&lt;br /&gt;
they work as specified.  This will be done for both the db2 and LDAP KDB&lt;br /&gt;
plugins.  Unit tests will include testing that the various of setting a&lt;br /&gt;
new key (kpasswd, kadmin commands like cpw or ktadd, as well as the&lt;br /&gt;
new/modified commands) when applied to the master key principal will&lt;br /&gt;
either be rejected without changing the database or retain all the old&lt;br /&gt;
keys, even if that list is larger than the normal key history size in&lt;br /&gt;
order to make sure the normal key history mechanisms won't accidentally&lt;br /&gt;
throw away any still-used master keys.&lt;br /&gt;
&lt;br /&gt;
The kadmind and krb5kdc daemons will be tested to verify they work&lt;br /&gt;
properly when accessing a KDB some set of principals is protected by one&lt;br /&gt;
mkey and the other set is protected by another set.   Slave KDCs will&lt;br /&gt;
also be tested after the KDB is propagated both with kprop and kiprop.&lt;br /&gt;
&lt;br /&gt;
Bounds testing will verify the krb utils and daemons work properly when&lt;br /&gt;
the MKVNO wraps back to 1 (0 is not a valid value).&lt;br /&gt;
&lt;br /&gt;
The existing MIT Kerberos test suites will be run to make sure there are&lt;br /&gt;
no regressions introduced by this project.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
#[[User:TomYu|TomYu]]&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
== Current status ==&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Coding_style&amp;diff=1160</id>
		<title>Coding style</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Coding_style&amp;diff=1160"/>
				<updated>2009-01-08T16:49:46Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Emacs cc-mode style */ rephrase last change - update isn't automatic, you get prompted&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
The C language '''Coding style''' described here is based on the BSD coding style, with some additional elements from the GNU coding standards and the SunOS coding standards.&lt;br /&gt;
&lt;br /&gt;
* [[Coding style/Formatting|Formatting]]&lt;br /&gt;
* [[Coding style/Practices|Practices]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style?rev=HEAD NetBSD &amp;lt;code&amp;gt;/usr/share/misc/style&amp;lt;/code&amp;gt;] [http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style (log)]&lt;br /&gt;
* [http://www.gnu.org/prep/standards/ GNU coding standards]&lt;br /&gt;
* [http://opensolaris.org/os/community/documentation/getting_started_docs/cstyle.ms.pdf C Style and Coding Standards for SunOS]&lt;br /&gt;
&lt;br /&gt;
== Old version ==&lt;br /&gt;
&lt;br /&gt;
Old content to be moved elsewhere is below.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WRITING C CODE ==&lt;br /&gt;
&lt;br /&gt;
The code in the krb5 source tree largely follows BSD KNF&lt;br /&gt;
(/usr/share/misc/style on NetBSD) except that it uses a four column&lt;br /&gt;
basic offset.  The style described here is a synthesis of BSD KNF and&lt;br /&gt;
the GNU coding standards for the C language.  The formatting described&lt;br /&gt;
in the &amp;quot;Formatting Your Source Code&amp;quot; section of the GNU coding&lt;br /&gt;
standards is mostly what we want, except we use BSD brace style and&lt;br /&gt;
BSD-ish conventions for the spacing around operators.&lt;br /&gt;
&lt;br /&gt;
=== Coding practices for C ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in GNU coding std but not here ===&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force extra indent of operators of different precedences&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force general extra indent of expressions that are broken between lines&lt;br /&gt;
&lt;br /&gt;
* use of ^L characters to break up source files into pages&lt;br /&gt;
&lt;br /&gt;
* nitpicking about capitalization in comments of variable names when their values are meant&lt;br /&gt;
&lt;br /&gt;
* commenting usages of static variables&lt;br /&gt;
&lt;br /&gt;
* casts to void&lt;br /&gt;
&lt;br /&gt;
* separation of word in names with underscores vs case change&lt;br /&gt;
&lt;br /&gt;
* enum vs #define'd integer constants &lt;br /&gt;
&lt;br /&gt;
* 14 char filename limits, MS-DOS filename limits&lt;br /&gt;
&lt;br /&gt;
* portability&lt;br /&gt;
&lt;br /&gt;
* system library function quirks&lt;br /&gt;
&lt;br /&gt;
* internationalization&lt;br /&gt;
&lt;br /&gt;
* mmap()&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in BSD KNF but not here ===&lt;br /&gt;
&lt;br /&gt;
* sorting of header files&lt;br /&gt;
&lt;br /&gt;
* sorting of struct members&lt;br /&gt;
&lt;br /&gt;
* separating struct tag decl and struct typedef&lt;br /&gt;
&lt;br /&gt;
* sorting of var decl&lt;br /&gt;
&lt;br /&gt;
* lining up var names in decls&lt;br /&gt;
&lt;br /&gt;
* newline after decls&lt;br /&gt;
&lt;br /&gt;
* usage of __P&lt;br /&gt;
&lt;br /&gt;
* usage of getopt&lt;br /&gt;
&lt;br /&gt;
* not initializing vars in decls&lt;br /&gt;
&lt;br /&gt;
* stdarg/varargs handling&lt;br /&gt;
&lt;br /&gt;
=== Emacs cc-mode style ===&lt;br /&gt;
&lt;br /&gt;
Putting the following code in your .emacs file will result in mostly&lt;br /&gt;
the right thing happening with respect to formatting style.  Note that&lt;br /&gt;
you may want to turn on auto-newline feature of cc-mode, though that&lt;br /&gt;
seems to have some bugs with brace-elseif-brace handling at least in&lt;br /&gt;
the version of cc-mode that comes with emacs 20.3.&lt;br /&gt;
&lt;br /&gt;
        (defconst krb5-c-style&lt;br /&gt;
          '(&amp;quot;bsd&amp;quot; &lt;br /&gt;
            (c-cleanup-list&lt;br /&gt;
             brace-elseif-brace brace-else-brace defun-close-semi)&lt;br /&gt;
            (c-comment-continuation-stars . &amp;quot;* &amp;quot;)&lt;br /&gt;
            (c-electric-pound-behavior alignleft)&lt;br /&gt;
            (c-hanging-braces-alist&lt;br /&gt;
             (brace-list-open)&lt;br /&gt;
             (class-open after)&lt;br /&gt;
             (substatement-open after)&lt;br /&gt;
             (block-close . c-snug-do-while)&lt;br /&gt;
             (extern-lang-open after))&lt;br /&gt;
            (c-hanging-colons-alist&lt;br /&gt;
             (case-label after)&lt;br /&gt;
             (label after))&lt;br /&gt;
            (c-hanging-comment-starter-p)&lt;br /&gt;
            (c-hanging-comment-ender-p)&lt;br /&gt;
            (c-indent-comments-syntactically-p . t)&lt;br /&gt;
            (c-label-minimum-indentation . 0)&lt;br /&gt;
            (c-special-indent-hook)))&lt;br /&gt;
        (defun krb5-c-hook ()&lt;br /&gt;
          (c-add-style &amp;quot;krb5&amp;quot; krb5-c-style t))&lt;br /&gt;
        (add-hook 'c-mode-common-hook 'krb5-c-hook)&lt;br /&gt;
&lt;br /&gt;
You might also want to try (for Emacs 22 and later):&lt;br /&gt;
&lt;br /&gt;
        (add-hook 'before-save-hook 'copyright-update)&lt;br /&gt;
&lt;br /&gt;
which will offer to update the year in the top-most copyright notice in a file when you save it, if it's not already current.&lt;br /&gt;
&lt;br /&gt;
=== indent.pro settings ===&lt;br /&gt;
&lt;br /&gt;
The following settings for the indent program should produce a&lt;br /&gt;
reasonable approximation to the C coding style described here, though&lt;br /&gt;
some manual cleanup may be necessary.  Note that the gindent installed&lt;br /&gt;
in the gnu locker does not currently handle -psl correctly though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bap&lt;br /&gt;
-br&lt;br /&gt;
-ce&lt;br /&gt;
-ci4&lt;br /&gt;
-cli0&lt;br /&gt;
-d0&lt;br /&gt;
-di8&lt;br /&gt;
-i4&lt;br /&gt;
-ip4&lt;br /&gt;
-l79&lt;br /&gt;
-nbc&lt;br /&gt;
-ncdb&lt;br /&gt;
-ndj&lt;br /&gt;
-nfc1&lt;br /&gt;
-lp&lt;br /&gt;
-npcs&lt;br /&gt;
-psl&lt;br /&gt;
-sc&lt;br /&gt;
-sob&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Coding_style&amp;diff=1157</id>
		<title>Coding style</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Coding_style&amp;diff=1157"/>
				<updated>2009-01-08T00:58:08Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Emacs cc-mode style */  suggest copyright-update hook&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
The C language '''Coding style''' described here is based on the BSD coding style, with some additional elements from the GNU coding standards and the SunOS coding standards.&lt;br /&gt;
&lt;br /&gt;
* [[Coding style/Formatting|Formatting]]&lt;br /&gt;
* [[Coding style/Practices|Practices]]&lt;br /&gt;
&lt;br /&gt;
== External links ==&lt;br /&gt;
&lt;br /&gt;
* [http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/share/misc/style?rev=HEAD NetBSD &amp;lt;code&amp;gt;/usr/share/misc/style&amp;lt;/code&amp;gt;] [http://cvsweb.netbsd.org/bsdweb.cgi/src/share/misc/style (log)]&lt;br /&gt;
* [http://www.gnu.org/prep/standards/ GNU coding standards]&lt;br /&gt;
* [http://opensolaris.org/os/community/documentation/getting_started_docs/cstyle.ms.pdf C Style and Coding Standards for SunOS]&lt;br /&gt;
&lt;br /&gt;
== Old version ==&lt;br /&gt;
&lt;br /&gt;
Old content to be moved elsewhere is below.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== WRITING C CODE ==&lt;br /&gt;
&lt;br /&gt;
The code in the krb5 source tree largely follows BSD KNF&lt;br /&gt;
(/usr/share/misc/style on NetBSD) except that it uses a four column&lt;br /&gt;
basic offset.  The style described here is a synthesis of BSD KNF and&lt;br /&gt;
the GNU coding standards for the C language.  The formatting described&lt;br /&gt;
in the &amp;quot;Formatting Your Source Code&amp;quot; section of the GNU coding&lt;br /&gt;
standards is mostly what we want, except we use BSD brace style and&lt;br /&gt;
BSD-ish conventions for the spacing around operators.&lt;br /&gt;
&lt;br /&gt;
=== Coding practices for C ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in GNU coding std but not here ===&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force extra indent of operators of different precedences&lt;br /&gt;
&lt;br /&gt;
* redundant parens to force general extra indent of expressions that are broken between lines&lt;br /&gt;
&lt;br /&gt;
* use of ^L characters to break up source files into pages&lt;br /&gt;
&lt;br /&gt;
* nitpicking about capitalization in comments of variable names when their values are meant&lt;br /&gt;
&lt;br /&gt;
* commenting usages of static variables&lt;br /&gt;
&lt;br /&gt;
* casts to void&lt;br /&gt;
&lt;br /&gt;
* separation of word in names with underscores vs case change&lt;br /&gt;
&lt;br /&gt;
* enum vs #define'd integer constants &lt;br /&gt;
&lt;br /&gt;
* 14 char filename limits, MS-DOS filename limits&lt;br /&gt;
&lt;br /&gt;
* portability&lt;br /&gt;
&lt;br /&gt;
* system library function quirks&lt;br /&gt;
&lt;br /&gt;
* internationalization&lt;br /&gt;
&lt;br /&gt;
* mmap()&lt;br /&gt;
&lt;br /&gt;
=== Aspects of C style in BSD KNF but not here ===&lt;br /&gt;
&lt;br /&gt;
* sorting of header files&lt;br /&gt;
&lt;br /&gt;
* sorting of struct members&lt;br /&gt;
&lt;br /&gt;
* separating struct tag decl and struct typedef&lt;br /&gt;
&lt;br /&gt;
* sorting of var decl&lt;br /&gt;
&lt;br /&gt;
* lining up var names in decls&lt;br /&gt;
&lt;br /&gt;
* newline after decls&lt;br /&gt;
&lt;br /&gt;
* usage of __P&lt;br /&gt;
&lt;br /&gt;
* usage of getopt&lt;br /&gt;
&lt;br /&gt;
* not initializing vars in decls&lt;br /&gt;
&lt;br /&gt;
* stdarg/varargs handling&lt;br /&gt;
&lt;br /&gt;
=== Emacs cc-mode style ===&lt;br /&gt;
&lt;br /&gt;
Putting the following code in your .emacs file will result in mostly&lt;br /&gt;
the right thing happening with respect to formatting style.  Note that&lt;br /&gt;
you may want to turn on auto-newline feature of cc-mode, though that&lt;br /&gt;
seems to have some bugs with brace-elseif-brace handling at least in&lt;br /&gt;
the version of cc-mode that comes with emacs 20.3.&lt;br /&gt;
&lt;br /&gt;
        (defconst krb5-c-style&lt;br /&gt;
          '(&amp;quot;bsd&amp;quot; &lt;br /&gt;
            (c-cleanup-list&lt;br /&gt;
             brace-elseif-brace brace-else-brace defun-close-semi)&lt;br /&gt;
            (c-comment-continuation-stars . &amp;quot;* &amp;quot;)&lt;br /&gt;
            (c-electric-pound-behavior alignleft)&lt;br /&gt;
            (c-hanging-braces-alist&lt;br /&gt;
             (brace-list-open)&lt;br /&gt;
             (class-open after)&lt;br /&gt;
             (substatement-open after)&lt;br /&gt;
             (block-close . c-snug-do-while)&lt;br /&gt;
             (extern-lang-open after))&lt;br /&gt;
            (c-hanging-colons-alist&lt;br /&gt;
             (case-label after)&lt;br /&gt;
             (label after))&lt;br /&gt;
            (c-hanging-comment-starter-p)&lt;br /&gt;
            (c-hanging-comment-ender-p)&lt;br /&gt;
            (c-indent-comments-syntactically-p . t)&lt;br /&gt;
            (c-label-minimum-indentation . 0)&lt;br /&gt;
            (c-special-indent-hook)))&lt;br /&gt;
        (defun krb5-c-hook ()&lt;br /&gt;
          (c-add-style &amp;quot;krb5&amp;quot; krb5-c-style t))&lt;br /&gt;
        (add-hook 'c-mode-common-hook 'krb5-c-hook)&lt;br /&gt;
&lt;br /&gt;
You might also want to try (for Emacs 22 and later):&lt;br /&gt;
&lt;br /&gt;
        (add-hook 'before-save-hook 'copyright-update)&lt;br /&gt;
&lt;br /&gt;
to let you automatically update the year in the top-most copyright notice in a file when you save it.&lt;br /&gt;
&lt;br /&gt;
=== indent.pro settings ===&lt;br /&gt;
&lt;br /&gt;
The following settings for the indent program should produce a&lt;br /&gt;
reasonable approximation to the C coding style described here, though&lt;br /&gt;
some manual cleanup may be necessary.  Note that the gindent installed&lt;br /&gt;
in the gnu locker does not currently handle -psl correctly though.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bap&lt;br /&gt;
-br&lt;br /&gt;
-ce&lt;br /&gt;
-ci4&lt;br /&gt;
-cli0&lt;br /&gt;
-d0&lt;br /&gt;
-di8&lt;br /&gt;
-i4&lt;br /&gt;
-ip4&lt;br /&gt;
-l79&lt;br /&gt;
-nbc&lt;br /&gt;
-ncdb&lt;br /&gt;
-ndj&lt;br /&gt;
-nfc1&lt;br /&gt;
-lp&lt;br /&gt;
-npcs&lt;br /&gt;
-psl&lt;br /&gt;
-sc&lt;br /&gt;
-sob&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1156</id>
		<title>Coding style/Practices</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Coding_style/Practices&amp;diff=1156"/>
				<updated>2009-01-08T00:51:30Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* String Handling */ remove dup; point out needed headers&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== String Handling ==&lt;br /&gt;
&lt;br /&gt;
Code should not use any of the following functions: strcpy, strcat, sprintf, or any *scanf function.&lt;br /&gt;
&lt;br /&gt;
Dynamically allocated buffers are preferred to fixed-sized buffers.  When using dynamic buffers:&lt;br /&gt;
* Use strdup or asprintf for simple constructions.&lt;br /&gt;
* Use the k5buf module (k5-buf.h) for complex constructions.  If this is not desirable, strlcpy and strlcat are valid alternatives.&lt;br /&gt;
&lt;br /&gt;
Substitute versions of strlcpy, strlcat, and asprintf, for operating systems that don't supply them, are declared in k5-platform.h and defined in the support library (which practically everything in the tree links directly against).&lt;br /&gt;
&lt;br /&gt;
When using fixed-sized buffers:&lt;br /&gt;
* Use strlcpy for simple copies.&lt;br /&gt;
* Use snprintf for simple compound constructions.  Avoid using precision or field width specifiers in snprintf format strings.&lt;br /&gt;
* To check for truncation when using snprintf, use the following approach:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
result = snprintf(buffer, sizeof(buffer), &amp;quot;format string&amp;quot;, ...);&lt;br /&gt;
if (SNPRINTF_OVERFLOW(result, sizeof(buffer))&lt;br /&gt;
    handle_overflow_error;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The SNPRINTF_OVERFLOW macro is defined in k5-platform.h.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code does not conform, but is under active conversion.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
It is relatively common to audit a code base such as krb5 and flag all uses of strcpy and similar functions, even if they are used safely.  Verifying that the function is used safely requires manual inspection.  Using safer alternatives does not guarantee code safety, but does reduce the likelihood of a catastrophic buffer overflow vulnerability.&lt;br /&gt;
&lt;br /&gt;
In some compilation environments under Solaris, field widths and precisions are computed using screen columns rather than bytes.&lt;br /&gt;
&lt;br /&gt;
sprintf returns a signed integer; buffer sizes are typically size_t (which is an unsigned type).  Comparing the two directly will result in a warning from some compilers, and has unpredictable semantics depending on the relative widths of int and size_t.  Also, some sprintf implementations, such as the one in Solaris prior to version 10, return -1 on a buffer overflow, whereas the C99 behavior returns the number of bytes which would have been written to the string.  The SNPRINTF_OVERFLOW macro uses casts to address both issues.&lt;br /&gt;
&lt;br /&gt;
The k5buf module safely allows multi-step string construction within fixed-size or dynamic buffers without performing an error check on each append, and without pre-computing lengths.  Errors need only be checked when the resulting string needs to be read or handed off to another function.&lt;br /&gt;
&lt;br /&gt;
== Exception Handling ==&lt;br /&gt;
&lt;br /&gt;
If a function allocates several resources and has many exit paths, use the following general structure when possible:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  krb5_error_code retval;&lt;br /&gt;
  char *ptr1 = NULL;&lt;br /&gt;
  krb5_blah *ptr2 = NULL;&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
  retval = another_function(...);&lt;br /&gt;
  if (retval != 0)&lt;br /&gt;
    goto cleanup;&lt;br /&gt;
...&lt;br /&gt;
cleanup:&lt;br /&gt;
  if (ptr1)&lt;br /&gt;
    free(ptr1);&lt;br /&gt;
  if (ptr2)&lt;br /&gt;
    kbr5_free_blah(ptr2);&lt;br /&gt;
  return retval;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Simpler functions may use simpler structures, but do not get to the point of freeing the same resource in several different places within a function depending on the exit path.&lt;br /&gt;
&lt;br /&gt;
=== Current conformance ===&lt;br /&gt;
&lt;br /&gt;
Existing code mostly conforms, with some exceptions.&lt;br /&gt;
&lt;br /&gt;
=== Rationale ===&lt;br /&gt;
&lt;br /&gt;
This is the most reliable way to avoid resource leaks within the constraints of the krb5 code base.  Within libraries, the code base does not abort on memory allocation failure, so tends to have many exit paths within some functions.&lt;br /&gt;
&lt;br /&gt;
== Assignments as truth values ==&lt;br /&gt;
&lt;br /&gt;
Do not use assignments as truth values.  Rather than this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if ((retval = krb5_foo()))&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
retval = krb5_foo();&lt;br /&gt;
if (retval)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This makes the code easier to read, and also makes it easier to use&lt;br /&gt;
debuggers.  It may be excusable to put assignments into the&lt;br /&gt;
conditional espression of a &amp;quot;while&amp;quot; statement, though, like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
while ((ch = getopt(argc, argv, &amp;quot;abn&amp;quot;)) != -1)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Using assignments as truth values in conditional expressions may make&lt;br /&gt;
code particularly impenetrable.&lt;br /&gt;
&lt;br /&gt;
== The many names of zero ==&lt;br /&gt;
&lt;br /&gt;
There are at least three types of &amp;quot;zero&amp;quot; known to C.  These are the&lt;br /&gt;
integer zero (0), the null pointer constant (NULL), and the character&lt;br /&gt;
constant zero ('\0').  Yes, these are usually all technically the&lt;br /&gt;
integer zero.  Use them in their correct contexts.  (Purists will&lt;br /&gt;
point out that 0 is a valid null pointer constant; still, do not use 0&lt;br /&gt;
to specify a null pointer constant.  For further unconfusion, read the&lt;br /&gt;
section on null pointer constants in the C FAQ.)  Do not use a lone&lt;br /&gt;
variable as a truth value unless it's of integer type.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int i;&lt;br /&gt;
char *cp;&lt;br /&gt;
/* ... */&lt;br /&gt;
if (i)&lt;br /&gt;
    /* ... */;&lt;br /&gt;
if (cp != NULL) {&lt;br /&gt;
    while (*cp != '\0')&lt;br /&gt;
        /* ... */;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Do not cast uses of NULL unless you're calling a function with a&lt;br /&gt;
variable number of arguments, in which case you should cast it to to&lt;br /&gt;
the appropriate pointer type.  Likewise, do not cast the return value&lt;br /&gt;
from malloc() and friends; the prototype should declare them properly&lt;br /&gt;
as returning a void * and thus shouldn't require an explicit cast.&lt;br /&gt;
&lt;br /&gt;
Do not assume that realloc(NULL, size) will do the right thing, or&lt;br /&gt;
that free(NULL) will do the right thing.  ANSI guarantees that it&lt;br /&gt;
will, but some old libraries (hopefully becoming obsolete) don't.&lt;br /&gt;
Also, don't assume that malloc(0) will return a non-NULL pointer.&lt;br /&gt;
Typically, though, the output of malloc(0) will be safe to pass to&lt;br /&gt;
realloc() and free().&lt;br /&gt;
&lt;br /&gt;
In any case, reading the section in the C FAQ on null pointers is&lt;br /&gt;
highly recommended to remove confusion regarding null pointers in C,&lt;br /&gt;
since this is a subject of much confusion to even experienced&lt;br /&gt;
programmers.  In particular, if you do not understand why using&lt;br /&gt;
calloc() to allocate a struct that contains pointer members or why&lt;br /&gt;
calling memset() to initialize such a struct to all-bytes-zero is&lt;br /&gt;
wrong, reread that section again.  (Note that there are *lots* of&lt;br /&gt;
examples of code in the krb5 source tree that erroneously calls&lt;br /&gt;
memset() to zero a struct, and we should fix these somehow&lt;br /&gt;
eventually.)&lt;br /&gt;
&lt;br /&gt;
== Brace placement ==&lt;br /&gt;
&lt;br /&gt;
Control flow statements that have a single statement as their body&lt;br /&gt;
should nevertheless have braces around their bodies if the body is&lt;br /&gt;
more than one line long, especially in the case of stacked multiple&lt;br /&gt;
if-else clauses; use:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if (x) {&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
if (x)&lt;br /&gt;
    if (y)&lt;br /&gt;
        foo();&lt;br /&gt;
    else&lt;br /&gt;
        bar();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which, while legible to the compiler, may confuse human readers and&lt;br /&gt;
make the code less maintainable, especially if new branches get added&lt;br /&gt;
to any of the clauses.&lt;br /&gt;
&lt;br /&gt;
If you are writing a do-while loop that has only one statement in its&lt;br /&gt;
body, put braces around it anyway, since the while clause may be&lt;br /&gt;
mistaken for a while loop with an empty body.  Don't do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* bad style */&lt;br /&gt;
do&lt;br /&gt;
    foo();&lt;br /&gt;
while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Instead, write this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* better style */&lt;br /&gt;
do {&lt;br /&gt;
    foo();&lt;br /&gt;
} while (x);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preprocessor conditionals ==&lt;br /&gt;
&lt;br /&gt;
Almost never intersperse conditional compilation&lt;br /&gt;
directives with control flow statements, as some combination of&lt;br /&gt;
&amp;lt;code&amp;gt;#define&amp;lt;/code&amp;gt;d symbols may result in statements getting eaten by dangling&lt;br /&gt;
bits of control flow statements.  When it is not possible to avoid&lt;br /&gt;
this questionable practice (you really should rewrite the relevant&lt;br /&gt;
code section), make use of redundant braces to ensure that a compiler&lt;br /&gt;
error will result in preference to incorrect runtime behavior (such as&lt;br /&gt;
inadvertently providing someone with a root shell).&lt;br /&gt;
&lt;br /&gt;
Do not intersperse conditional compilation directives with control&lt;br /&gt;
flow statements in such a way that confuses emacs cc-mode.  Not only&lt;br /&gt;
does emacs get confused, but the code becomes more difficult to read&lt;br /&gt;
and maintain.  Therefore, avoid code like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    /* bad style */&lt;br /&gt;
    if (x) {&lt;br /&gt;
        f();&lt;br /&gt;
    }&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
    else if (y) {&lt;br /&gt;
#else&lt;br /&gt;
    else {&lt;br /&gt;
#endif&lt;br /&gt;
        g();&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Put comments after conditional compilation directives such as &amp;quot;#else&amp;quot;&lt;br /&gt;
and &amp;quot;#endif&amp;quot;.  Make them correspond to the sense of the value that&lt;br /&gt;
controls the compilation of the section they are closing, i.e.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ifdef FOO&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !FOO */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !FOO */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, in the case of more complex conditional compilation directives,&lt;br /&gt;
write the comments like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#if defined(FOO) || defined(BAR)&lt;br /&gt;
/* ... */&lt;br /&gt;
#else /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
/* ... */&lt;br /&gt;
#endif /* !(defined(FOO) || defined(BAR)) */&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Local variables ==&lt;br /&gt;
&lt;br /&gt;
Do not declare variables in an inner scope, e.g. inside the compound&lt;br /&gt;
substatement of an if statement, unless the complexity of the code&lt;br /&gt;
really demands that the variables be declared that way.  In such&lt;br /&gt;
situations, the function could probably stand to be broken up into&lt;br /&gt;
smaller chunks anyway.  Do not declare variables in an inner scope&lt;br /&gt;
that shadow ones in an outer scope, since this leads to confusion.&lt;br /&gt;
Also, some debugging environments, such as gdb under Solaris, can't&lt;br /&gt;
see variables declared in an inner scope, so declaring such variables&lt;br /&gt;
will make maintenance more difficult as well.&lt;br /&gt;
&lt;br /&gt;
== Placement of parentheses ==&lt;br /&gt;
&lt;br /&gt;
Parenthesize expressions that may be confusing, particularly where C's&lt;br /&gt;
precedences are broken.  For example, the shift operators have lower&lt;br /&gt;
precedence than the +, -, *, /, and % operators.  Perhaps the most&lt;br /&gt;
familiar C precedence quirk is that equality and relational operators&lt;br /&gt;
are of higher precedence than assignment operators.  Less well known&lt;br /&gt;
is that the bitwise operators are of a lower precedence than equality&lt;br /&gt;
and relational operators.&lt;br /&gt;
&lt;br /&gt;
The sizeof operator takes either a unary expression or a parenthesized&lt;br /&gt;
type name.  It is not necessary to parenthesize the operand of sizeof&lt;br /&gt;
if it is applied to a unary expression, but still, always parenthesize&lt;br /&gt;
the operand of the sizeof operator.  The sizeof operator does not&lt;br /&gt;
evaluate its operand if it is a unary expression, so usages such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
s = sizeof(++foo);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should be avoided for the sake of sanity and readability.&lt;br /&gt;
&lt;br /&gt;
== Function-like macros ==&lt;br /&gt;
&lt;br /&gt;
Macros should have all-uppercase names.  If it is necessary to use&lt;br /&gt;
multiple statements, use braces, and wrap the whole thing in a&lt;br /&gt;
do-while(0) construct, such as&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#define FOOMACRO(x, y) do {                     \&lt;br /&gt;
    foo = (x) + (y);                            \&lt;br /&gt;
    f(y);                                       \&lt;br /&gt;
} while (0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Leave off the semicolon at the end of a function-like macro, so that&lt;br /&gt;
it can be mostly used like a call to a function without a return&lt;br /&gt;
value.  Line up the backslashes to make it more readable.  Use M-x&lt;br /&gt;
c-backslash-region in emacs to do neat lined-up backslashes.&lt;br /&gt;
Parenthesize uses of arguments in the replacement text of a macro in&lt;br /&gt;
order to prevent weird interactions.&lt;br /&gt;
&lt;br /&gt;
== Namespaces ==&lt;br /&gt;
&lt;br /&gt;
The C standard reserves a bunch of namespaces for the implementation.&lt;br /&gt;
Don't stomp on them.  For practical purposes, any identifier with a&lt;br /&gt;
leading underscore should not be used.  (Technically, ^_[a-z].* are&lt;br /&gt;
reserved only for file scope, so should be safe for things smaller&lt;br /&gt;
than file scope, but it's better to be paranoid in this case.)&lt;br /&gt;
&lt;br /&gt;
POSIX reserves typedef names ending with _t as well.&lt;br /&gt;
&lt;br /&gt;
Recall that errno is a reserved identifier, and is permitted to be a&lt;br /&gt;
macro.  Therefore, do not use errno as the name of a structure member,&lt;br /&gt;
etc.&lt;br /&gt;
&lt;br /&gt;
Reserved namespaces are somewhat more restricted than this; read the&lt;br /&gt;
appropriate section of the C standard if you have questions.&lt;br /&gt;
&lt;br /&gt;
If you're writing new library code, pick a short prefix and stick with&lt;br /&gt;
it for any identifier with external linkage.  If for some reason a&lt;br /&gt;
library needs to have external symbols that should not be visible to&lt;br /&gt;
the application, pick another (related) prefix to use for the internal&lt;br /&gt;
globals.  This applies to typedef names, tag names, and preprocessor&lt;br /&gt;
identifiers as well.&lt;br /&gt;
&lt;br /&gt;
For the krb5 library, the prefix for public global symbols is &amp;quot;krb5_&amp;quot;.&lt;br /&gt;
Use &amp;quot;krb5int_&amp;quot; as a prefix for library internal globals.  Avoid using&lt;br /&gt;
&amp;quot;__&amp;quot; in symbol names, as it may confuse C++ implementations.  There&lt;br /&gt;
are admittedly a number of places where we leak thing into the&lt;br /&gt;
namespace; we should try to fix these.&lt;br /&gt;
&lt;br /&gt;
Header files should also not leak symbols.  Usually using the upcased&lt;br /&gt;
version of the prefix you've picked will suffice, e.g. &amp;quot;KRB5_&amp;quot; as a&lt;br /&gt;
CPP symbol prefix corresponding to &amp;quot;krb5_&amp;quot;.  In general, do not define&lt;br /&gt;
macros that are lowercase, in order to avoid confusion and to prevent&lt;br /&gt;
namespace collisions.&lt;br /&gt;
&lt;br /&gt;
The C standard only guarantees six case-insensitive characters to be&lt;br /&gt;
significant in external identifiers; this is largely regarded as&lt;br /&gt;
obsolescent even in 1989 and we will ignore it.  It does, however,&lt;br /&gt;
only guarantee 31 case-sensitive characters to be signficant in&lt;br /&gt;
internal identifiers, so do not use identifiers that differ beyond the&lt;br /&gt;
31st character.  This is unlikely to be a problem, though.&lt;br /&gt;
&lt;br /&gt;
== Misc. to be sorted ==&lt;br /&gt;
&lt;br /&gt;
Assume, for most purposes, working ANSI/ISO C ('89, not '99) support,&lt;br /&gt;
both for internal use and for applications compiling against Kerberos&lt;br /&gt;
header files and libraries.  Some exceptions are noted below.&lt;br /&gt;
&lt;br /&gt;
While it is syntactically correct to call through a function pointer&lt;br /&gt;
without applying a dereference operator to it, do not write code that&lt;br /&gt;
does this.  It is easier to see that the function call is actually&lt;br /&gt;
taking place through a function pointer if you write an explicit&lt;br /&gt;
dereference.  However, do not explicitly take the address of a&lt;br /&gt;
function in order to assign it to a function pointer, since a function&lt;br /&gt;
name degrades into a pointer.  Thus:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int (*fp)(void);&lt;br /&gt;
int foofunc(void);&lt;br /&gt;
fp = foofunc;&lt;br /&gt;
x = (*fp)();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In general, do not take the address of an array.  It does not return a&lt;br /&gt;
pointer to the first element; it returns a pointer to the array&lt;br /&gt;
itself.  These are often identical when cast to an integral type, but&lt;br /&gt;
they are inherently of different types themselves.  Functions that&lt;br /&gt;
take array types or pointers to array types as arguments can be&lt;br /&gt;
particularly trouble-prone.&lt;br /&gt;
&lt;br /&gt;
If a function is declared to return a value, do not call &amp;quot;return&amp;quot;&lt;br /&gt;
without an argument or allow the flow of control to fall off the end&lt;br /&gt;
of the function.&lt;br /&gt;
&lt;br /&gt;
Always declare the return type of a function, even if it returns int.&lt;br /&gt;
Yes, this means declaring main() to return int, since main() is&lt;br /&gt;
required to return int by the standard.  If a function is not supposed&lt;br /&gt;
to return a value, declare it as returning void rather than omitting&lt;br /&gt;
the return type, which will default the return type to int.&lt;br /&gt;
&lt;br /&gt;
Try to use ANSI C prototype-style function definitions in preference&lt;br /&gt;
to K&amp;amp;R style definitions.  When using K&amp;amp;R style function definitions,&lt;br /&gt;
declare all the argument types, even those that are int, but beware of&lt;br /&gt;
any narrow types in the argument list.&lt;br /&gt;
&lt;br /&gt;
Don't pass around structures except by address.  We may relax this&lt;br /&gt;
restriction for non-API functions, though.&lt;br /&gt;
&lt;br /&gt;
For new functions, input parameters should go before output parameters&lt;br /&gt;
in the call signature.  There are exceptions, such as a context-like&lt;br /&gt;
parameter.&lt;br /&gt;
&lt;br /&gt;
Every function should have block comment preceding it describing&lt;br /&gt;
briefly in complete sentences what it does, what inputs and outputs it&lt;br /&gt;
has, and what error codes it can return.  It should also describe any&lt;br /&gt;
unusual aspects of the function.  At some point we will want to put&lt;br /&gt;
some of this information into a machine-parsable form.&lt;br /&gt;
&lt;br /&gt;
Strive to make your code capable of compiling using &amp;quot;gcc -Wall&lt;br /&gt;
-Wmissing-prototypes -Wtraditional -Wcast-qual -Wcast-align&lt;br /&gt;
-Wconversion -Waggregate-return -pedantic&amp;quot; [XXX need to rethink this&lt;br /&gt;
somewhat] without generating any errors or warnings.  Do not, however,&lt;br /&gt;
compile using the &amp;quot;-ansi&amp;quot; flag to gcc, since that can result in odd&lt;br /&gt;
behavior with header files on some systems, causing some necessary&lt;br /&gt;
symbols to not be defined.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=728</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=728"/>
				<updated>2008-10-14T17:07:54Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* September 2008 */ add 09-30 minutes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==October 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-10-08 | October 8, 2008 (2008-10-08)]]&lt;br /&gt;
&lt;br /&gt;
==September 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-30 | September 30, 2008 (2008-09-30)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-09 | September 9, 2008 (2008-09-09)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-02 | September 2, 2008 (2008-09-02)]]&lt;br /&gt;
&lt;br /&gt;
==August 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-26 | August 26, 2008 (2008-08-26)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-04 | August 4, 2008 (2008-08-04)]]&lt;br /&gt;
&lt;br /&gt;
==July 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-21 | July 21, 2008 (2008-07-21)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-14 | July 14, 2008 (2008-07-14)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-07 | July 7, 2008 (2008-07-07)]]&lt;br /&gt;
&lt;br /&gt;
==June 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-30 | June 30, 2008 (2008-06-30)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-23 | June 23, 2008 (2008-06-23)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-16 | June 16, 2008 (2008-06-16)]]&lt;br /&gt;
&lt;br /&gt;
==May 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-19 | May 19, 2008 (2008-05-19)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-12 | May 12, 2008 (2008-05-12)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-05 | May 5, 2008 (2008-05-05)]]&lt;br /&gt;
&lt;br /&gt;
==April 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-04-28 | April 28, 2008 (2008-04-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-04-14 | April 14, 2008 (2008-04-14)]]&lt;br /&gt;
&lt;br /&gt;
==March 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-03-31 |March 31, 2008 (2008-03-31)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-24 |March 24, 2008 (2008-03-24)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-17 |March 17, 2008 (2008-03-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-10 |March 10, 2008 (2008-03-10)]]&lt;br /&gt;
&lt;br /&gt;
==February 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-02-04 |February 4, 2008 (2008-02-04)]]&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-09-30&amp;diff=727</id>
		<title>Release Meeting Minutes/2008-09-30</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-09-30&amp;diff=727"/>
				<updated>2008-10-14T17:07:11Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: ==Meeting notes for 2008-09-30==  In room: Ken Alexis Tom Zhanna Greg Justin Steve; on phone: Sam H, Will F.  ... (started taking notes late) ...  Discussion of master key rollover, mostly...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Meeting notes for 2008-09-30==&lt;br /&gt;
&lt;br /&gt;
In room: Ken Alexis Tom Zhanna Greg Justin Steve; on phone: Sam H, Will F.&lt;br /&gt;
&lt;br /&gt;
... (started taking notes late) ...&lt;br /&gt;
&lt;br /&gt;
Discussion of master key rollover, mostly seems to have agreement.&lt;br /&gt;
Updating project page, timeline unchanged.&lt;br /&gt;
Will will add more intermediate implementation milestones.&lt;br /&gt;
&lt;br /&gt;
Project proposal process revisions.&lt;br /&gt;
&lt;br /&gt;
Currently need to provide a lot of detail, big hurdle.  Could use this process only for large projects, or streamline process, or both.&lt;br /&gt;
&lt;br /&gt;
Sam asks what problem is.  Want a starting point for discussion that has less detail, less onerous to make an initial proposal.  Want a lighter-weight initial step for discussion.  Sam originally envisioned the process being used that way, but without it being too formalized and creating too much work to even start up a project.  Tom: To the extent that it can be informal, mailing list is good enough; for stuff people may want to look up later, need wiki.  May also want to keep around (wiki, or issue tracker) ideas that have been previously brought up and shot down.  Maybe turn into iterative process.&lt;br /&gt;
&lt;br /&gt;
Difficult to get anyone to approve a project.  Possible approach, make a ticket in RT and assign it.  Or, person proposing project needs to do the work of finding support and approval; may be too difficult for someone just getting started but fine for established developers.  Could assign a sponsor/mentor/parter/spirit-guide/whatever for new developers to help shepherd things along.&lt;br /&gt;
&lt;br /&gt;
Someone needs to make sure reviews actually happen.  Tom?&lt;br /&gt;
&lt;br /&gt;
Maybe a small list or set of people who can be emailed?&lt;br /&gt;
&lt;br /&gt;
Tom suggests krbcore members should be responsible for reviewing code.  Could automate assignment in RT when a ticket goes into &amp;quot;review&amp;quot; state.  Also, can start sending ticket state changes to krbcore list.  May need to update krbcore list membership.&lt;br /&gt;
&lt;br /&gt;
Pages needed in wiki?  Enrollment process for new committers.  How to start doing stuff (Will's list).  Expectations for krbcore members.  Code review process.  Expectations in terms of testing contributions.&lt;br /&gt;
&lt;br /&gt;
Some nightly test runs are failing.  New krbdev machine needs some reconfiguration, can't download readable log files right now.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Krbweb_test&amp;diff=697</id>
		<title>Krbweb test</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Krbweb_test&amp;diff=697"/>
				<updated>2008-10-08T19:30:21Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{krbweb-public-page}}&lt;br /&gt;
&lt;br /&gt;
This is a test document.&lt;br /&gt;
&lt;br /&gt;
Hello!&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=493</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=493"/>
				<updated>2008-09-02T17:24:41Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==September 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-09-02 | September 2, 2008 (2008-09-02)]]&lt;br /&gt;
&lt;br /&gt;
==August 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-26 | August 26, 2008 (2008-08-26)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-08-04 | August 4, 2008 (2008-08-04)]]&lt;br /&gt;
&lt;br /&gt;
==July 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-21 | July 21, 2008 (2008-07-21)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-14 | July 14, 2008 (2008-07-14)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-07-07 | July 7, 2008 (2008-07-07)]]&lt;br /&gt;
&lt;br /&gt;
==June 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-30 | June 30, 2008 (2008-06-30)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-23 | June 23, 2008 (2008-06-23)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-16 | June 16, 2008 (2008-06-16)]]&lt;br /&gt;
&lt;br /&gt;
==May 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-19 | May 19, 2008 (2008-05-19)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-12 | May 12, 2008 (2008-05-12)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-05 | May 5, 2008 (2008-05-05)]]&lt;br /&gt;
&lt;br /&gt;
==April 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-04-28 | April 28, 2008 (2008-04-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-04-14 | April 14, 2008 (2008-04-14)]]&lt;br /&gt;
&lt;br /&gt;
==March 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-03-31 |March 31, 2008 (2008-03-31)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-24 |March 24, 2008 (2008-03-24)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-17 |March 17, 2008 (2008-03-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-10 |March 10, 2008 (2008-03-10)]]&lt;br /&gt;
&lt;br /&gt;
==February 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-02-04 |February 4, 2008 (2008-02-04)]]&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-09-02&amp;diff=492</id>
		<title>Release Meeting Minutes/2008-09-02</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-09-02&amp;diff=492"/>
				<updated>2008-09-02T17:23:22Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: '''Release Meeting Notes 9/2/2008'''  Status reports:  Will: Long weekend.  Will email today a timeline for master key rollover work.  Some discussion of checklist, and testing for regress...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Release Meeting Notes 9/2/2008'''&lt;br /&gt;
&lt;br /&gt;
Status reports:&lt;br /&gt;
&lt;br /&gt;
Will: Long weekend.  Will email today a timeline for master key rollover work.  Some discussion of checklist, and testing for regressions.&lt;br /&gt;
&lt;br /&gt;
Tom: Working on RT upgrade, and cleaning up some warnings with Ken.  RT server migration should happen soon, should speed things up.&lt;br /&gt;
&lt;br /&gt;
Zhanna: Working on replay cache code, ready to test performance changes.  Planning a new design discussion.&lt;br /&gt;
&lt;br /&gt;
Ken: Integrated some patches from Apple and lxs, fixed misc warnings, some things flagged by Coverity, make rules to help out with running Coverity.  To do: More patches, domain_realm referrals, iprop.&lt;br /&gt;
&lt;br /&gt;
Justin: Working on KIM, some UI stuff on Touchstone because the Touchstone team has little UI experience.&lt;br /&gt;
&lt;br /&gt;
Alexandra: More Apple patches, more KIM work.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=423</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=423"/>
				<updated>2008-07-23T20:53:41Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Open Issues */ change name to &amp;quot;notes&amp;quot; and drop default service name list idea&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-07-17}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Caching the lists of service names isn't in the plan; that can be added later if there's a performance concern.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
: I think today's new version should address Jeff's comments.  Posting a new message asking for review....  --[[User:KenRaeburn|KenRaeburn]] 16:17, 3 July 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=422</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=422"/>
				<updated>2008-07-18T16:23:33Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Open Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-07-17}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)  Probably default to an empty list.&lt;br /&gt;
&lt;br /&gt;
Caching the lists of service names isn't in the plan; that can be added later if there's a performance concern.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
: I think today's new version should address Jeff's comments.  Posting a new message asking for review....  --[[User:KenRaeburn|KenRaeburn]] 16:17, 3 July 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=405</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=405"/>
				<updated>2008-07-03T20:21:13Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Open Issues */ note the lack of caching&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-07-17}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
Caching the lists of service names isn't in the plan; that can be added later if there's a performance concern.&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
: I think today's new version should address Jeff's comments.  Posting a new message asking for review....  --[[User:KenRaeburn|KenRaeburn]] 16:17, 3 July 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=404</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=404"/>
				<updated>2008-07-03T20:17:33Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Discussion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-07-17}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;br /&gt;
&lt;br /&gt;
: I think today's new version should address Jeff's comments.  Posting a new message asking for review....  --[[User:KenRaeburn|KenRaeburn]] 16:17, 3 July 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=403</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=403"/>
				<updated>2008-07-03T20:05:55Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: revise review date&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-07-17}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=402</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=402"/>
				<updated>2008-07-03T20:04:27Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has exactly two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-SRV-HST&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
A listing in &amp;quot;no_host_referral&amp;quot; means no referral processing will be done, even if the client uses NT-SRV-HST or the service is also listed in &amp;quot;host_based_services&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The special service name &amp;quot;*&amp;quot; in the config file will match any service.  So &amp;quot;host_based_services = *&amp;quot; means all NT-UNKNOWN principals will be treated like NT-SRV-HST, that is, referral processing will be done if they actually look like host-based principal names; and &amp;quot;no_host_referral = *&amp;quot; will disable referral processing altogether, regardless of the &amp;quot;host_based_services&amp;quot; setting or the client-supplied name type.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or from libdefaults, are &amp;quot;host_based_services&amp;quot; and &amp;quot;no_host_referral&amp;quot;.  They may be specified multiple times, and each string value contains one or more (space- or comma-separated) service names.&lt;br /&gt;
&lt;br /&gt;
With support for &amp;quot;no_host_referral = *&amp;quot; and the expectation that few sites will want to disable this processing completely, I don't see a special need for a separate config file flag for enabling and disabling referral processing explicitly.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=401</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=401"/>
				<updated>2008-07-03T19:46:27Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design */ get flag name right&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the canonicalize flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-HOST-BASED&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or in libdefaults, are: &amp;quot;host_based_services&amp;quot;, &amp;quot;no_host_referral&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=400</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=400"/>
				<updated>2008-07-03T19:45:47Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Open Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-HOST-BASED&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or in libdefaults, are: &amp;quot;host_based_services&amp;quot;, &amp;quot;no_host_referral&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way when NT-UNKNOWN is used be specified in the config file, or should we start with the hardcoded list in the 524 name conversion code and add from there?  (The exception list could still override, but wouldn't distinguish between NT-UNKNOWN and NT-SRV-HST.)&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=399</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=399"/>
				<updated>2008-07-03T19:42:45Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Open Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-HOST-BASED&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or in libdefaults, are: &amp;quot;host_based_services&amp;quot;, &amp;quot;no_host_referral&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should all services to process this way be specified in the config file, or should we also use the hardcoded list in the 524 name conversion code?&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=398</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=398"/>
				<updated>2008-07-03T18:42:25Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Desired Changes */ url for referrals draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral ([https://datatracker.ietf.org/drafts/draft-ietf-krb-wg-kerberos-referrals/ draft-ietf-krb-wg-kerberos-referrals]) support in the KDC and providing the mapping information to clients through that protocol.  Modern client code (MIT, Heimdal, and Microsoft, at least) should contain all the support needed to take advantage of this.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-HOST-BASED&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or in libdefaults, are: &amp;quot;host_based_services&amp;quot;, &amp;quot;no_host_referral&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=396</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=396"/>
				<updated>2008-06-28T00:15:26Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral (draft-ietf-krb-wg-kerberos-referrals) support in the KDC and providing the mapping information to clients through that protocol.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either:&lt;br /&gt;
** the name type is NT-UNKNOWN and the first component is listed in the config file under &amp;quot;host_based_services&amp;quot;; or&lt;br /&gt;
** the name type is NT-HOST-BASED&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
The config file entries used, from the per-realm data or in libdefaults, are: &amp;quot;host_based_services&amp;quot;, &amp;quot;no_host_referral&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;br /&gt;
&lt;br /&gt;
I believe that name type needs to be considered and that Jeff Hutzelman's proposal on krbdev should be adopted.; this is not quite a blocking objection but I'd appreciate explicit closure before you go forward with another option.&lt;br /&gt;
--[[User:SamHartman|SamHartman]] 13:45, 10 May 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=395</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=395"/>
				<updated>2008-06-23T17:36:22Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==June 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-06-23 | June 23, 2008 (2008-06-23)]]&lt;br /&gt;
&lt;br /&gt;
==May 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-19 | May 19, 2008 (2008-05-19)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-12 | May 12, 2008 (2008-05-12)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-05 | May 5, 2008 (2008-05-05)]]&lt;br /&gt;
&lt;br /&gt;
==April 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-04-28 | April 28, 2008 (2008-04-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-04-14 | April 14, 2008 (2008-04-14)]]&lt;br /&gt;
&lt;br /&gt;
==March 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-03-31 |March 31, 2008 (2008-03-31)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-24 |March 24, 2008 (2008-03-24)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-17 |March 17, 2008 (2008-03-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-10 |March 10, 2008 (2008-03-10)]]&lt;br /&gt;
&lt;br /&gt;
==February 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-02-04 |February 4, 2008 (2008-02-04)]]&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-06-23&amp;diff=394</id>
		<title>Release Meeting Minutes/2008-06-23</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-06-23&amp;diff=394"/>
				<updated>2008-06-23T17:35:31Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: Present: Ken, Tom, Alexis, Robert, Will  Who's looked at the draft krb5 api doc?  lxs has, saw some broken stuff and missing documentation, but it may have been a broken rev that was avail...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Present: Ken, Tom, Alexis, Robert, Will&lt;br /&gt;
&lt;br /&gt;
Who's looked at the draft krb5 api doc?  lxs has, saw some broken&lt;br /&gt;
stuff and missing documentation, but it may have been a broken rev&lt;br /&gt;
that was available for a few hours.  Current version isn't what she&lt;br /&gt;
looked at.&lt;br /&gt;
&lt;br /&gt;
Keytab stash file status: Will recoded some stuff, is re-testing,&lt;br /&gt;
should have something for review soon.&lt;br /&gt;
&lt;br /&gt;
Incremental prop: Ken still working on it, hoping to merge something&lt;br /&gt;
to the trunk tonight.&lt;br /&gt;
&lt;br /&gt;
Apple: lxs is still analyzing Apple patches, some need review from Ken&lt;br /&gt;
&amp;amp; Tom; need to talk to Apple about licensing.  Authz plugin API should&lt;br /&gt;
be reviewed on krbdev.&lt;br /&gt;
&lt;br /&gt;
MySQL: Robert is making progress getting plugin working.  May have&lt;br /&gt;
found a way to extend the protocol without breaking backwards&lt;br /&gt;
compatibility.&lt;br /&gt;
&lt;br /&gt;
Tom is trying to finish putting together a coding standards proposal,&lt;br /&gt;
and revised roadmap for development, perhaps projecting a few years&lt;br /&gt;
(and multiple releases) out.&lt;br /&gt;
&lt;br /&gt;
IETF: Ken - referrals doc, main open areas (IIRC) are server&lt;br /&gt;
canonicalization and security.  Tom - assigned numbers for Kerberos,&lt;br /&gt;
moving to IANA.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=393</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=393"/>
				<updated>2008-05-19T17:36:28Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: add 2008-05-19&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==May 2008==&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-19 | May 19, 2008 (2008-05-19)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-12 | May 12, 2008 (2008-05-12)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-05-05 | May 5, 2008 (2008-05-05)]]&lt;br /&gt;
&lt;br /&gt;
==April 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-04-28 | April 28, 2008 (2008-04-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-04-14 | April 14, 2008 (2008-04-14)]]&lt;br /&gt;
&lt;br /&gt;
==March 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-03-31 |March 31, 2008 (2008-03-31)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-24 |March 24, 2008 (2008-03-24)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-17 |March 17, 2008 (2008-03-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-03-10 |March 10, 2008 (2008-03-10)]]&lt;br /&gt;
&lt;br /&gt;
==February 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-02-04 |February 4, 2008 (2008-02-04)]]&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-05-19&amp;diff=392</id>
		<title>Release Meeting Minutes/2008-05-19</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-05-19&amp;diff=392"/>
				<updated>2008-05-19T17:35:11Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: '''Minutes of weekly release meeting for 2008-05-19:'''  Tom will send email to krbdev about some changed release priorities, asking for feedback.  Any progress on changing process for dis...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Minutes of weekly release meeting for 2008-05-19:'''&lt;br /&gt;
&lt;br /&gt;
Tom will send email to krbdev about some changed release priorities, asking for feedback.&lt;br /&gt;
&lt;br /&gt;
Any progress on changing process for discussing project proposals? We could use RT.  We're trying to put together a proposal for updating our RT installation.  Will describes a web app he's used.  We could use RT with approval statements in comments.  We may want to hold off until we've dealt with the web-comment-spam problem.  Proposal: Use a special-purpose RT queue; sends to krbdev, receives mail from krbdev, so replies with ticket number get appended to the correct ticket.  (No new ticket creation through this mechanism, so other traffic won't flood the RT database.)&lt;br /&gt;
&lt;br /&gt;
Tom thinks we need more formal documentation of interface stability levels.  We have some ideas internally, but we don't publish it. Maybe in header files?  Distinguish API from ABI?  Put it in our API documentation too?  Sun's man pages have some of this sort of info. Some discussion of Sun processes.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=385</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=385"/>
				<updated>2008-05-08T16:12:34Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Desired Changes */ mention ietf draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral (draft-ietf-krb-wg-kerberos-referrals) support in the KDC and providing the mapping information to clients through that protocol.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=384</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=384"/>
				<updated>2008-05-08T16:11:06Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design */ do by default, configure exceptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral support in the KDC and providing the mapping information to clients through that protocol.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* the first component is not in a list configured in the KDC config file under &amp;quot;no_host_referral&amp;quot;&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=367</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=367"/>
				<updated>2008-04-29T18:13:57Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Design */ don't do it for u2u&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral support in the KDC and providing the mapping information to clients through that protocol.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the request is not a user-to-user authentication request&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=366</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=366"/>
				<updated>2008-04-28T20:50:27Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* Desired Changes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case, by implementing minimal referral support in the KDC and providing the mapping information to clients through that protocol.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=365</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=365"/>
				<updated>2008-04-28T20:46:54Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: move open testing issue into open-issues section; put up for review&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-review|2008-05-12}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Review==&lt;br /&gt;
&lt;br /&gt;
This section documents the review of the project according to [[Project policy]].&lt;br /&gt;
It  is divided into multiple sections.  First, approvals should be listed.  To list an approval type&lt;br /&gt;
:&amp;lt;nowiki&amp;gt;#~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
on its own line.&lt;br /&gt;
The next section is for discussion.  Use standard [http://en.wikipedia.org/wiki/Wikipedia:Tutorial_%28Talk_pages%29 talk page conventions].    In particular, sign comments with &lt;br /&gt;
:&amp;lt;nowiki&amp;gt;--~~~~&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
and indent replies.&lt;br /&gt;
&lt;br /&gt;
Members of Krbcore raising Blocking objections should preface their comment with &amp;lt;nowiki&amp;gt;{{project-block}}&amp;lt;/nowiki&amp;gt;.  The member who raised the objection should remove this markup when their objection is handled.&lt;br /&gt;
&lt;br /&gt;
===Approvals===&lt;br /&gt;
&lt;br /&gt;
===Discussion===&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=364</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=364"/>
				<updated>2008-04-28T20:43:32Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: move open issues to bottom&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes&lt;br /&gt;
* Library change test case&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
Extent of automated testing (see above).&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=363</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=363"/>
				<updated>2008-04-28T20:42:19Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
If the target realm is the local realm, the request should simply fail, since by this point we've already checked the database.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes implemented.&lt;br /&gt;
* Library change test case implemented.&lt;br /&gt;
* KDC detection of the relevant cases&lt;br /&gt;
* KDC implementation of change of principal name&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Manual test of unknown name that maps to the local realm.&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=362</id>
		<title>Projects/domain realm referrals</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Projects/domain_realm_referrals&amp;diff=362"/>
				<updated>2008-04-28T20:37:42Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: {{project-early}}  == Desired Changes ==  Eliminate the need for the domain_realm mapping table on the client side, in the common case.  == Functional Requirements ==  Clients should be ab...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{project-early}}&lt;br /&gt;
&lt;br /&gt;
== Desired Changes ==&lt;br /&gt;
&lt;br /&gt;
Eliminate the need for the domain_realm mapping table on the client side, in the common case.&lt;br /&gt;
&lt;br /&gt;
== Functional Requirements ==&lt;br /&gt;
&lt;br /&gt;
Clients should be able to function with no domain_realm mapping table, by sending requests for the service principal name ''service/canonical-fqdn@LOCAL.REALM'' to the local KDC and requesting referrals.  This may be limited to service principal names with specific name types or in specific forms (''e.g.,'' two components where first is in the set {host,ftp,...}).&lt;br /&gt;
&lt;br /&gt;
The KDC should use only its domain_realm mapping table.  No blocking queries to DNS may be introduced.&lt;br /&gt;
&lt;br /&gt;
== Design ==&lt;br /&gt;
&lt;br /&gt;
Use a new function, with most of the body of the current krb5_get_host_realm:&lt;br /&gt;
&lt;br /&gt;
 krb5_error_code&lt;br /&gt;
 krb5int_get_domain_realm_mapping(krb5_context, const char *host, char ***realmsp)&lt;br /&gt;
&lt;br /&gt;
Add a field to the accessor structure, to export it.&lt;br /&gt;
&lt;br /&gt;
In the KDC code, in TGS processing, if:&lt;br /&gt;
* the server principal name is unknown&lt;br /&gt;
* the referral flag is set in the request&lt;br /&gt;
* the requested server principal has two components&lt;br /&gt;
* either the first component is a recognized service name (this may be hardcoded initially) or the name type is host-based&lt;br /&gt;
* the second component looks like a fully-qualified domain name&lt;br /&gt;
* ''(there may be additional conditions that should be imposed)''&lt;br /&gt;
then try mapping the FQDN after forcing it to lowercase, or if that mapping fails, the containing domains.  If a match is found, then re-process the request as if the client had asked for a cross-realm TGT for the indicated realm, including possibly determining an intermediate realm to return a TGT for instead.&lt;br /&gt;
&lt;br /&gt;
== Open Issues ==&lt;br /&gt;
&lt;br /&gt;
Should the list of services to process this way be specified in the config file, or is a hardcoded set adequate at first?  (Meta-issue: Should config information that is realm-specific but not KDC-specific be moved into the database from the config file?)&lt;br /&gt;
&lt;br /&gt;
Should we use a list of services, or just process all two-element names where the second component looks like a domain name?&lt;br /&gt;
&lt;br /&gt;
== Tasks/Milestones ==&lt;br /&gt;
&lt;br /&gt;
* Library changes implemented.&lt;br /&gt;
* Library change test case implemented.&lt;br /&gt;
* KDC portion implemented.&lt;br /&gt;
&lt;br /&gt;
== Testing Plan ==&lt;br /&gt;
&lt;br /&gt;
Unit test for the new library routine.&lt;br /&gt;
&lt;br /&gt;
Manual test of cross-realm case with kvno.&lt;br /&gt;
&lt;br /&gt;
Do we want to add cross-realm test cases to the automated tests?  I think currently only the DejaGnu-based tests are set up to manage running a KDC and additional client programs, and they're not set up to manage multiple realms.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Talk:Coding_style&amp;diff=343</id>
		<title>Talk:Coding style</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Talk:Coding_style&amp;diff=343"/>
				<updated>2008-04-14T23:51:44Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: I think the bits about not passing NULL to realloc or free are obsolete.  So is allowing K&amp;amp;R style function declarations or definitions in new code instead of using prototype style.  Using...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I think the bits about not passing NULL to realloc or free are obsolete.  So is allowing K&amp;amp;R style function declarations or definitions in new code instead of using prototype style.&lt;br /&gt;
&lt;br /&gt;
Using calloc or memset with pointer fields isn't so much wrong as incomplete.  It's probably reasonable to clobber whatever might have been there before (unless we've got ''good'' tools for tracking uninitialized storage, and we think we meant to initialize everything), it just isn't guaranteed to give you null pointers, so if you want pointers initialized to null, you should do that also, explicitly.&lt;br /&gt;
&lt;br /&gt;
--[[User:KenRaeburn|KenRaeburn]] 19:51, 14 April 2008 (EDT)&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=User:KenRaeburn&amp;diff=306</id>
		<title>User:KenRaeburn</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=User:KenRaeburn&amp;diff=306"/>
				<updated>2008-04-10T01:22:09Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: New page: Ken Raeburn  MIT Kerberos Consortium  raeburn @ mit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ken Raeburn&lt;br /&gt;
&lt;br /&gt;
MIT Kerberos Consortium&lt;br /&gt;
&lt;br /&gt;
raeburn @ mit&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-02-04&amp;diff=176</id>
		<title>Release Meeting Minutes/2008-02-04</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes/2008-02-04&amp;diff=176"/>
				<updated>2008-02-04T23:02:41Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: minor correction to my comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Minutes of weekly release meeting for 2008-02-04:'''&lt;br /&gt;
&lt;br /&gt;
Will: Out sick last week.&lt;br /&gt;
&lt;br /&gt;
Tom: Who is up to date in Daptiv?&lt;br /&gt;
&lt;br /&gt;
Alexis: Up to date&lt;br /&gt;
&lt;br /&gt;
Ken: Behind, needs to fix timescales&lt;br /&gt;
&lt;br /&gt;
Kevin: Up to date&lt;br /&gt;
&lt;br /&gt;
Ken: Working on a lot of stuff unrelated to 1.7&lt;br /&gt;
&lt;br /&gt;
Tom: Should we add non-1.7 projects to make it easier to see who is doing what?&lt;br /&gt;
&lt;br /&gt;
Ken, Steve: Yes&lt;br /&gt;
&lt;br /&gt;
Tom: Trying to reproduce database corruption bug.  Partial progress.&lt;br /&gt;
&lt;br /&gt;
Will: Shawn Emery and Tom in communication about database corruption?&lt;br /&gt;
&lt;br /&gt;
Tom: Yes&lt;br /&gt;
&lt;br /&gt;
Will: Shawn had something that reproduces this?&lt;br /&gt;
&lt;br /&gt;
Tom: We have one test case which reproduces some of the corruption we've seen. Describes test case with a record split on index 0.&lt;br /&gt;
&lt;br /&gt;
Ken: Can we replace with a different database? SQLite plugin?&lt;br /&gt;
&lt;br /&gt;
Will: Sun looking into SQLite already.&lt;br /&gt;
&lt;br /&gt;
Ken: Believes SQLite license is sufficiently public domain for our purposes.  Apple also using SQLite.  Has heard concerns about SQLite being slower than Berkeley DB.&lt;br /&gt;
&lt;br /&gt;
Will: Would there be any problem with a plugin in MIT Kerberos for SQLite?&lt;br /&gt;
&lt;br /&gt;
Tom: Plugin isn't a problem for MIT.  Vendors might have an issue if we bundle SQLite with MIT Kerberos.  Would make sources considerably larger (1MB of sources).&lt;br /&gt;
&lt;br /&gt;
Ken: Could choose to not build it on platforms where SQLite libraries already exist.&lt;br /&gt;
&lt;br /&gt;
Will: Sun uses SQLite in some components.  Also just bought MySQL.  Thinks Nico uses SQLite.  Sun is interested in a more reliable and robust database backend than LDAP or Berkeley DB.&lt;br /&gt;
&lt;br /&gt;
Tom: Berkeley DB is well-tested and very mature.  Unfortunately 4.4 BSD had the last incarnation of Berkeley DB under a license we could use so we are using an old version.  MIT Kerberos will compile against more recent Berkeley DB versions.&lt;br /&gt;
&lt;br /&gt;
Ken: Tested Berkeley DB versions 3 and 4.&lt;br /&gt;
&lt;br /&gt;
Tom: No idea if anyone is using Kerberos with more recent versions of Berkeley DB.  However given the interest in SQLite we should bring it up to the board and try to find resources.&lt;br /&gt;
&lt;br /&gt;
Will: My manager may want me to switch to working on SQLite plugin instead of the enctype migration work.&lt;br /&gt;
&lt;br /&gt;
Steve: How is our work going?  Been working with Sun since October officially but seems like we aren't really getting to collaborate as much as we'd like.&lt;br /&gt;
&lt;br /&gt;
Will: Feel like I haven't gotten a chance to really work on the Consortium work due to hardware issues, holidays, illness, LDAP bugs, release requirements, etc.  Everything else was high priority.&lt;br /&gt;
&lt;br /&gt;
Steve: That's understandable.  Just want to flag that we've got a commitment from Sun for 6 months of 2 people at 25% time.  Don't want to get into a state where we save all the work until the end and then don't have reasonable projects or deadlines.  Even if this particular project isn't working we could use QA, testing infrastructure, new services (eg: OpenGrok), etc.  &lt;br /&gt;
&lt;br /&gt;
Will: Need to talk to manager about this.  &lt;br /&gt;
&lt;br /&gt;
Will: What is the project tracking system you are using?&lt;br /&gt;
&lt;br /&gt;
Steve: Daptiv PPM.  Is MIT's project tracking system.  Have getting Sun folks accounts as an action item.  Should be easy if you have an MIT account.&lt;br /&gt;
&lt;br /&gt;
Will: Yes I have an MIT account.  Do all board members get access to this?&lt;br /&gt;
&lt;br /&gt;
Steve: Any board members can get access to this, but I suspect most don't want that fine grained detail.  However since you're working so closely with us it should be useful to you.  &lt;br /&gt;
&lt;br /&gt;
Tom: Any other updates, issues, interesting developments?&lt;br /&gt;
&lt;br /&gt;
Alexis: CCAPI v2 needed for Windows.  Working on it.  Will delay other tasks by approximately a week.&lt;br /&gt;
&lt;br /&gt;
Kevin: Coverity Update.  Have access to web site and downloaded their tool.  Currently scanning krb5 sources and all other open source projects is done by one guy.  Trying to move to a model where the open source projects run the tools themselves, upload dump files to an ftp site and he will run the proprietary tools on them and post results.  Not currently automated, but working on that.  Analysis takes approximately twice as long as a build.&lt;br /&gt;
&lt;br /&gt;
Tom: What are the tool requirements?  OS?&lt;br /&gt;
&lt;br /&gt;
Kevin: Coverity wants to start with Linux first.  Need to be able to protect access to the tool.&lt;br /&gt;
&lt;br /&gt;
Ken: Can we talk about results of the tool output?  Can we publish our results?&lt;br /&gt;
&lt;br /&gt;
Steve: We should look at the license.&lt;br /&gt;
&lt;br /&gt;
Tom: Do we have licenses?&lt;br /&gt;
&lt;br /&gt;
Kevin: Haven't signed anything yet or received any formal notices.  Will look for READMEs in tool tarball.&lt;br /&gt;
&lt;br /&gt;
Steve: Would it be easier to use commercial project?&lt;br /&gt;
&lt;br /&gt;
Kevin: Commercial product is expensive.  Will investigate licensing of commercial product.  Would get both pieces of the tool and not have to deal with Coverity.&lt;br /&gt;
&lt;br /&gt;
Ken: Will help Kevin with linux build.&lt;br /&gt;
&lt;br /&gt;
Steve: Has anyone looked at the user manual posted to comp.protocols.kerberos?  &lt;br /&gt;
&lt;br /&gt;
Ken: Printed it but not read it.  About 40 pages.  There are similar how-to guides out there but this may be one of the larger ones I've seen.&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	<entry>
		<id>https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=172</id>
		<title>Release Meeting Minutes</title>
		<link rel="alternate" type="text/html" href="https://k5wiki.test.kerberos.org/wiki?title=Release_Meeting_Minutes&amp;diff=172"/>
				<updated>2008-02-04T17:55:27Z</updated>
		
		<summary type="html">&lt;p&gt;KenRaeburn: /* January 2008 */ add 28th&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Public minutes of Kerberos Consortium Release Meetings arranged in reverse chronological order:&lt;br /&gt;
&lt;br /&gt;
==January 2008==&lt;br /&gt;
[[Release Meeting Minutes/2008-01-28 |January 28, 2008 (2008-01-28)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2008-01-07 |January 7, 2008 (2008-01-07)]]&lt;br /&gt;
&lt;br /&gt;
==December 2007==&lt;br /&gt;
[[Release Meeting Minutes/2007-12-17|December 17, 2007 (2007-12-17)]]&lt;br /&gt;
&lt;br /&gt;
[[Release Meeting Minutes/2007-12-10|December 10, 2007 (2007-12-10)]]&lt;/div&gt;</summary>
		<author><name>KenRaeburn</name></author>	</entry>

	</feed>