summaryrefslogtreecommitdiffstats
path: root/bin/setfacl
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2008-09-06 13:17:35 +0000
committertrasz <trasz@FreeBSD.org>2008-09-06 13:17:35 +0000
commit009db84f9eb790dce9a050f9f399a74cc3a762a3 (patch)
tree872e6821e612b7c5016650c20bf214243b559e4b /bin/setfacl
parent7fd0635a3b8cd29194eddb931fc6f4752d8503df (diff)
downloadFreeBSD-src-009db84f9eb790dce9a050f9f399a74cc3a762a3.zip
FreeBSD-src-009db84f9eb790dce9a050f9f399a74cc3a762a3.tar.gz
Fix double free in setfacl(1). Description from the author:
Initially, 'acl' (an 'acl_t *') is allocated, and its ACCESS_ACL and DEFAULT_ACL fields are passed to the 'libc' ACL routines for subsequent allocation. If the '-m' option (merge existing ACL with a new one) is specified, then 'set_acl_mask()' will be called and passed one of the two ACLs. This function, in turn, replaces this given ACL structure by another, freshly allocated. However, the pointer in the 'acl' variable in the caller is not updated. The caller then proceeds to free the ACL, incurring in a double free condition. Submitted by: Pedro Martelletto <pedro at ambientworks.net> Approved by: rwatson (mentor)
Diffstat (limited to 'bin/setfacl')
-rw-r--r--bin/setfacl/setfacl.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/bin/setfacl/setfacl.c b/bin/setfacl/setfacl.c
index b86dbb1..2286efb 100644
--- a/bin/setfacl/setfacl.c
+++ b/bin/setfacl/setfacl.c
@@ -245,10 +245,13 @@ main(int argc, char *argv[])
continue;
}
- if (acl_type == ACL_TYPE_ACCESS)
+ if (acl_type == ACL_TYPE_ACCESS) {
final_acl = acl[ACCESS_ACL];
- else
+ acl_free(acl[DEFAULT_ACL]);
+ } else {
final_acl = acl[DEFAULT_ACL];
+ acl_free(acl[ACCESS_ACL]);
+ }
if (need_mask && (set_acl_mask(&final_acl) == -1)) {
warnx("failed to set ACL mask on %s", file->filename);
@@ -269,8 +272,7 @@ main(int argc, char *argv[])
}
}
- acl_free(acl[ACCESS_ACL]);
- acl_free(acl[DEFAULT_ACL]);
+ acl_free(final_acl);
free(acl);
}
OpenPOWER on IntegriCloud