* svc.c (xprt_register): Zero out xports after allocating
authorTom Yu <tlyu@mit.edu>
Tue, 15 Feb 2000 05:12:30 +0000 (05:12 +0000)
committerTom Yu <tlyu@mit.edu>
Tue, 15 Feb 2000 05:12:30 +0000 (05:12 +0000)
* auth_gssapi_misc.c (xdr_authgssapi_creds):
(xdr_authgssapi_init_arg):
(xdr_authgssapi_init_res):
(auth_gssapi_unwrap_data): If xdr_gss_buf or xdr_bytes fails, call
again with XDR_FREE set so that allocated memory doesn't leak.

git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@12041 dc483132-0cff-0310-8789-dd5450dbe970

src/lib/rpc/ChangeLog
src/lib/rpc/auth_gssapi_misc.c
src/lib/rpc/svc.c

index 77b0f06a0410fcd004df63e812066746cc23f8c1..9dca9664f9eced1daf2b8d556ba1018833d39871 100644 (file)
@@ -1,3 +1,13 @@
+2000-02-14  Tom Yu  <tlyu@mit.edu>
+
+       * svc.c (xprt_register): Zero out xports after allocating.
+
+       * auth_gssapi_misc.c (xdr_authgssapi_creds):
+       (xdr_authgssapi_init_arg): 
+       (xdr_authgssapi_init_res): 
+       (auth_gssapi_unwrap_data): If xdr_gss_buf or xdr_bytes fails, call
+       again with XDR_FREE set so that allocated memory doesn't leak.
+
 2000-01-24  Tom Yu  <tlyu@mit.edu>
 
        * get_myaddress.c (gssrpc_get_myaddress): Copy in from NetBSD;
index 818aaeb464d51d2565634ab9b3ba480b924d1226..4bc69117817a4766be2772c7d6165f3bfc9a1408 100644 (file)
@@ -49,9 +49,13 @@ bool_t xdr_authgssapi_creds(xdrs, creds)
    auth_gssapi_creds *creds;
 {
      if (! xdr_u_int32(xdrs, &creds->version) ||
-        ! xdr_bool(xdrs, &creds->auth_msg) ||
-        ! xdr_gss_buf(xdrs, &creds->client_handle))
-       return FALSE;
+        ! xdr_bool(xdrs, &creds->auth_msg))
+            return FALSE;
+     if (! xdr_gss_buf(xdrs, &creds->client_handle)) {
+            xdrs->x_op = XDR_FREE;
+            (void)xdr_gss_buf(xdrs, &creds->client_handle);
+            return FALSE;
+     }
      return TRUE;
 }
 
@@ -59,9 +63,13 @@ bool_t xdr_authgssapi_init_arg(xdrs, init_arg)
    XDR *xdrs;
    auth_gssapi_init_arg *init_arg;
 {
-     if (! xdr_u_int32(xdrs, &init_arg->version) ||
-        ! xdr_gss_buf(xdrs, &init_arg->token))
-         return FALSE;
+     if (! xdr_u_int32(xdrs, &init_arg->version))
+            return FALSE;
+     if (! xdr_gss_buf(xdrs, &init_arg->token)) {
+            xdrs->x_op = XDR_FREE;
+            (void)xdr_gss_buf(xdrs, &init_arg->token);
+            return FALSE;
+     }
      return TRUE;
 }
 
@@ -69,13 +77,26 @@ bool_t xdr_authgssapi_init_res(xdrs, init_res)
    XDR *xdrs;
    auth_gssapi_init_res *init_res;
 {
-     if (! xdr_u_int32(xdrs, &init_res->version) ||
-        ! xdr_gss_buf(xdrs, &init_res->client_handle) ||
-        ! xdr_u_int32(xdrs, &init_res->gss_major) ||
-        ! xdr_u_int32(xdrs, &init_res->gss_minor) ||
-        ! xdr_gss_buf(xdrs, &init_res->token) ||
-        ! xdr_gss_buf(xdrs, &init_res->signed_isn))
-         return FALSE;
+     if (! xdr_u_int32(xdrs, &init_res->version))
+            return FALSE;
+     if (! xdr_gss_buf(xdrs, &init_res->client_handle)) {
+            xdrs->x_op = XDR_FREE;
+            (void)xdr_gss_buf(xdrs, &init_res->client_handle);
+            return FALSE;
+     }
+     if (! xdr_u_int32(xdrs, &init_res->gss_major) ||
+        ! xdr_u_int32(xdrs, &init_res->gss_minor))
+            return FALSE;
+     if (! xdr_gss_buf(xdrs, &init_res->token)) {
+            xdrs->x_op =  XDR_FREE;
+            (void)xdr_gss_buf(xdrs, &init_res->token);
+            return FALSE;
+     }
+     if (! xdr_gss_buf(xdrs, &init_res->signed_isn)) {
+            xdrs->x_op = XDR_FREE;
+            (void)xdr_gss_buf(xdrs, &init_res->signed_isn);
+            return FALSE;
+     }
      return TRUE;
 }
 
@@ -264,11 +285,14 @@ bool_t auth_gssapi_unwrap_data(major, minor, context, seq_num,
      
      in_buf.value = NULL;
      out_buf.value = NULL;
-     
      if (! xdr_bytes(in_xdrs, (char **) &in_buf.value, 
                     (unsigned int *) &in_buf.length, (unsigned int) -1)) {
-         PRINTF(("gssapi_unwrap_data: deserializing encrypted data failed\n"));
-         return FALSE;
+        PRINTF(("gssapi_unwrap_data: deserializing encrypted data failed\n"));
+        in_xdrs->x_op = XDR_FREE;
+        (void)xdr_bytes(in_xdrs, (char **) &in_buf.value,
+                        (unsigned int *) &in_buf.length,
+                        (unsigned int) -1);
+        return FALSE;
      }
      
      *major = gss_unseal(minor, context, &in_buf, &out_buf, &conf,
index f38b0debc3a3d81caf41781d433597d0105ea1d5..3118df241c23d88671430fe8b2ef96cc1e1ffea8 100644 (file)
@@ -90,6 +90,7 @@ xprt_register(xprt)
        if (xports == NULL) {
                xports = (SVCXPRT **)
                        mem_alloc(FD_SETSIZE * sizeof(SVCXPRT *));
+               memset(xports, 0, FD_SETSIZE * sizeof(SVCXPRT *));
        }
        if (sock < _gssrpc_rpc_dtablesize()) {
                xports[sock] = xprt;