The branch, v3-2-test has been updated
       via  bda8c0bf571c994b524a9d67eebc422033d17094 (commit)
      from  814daded90781dc5a5bdd522ea8cfe5d47e6d7a7 (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-test


- Log -----------------------------------------------------------------
commit bda8c0bf571c994b524a9d67eebc422033d17094
Author: Jeremy Allison <[EMAIL PROTECTED]>
Date:   Mon Oct 29 15:03:36 2007 -0700

    Fix the setup_kaddr() call to cope with IPv6.
    This is the last obvious change I can see. At
    this point we can start claiming IPv6 support
    (Hurrah !:-).
    Jeremy.

-----------------------------------------------------------------------

Summary of changes:
 source/include/includes.h  |    2 +-
 source/libads/krb5_setpw.c |   18 +++++++-----------
 source/libsmb/clikrb5.c    |   42 ++++++++++++++++++++++++++++++++++--------
 3 files changed, 42 insertions(+), 20 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source/include/includes.h b/source/include/includes.h
index fc9e43e..b9e7701 100644
--- a/source/include/includes.h
+++ b/source/include/includes.h
@@ -1123,7 +1123,7 @@ void krb5_free_unparsed_name(krb5_context ctx, char *val);
 #endif
 
 /* Samba wrapper function for krb5 functionality. */
-void setup_kaddr_v4( krb5_address *pkaddr, struct sockaddr *paddr);
+bool setup_kaddr( krb5_address *pkaddr, struct sockaddr_storage *paddr);
 int create_kerberos_key_from_string(krb5_context context, krb5_principal 
host_princ, krb5_data *password, krb5_keyblock *key, krb5_enctype enctype);
 int create_kerberos_key_from_string_direct(krb5_context context, 
krb5_principal host_princ, krb5_data *password, krb5_keyblock *key, 
krb5_enctype enctype);
 bool get_auth_data_from_tkt(TALLOC_CTX *mem_ctx, DATA_BLOB *auth_data, 
krb5_ticket *tkt);
diff --git a/source/libads/krb5_setpw.c b/source/libads/krb5_setpw.c
index 831a448..852251a 100644
--- a/source/libads/krb5_setpw.c
+++ b/source/libads/krb5_setpw.c
@@ -401,7 +401,7 @@ static ADS_STATUS do_krb5_kpasswd_request(krb5_context 
context,
        krb5_data ap_req, chpw_req, chpw_rep;
        int ret, sock;
        socklen_t addr_len;
-       struct sockaddr remote_addr, local_addr;
+       struct sockaddr_storage remote_addr, local_addr;
        struct sockaddr_storage addr;
        krb5_address local_kaddr, remote_kaddr;
        bool use_tcp = False;
@@ -438,15 +438,14 @@ static ADS_STATUS do_krb5_kpasswd_request(krb5_context 
context,
                        return ADS_ERROR_SYSTEM(rc);
                }
                addr_len = sizeof(remote_addr);
-               getpeername(sock, &remote_addr, &addr_len);
+               getpeername(sock, (struct sockaddr *)&remote_addr, &addr_len);
                addr_len = sizeof(local_addr);
-               getsockname(sock, &local_addr, &addr_len);
+               getsockname(sock, (struct sockaddr *)&local_addr, &addr_len);
 
-               /* FIXME ! How do we do IPv6 here ? JRA. */
-               if (remote_addr.sa_family != AF_INET ||
-                               local_addr.sa_family != AF_INET) {
+               if (!setup_kaddr(&remote_kaddr, &remote_addr) ||
+                               !setup_kaddr(&local_kaddr, &local_addr)) {
                        DEBUG(1,("do_krb5_kpasswd_request: "
-                               "no IPv6 support (yet).\n"));
+                               "Failed to setup addresses.\n"));
                        close(sock);
                        SAFE_FREE(ap_req.data);
                        krb5_auth_con_free(context, auth_context);
@@ -454,9 +453,6 @@ static ADS_STATUS do_krb5_kpasswd_request(krb5_context 
context,
                        return ADS_ERROR_SYSTEM(EINVAL);
                }
 
-               setup_kaddr_v4(&remote_kaddr, &remote_addr);
-               setup_kaddr_v4(&local_kaddr, &local_addr);
-       
                ret = krb5_auth_con_setaddrs(context, auth_context, 
&local_kaddr, NULL);
                if (ret) {
                        close(sock);
@@ -465,7 +461,7 @@ static ADS_STATUS do_krb5_kpasswd_request(krb5_context 
context,
                        DEBUG(1,("krb5_auth_con_setaddrs failed (%s)\n", 
error_message(ret)));
                        return ADS_ERROR_KRB5(ret);
                }
-       
+
                ret = build_kpasswd_request(pversion, context, auth_context, 
&ap_req,
                                          princ, newpw, use_tcp, &chpw_req);
                if (ret) {
diff --git a/source/libsmb/clikrb5.c b/source/libsmb/clikrb5.c
index fb25e9e..d996d61 100644
--- a/source/libsmb/clikrb5.c
+++ b/source/libsmb/clikrb5.c
@@ -162,19 +162,45 @@ static krb5_error_code 
smb_krb5_parse_name_norealm_conv(krb5_context context,
 
 #if defined(HAVE_ADDR_TYPE_IN_KRB5_ADDRESS)
 /* HEIMDAL */
- void setup_kaddr_v4( krb5_address *pkaddr, struct sockaddr *paddr)
+ bool setup_kaddr( krb5_address *pkaddr, struct sockaddr_storage *paddr)
 {
-       pkaddr->addr_type = KRB5_ADDRESS_INET;
-       pkaddr->address.length = sizeof(((struct sockaddr_in 
*)paddr)->sin_addr);
-       pkaddr->address.data = (char *)&(((struct sockaddr_in 
*)paddr)->sin_addr);
+       memset(pkaddr, '\0', sizeof(krb5_address));
+#if defined(HAVE_IPV6) && defined(KRB5_ADDRESS_INET6)
+       if (paddr->ss_family == AF_INET6) {
+               pkaddr->addr_type = KRB5_ADDRESS_INET6;
+               pkaddr->address.length = sizeof(((struct sockaddr_in6 
*)paddr)->sin6_addr);
+               pkaddr->address.data = (char *)&(((struct sockaddr_in6 
*)paddr)->sin6_addr);
+               return true;
+       }
+#endif
+       if (paddr->ss_family == AF_INET) {
+               pkaddr->addr_type = KRB5_ADDRESS_INET;
+               pkaddr->address.length = sizeof(((struct sockaddr_in 
*)paddr)->sin_addr);
+               pkaddr->address.data = (char *)&(((struct sockaddr_in 
*)paddr)->sin_addr);
+               return true;
+       }
+       return false;
 }
 #elif defined(HAVE_ADDRTYPE_IN_KRB5_ADDRESS)
 /* MIT */
- void setup_kaddr_v4( krb5_address *pkaddr, struct sockaddr *paddr)
+ bool setup_kaddr( krb5_address *pkaddr, struct sockaddr_storage *paddr)
 {
-       pkaddr->addrtype = ADDRTYPE_INET;
-       pkaddr->length = sizeof(((struct sockaddr_in *)paddr)->sin_addr);
-       pkaddr->contents = (krb5_octet *)&(((struct sockaddr_in 
*)paddr)->sin_addr);
+       memset(pkaddr, '\0', sizeof(krb5_address));
+#if defined(HAVE_IPV6) && defined(ADDRTYPE_INET6)
+       if (paddr->ss_family == AF_INET6) {
+               pkaddr->addrtype = ADDRTYPE_INET6;
+               pkaddr->length = sizeof(((struct sockaddr_in6 
*)paddr)->sin6_addr);
+               pkaddr->contents = (krb5_octet *)&(((struct sockaddr_in6 
*)paddr)->sin6_addr);
+               return true;
+       }
+#endif
+       if (paddr->ss_family == AF_INET) {
+               pkaddr->addrtype = ADDRTYPE_INET;
+               pkaddr->length = sizeof(((struct sockaddr_in 
*)paddr)->sin_addr);
+               pkaddr->contents = (krb5_octet *)&(((struct sockaddr_in 
*)paddr)->sin_addr);
+               return true;
+       }
+       return false;
 }
 #else
 #error UNKNOWN_ADDRTYPE


-- 
Samba Shared Repository

Reply via email to