svn commit: r279962 - head/lib/libc/posix1e

Pedro F. Giffuni pfg at FreeBSD.org
Fri Mar 13 18:42:44 UTC 2015


Author: pfg
Date: Fri Mar 13 18:42:43 2015
New Revision: 279962
URL: https://svnweb.freebsd.org/changeset/base/279962

Log:
  libc: plug memory leaks in edge cases for the posix1e code.
  
  CID:	1016705
  CID:	1016706
  CID:	1016707
  
  Differential Revision:	https://reviews.freebsd.org/D2023

Modified:
  head/lib/libc/posix1e/acl_calc_mask.c
  head/lib/libc/posix1e/acl_strip.c

Modified: head/lib/libc/posix1e/acl_calc_mask.c
==============================================================================
--- head/lib/libc/posix1e/acl_calc_mask.c	Fri Mar 13 18:38:02 2015	(r279961)
+++ head/lib/libc/posix1e/acl_calc_mask.c	Fri Mar 13 18:42:43 2015	(r279962)
@@ -104,6 +104,7 @@ acl_calc_mask(acl_t *acl_p)
 		/* if no mask exists, check acl_cnt... */
 		if (acl_int_new->acl_cnt == ACL_MAX_ENTRIES) {
 			errno = ENOMEM;
+			acl_free(acl_new);
 			return (-1);
 		}
 		/* ...and add the mask entry */

Modified: head/lib/libc/posix1e/acl_strip.c
==============================================================================
--- head/lib/libc/posix1e/acl_strip.c	Fri Mar 13 18:38:02 2015	(r279961)
+++ head/lib/libc/posix1e/acl_strip.c	Fri Mar 13 18:42:43 2015	(r279962)
@@ -82,8 +82,10 @@ _posix1e_acl_strip_np(const acl_t aclp, 
 
 	have_mask_entry = 0;
 	acl_new = acl_init(ACL_MAX_ENTRIES);
-	if (acl_new == NULL)
+	if (acl_new == NULL) {
+		acl_free(acl_old);
 		return (NULL);
+	}
 	tag = ACL_UNDEFINED_TAG;
 
 	/* only save the default user/group/other entries */
@@ -94,16 +96,16 @@ _posix1e_acl_strip_np(const acl_t aclp, 
 		assert(_entry_brand(entry) == ACL_BRAND_POSIX);
 
 		if (acl_get_tag_type(entry, &tag) == -1)
-			return (NULL);
+			goto fail;
 
 		switch(tag) {
 		case ACL_USER_OBJ:
 		case ACL_GROUP_OBJ:
 		case ACL_OTHER:
 			if (acl_get_tag_type(entry, &tag) == -1)
-				return (NULL);
+				goto fail;
 			if (acl_get_permset(entry, &perm) == -1)
-				return (NULL);
+				goto fail;
 			if (acl_create_entry(&acl_new, &entry_new) == -1)
 				return (NULL);
 			if (acl_set_tag_type(entry_new, tag) == -1)
@@ -120,6 +122,10 @@ _posix1e_acl_strip_np(const acl_t aclp, 
 		default:
 			break;
 		}
+fail:
+	acl_free(acl_new);
+	acl_free(acl_old);
+	return (NULL);
 	}
 
 	assert(_acl_brand(acl_new) == ACL_BRAND_POSIX);


More information about the svn-src-all mailing list