svn rev #22302: trunk/src/lib/krb5/krb/

ghudson@MIT.EDU ghudson at MIT.EDU
Fri May 1 16:19:43 EDT 2009


http://src.mit.edu/fisheye/changelog/krb5/?cs=22302
Commit By: ghudson
Log Message:
Fix a memory leak by reorganizing krb5_principal_internalize to use
the recommended flow control for error handling.  Also initialize the
output parameter so that it is set in case of error.



Changed Files:
U   trunk/src/lib/krb5/krb/ser_princ.c
Modified: trunk/src/lib/krb5/krb/ser_princ.c
===================================================================
--- trunk/src/lib/krb5/krb/ser_princ.c	2009-05-01 20:11:01 UTC (rev 22301)
+++ trunk/src/lib/krb5/krb/ser_princ.c	2009-05-01 20:19:43 UTC (rev 22302)
@@ -125,50 +125,50 @@
 krb5_principal_internalize(krb5_context kcontext, krb5_pointer *argp, krb5_octet **buffer, size_t *lenremain)
 {
     krb5_error_code	kret;
-    krb5_principal	principal;
+    krb5_principal	principal = NULL;
     krb5_int32		ibuf;
     krb5_octet		*bp;
     size_t		remain;
-    char		*tmpname;
+    char		*tmpname = NULL;
 
+    *argp = NULL;
     bp = *buffer;
     remain = *lenremain;
-    kret = EINVAL;
+
     /* Read our magic number */
-    if (krb5_ser_unpack_int32(&ibuf, &bp, &remain))
-	ibuf = 0;
-    if (ibuf == KV5M_PRINCIPAL) {
-	kret = ENOMEM;
+    if (krb5_ser_unpack_int32(&ibuf, &bp, &remain) || ibuf != KV5M_PRINCIPAL)
+	return EINVAL;
 
-	/* See if we have enough data for the length */
-	if (!(kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain))) {
-	    /* Get the string */
-	    if ((tmpname = (char *) malloc((size_t) (ibuf+1))) &&
-		!(kret = krb5_ser_unpack_bytes((krb5_octet *) tmpname,
-					       (size_t) ibuf,
-					       &bp, &remain))) {
-		tmpname[ibuf] = '\0';
+    /* Read the principal name */
+    kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
+    if (kret)
+	return kret;
+    tmpname = malloc(ibuf + 1);
+    kret = krb5_ser_unpack_bytes((krb5_octet *) tmpname, (size_t) ibuf,
+				 &bp, &remain);
+    if (kret)
+	goto cleanup;
+    tmpname[ibuf] = '\0';
 
-		/* Parse the name to a principal structure */
-		principal = (krb5_principal) NULL;
-		kret = krb5_parse_name(kcontext, tmpname, &principal);
-		if (!kret) {
-		    kret = krb5_ser_unpack_int32(&ibuf, &bp, &remain);
-		    if (!kret && (ibuf == KV5M_PRINCIPAL)) {
-			*buffer = bp;
-			*lenremain = remain;
-			*argp = principal;
-		    }
-		    else
-			kret = EINVAL;
-		}
-		if (kret && principal)
-		    krb5_free_principal(kcontext, principal);
-		free(tmpname);
-	    }
-	}
+    /* Parse the name to a principal structure */
+    kret = krb5_parse_name(kcontext, tmpname, &principal);
+    if (kret)
+	goto cleanup;
+
+    /* Read the trailing magic number */
+    if (krb5_ser_unpack_int32(&ibuf, &bp, &remain) || ibuf != KV5M_PRINCIPAL) {
+	kret = EINVAL;
+	goto cleanup;
     }
-    return(kret);
+
+    *buffer = bp;
+    *lenremain = remain;
+    *argp = principal;
+cleanup:
+    if (kret)
+	krb5_free_principal(kcontext, principal);
+    free(tmpname);
+    return kret;
 }
 
 /*




More information about the cvs-krb5 mailing list