From owner-svn-soc-all@FreeBSD.ORG Fri May 25 14:19:38 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id 44D54106564A for ; Fri, 25 May 2012 14:19:36 +0000 (UTC) (envelope-from gpf@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Fri, 25 May 2012 14:19:36 +0000 Date: Fri, 25 May 2012 14:19:36 +0000 From: gpf@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120525141936.44D54106564A@hub.freebsd.org> Cc: Subject: socsvn commit: r236386 - soc2012/gpf/pefs_kmod/sbin/pefs X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 25 May 2012 14:19:38 -0000 Author: gpf Date: Fri May 25 14:19:35 2012 New Revision: 236386 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=236386 Log: free dynamic memory Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c ============================================================================== --- soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Fri May 25 11:14:08 2012 (r236385) +++ soc2012/gpf/pefs_kmod/sbin/pefs/pefs_checksum.c Fri May 25 14:19:35 2012 (r236386) @@ -139,6 +139,7 @@ csp->hash = malloc(hash_len); if (csp->hash == NULL) { pefs_warn("memory allocation error"); + free(csp); close(fd); return (PEFS_ERR_SYS); } @@ -182,6 +183,14 @@ return (0); } +static void +pefs_init_hash_table(struct hash_table *checksum_hash_tablep) +{ + checksum_hash_tablep->size = 0; + checksum_hash_tablep->nelements = 0; + checksum_hash_tablep->buckets = NULL; +} + static int pefs_allocate_hash_table(struct hash_table *checksum_hash_tablep, uint32_t nelements) { @@ -207,6 +216,32 @@ return (0); } +static void +pefs_free_hash_table(struct hash_table *checksum_hash_tablep) +{ + struct bucket *bp; + struct file_header *fhp, *tfhp; + struct checksum *csp, *tcsp; + uint32_t i; + + if (checksum_hash_tablep->buckets != NULL) { + for (i = 0; i < checksum_hash_tablep->size; i++) { + bp = &checksum_hash_tablep->buckets[i]; + LIST_FOREACH_SAFE(fhp, &(bp->file_headers), bucket_entries, tfhp) { + TAILQ_FOREACH_SAFE(csp, &(fhp->checksums), checksum_entries, tcsp) { + TAILQ_REMOVE(&(fhp->checksums), csp, checksum_entries); + if (csp->hash != NULL) + free(csp->hash); + free(csp); + } + LIST_REMOVE(fhp, bucket_entries); + free(fhp); + } + } + free(checksum_hash_tablep->buckets); + } +} + static int pefs_add_to_bucket(struct bucket *bucketp, struct file_header *fhp) { @@ -665,6 +700,7 @@ * XXXgpf: [TODO] If pefs fs is mounted when .pefs.checksum is created, then it will obtain an * encrypted filename & encrypted data. I should make sure that checksum file is not being * opened inside a mounted pefs filesystem. + * pefs_open_checksum_file() */ fdout = open(checksum_path, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR); if (fdout == -1) { @@ -672,6 +708,8 @@ return (PEFS_ERR_IO); } + pefs_init_hash_table(&checksum_hash_table); + error = pefs_create_in_memory_db(fpin, md, hash_len, &checksum_hash_table, fsroot); if (error != 0) @@ -682,10 +720,11 @@ error = pefs_write_checksum_file(fdout, &cfh, &checksum_hash_table); out: - close(fdout); + if (fdout >= 0) + close(fdout); if (error != 0) unlink(checksum_path); - /* XXXgpf: [TODO] free dynamic memory */ + pefs_free_hash_table(&checksum_hash_table); return (error); } Modified: soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c ============================================================================== --- soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c Fri May 25 11:14:08 2012 (r236385) +++ soc2012/gpf/pefs_kmod/sbin/pefs/pefs_ctl.c Fri May 25 14:19:35 2012 (r236386) @@ -1051,18 +1051,23 @@ if (j == PEFS_SUPPORTED_DIGESTS) { pefs_warn("invalid digestname: %s", optarg); - return (PEFS_ERR_INVALID); + error = PEFS_ERR_INVALID; + goto out; } break; case 'i': fpin = fopen(optarg, "r"); if (fpin == NULL) { warn("cannot open inputfile: %s", optarg); - return (PEFS_ERR_INVALID); + error = PEFS_ERR_INVALID; + goto out; } break; default: + if (fpin != NULL) + fclose(fpin); pefs_usage(); + break; } argc -= optind; argv += optind; @@ -1076,7 +1081,9 @@ error = pefs_create_checksum_file(fpin, fsroot, algo); - fclose(fpin); +out: + if (fpin != NULL) + fclose(fpin); return (error); }