Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
Clean up some resouce leaks
Brad Davis committed 8 years ago
commit 90c379d109902b64d8ee79cc7b36ec938d6c9164
parent 8552aae
1 file changed +22 -8
modified libpkg/pkg_add.c
@@ -1273,6 +1273,7 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)

	while (pkg_dirs(pkg, &d) == EPKG_OK) {
		if (fstatat(fromfd, RELATIVE_PATH(d->path), &st, 0) == -1) {
+
			close(fromfd);
			pkg_fatal_errno("%s%s", src, d->path);
		}
		if (d->perm == 0)
@@ -1281,7 +1282,8 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			if (getpwnam_r(d->uname, &pwent, buffer, sizeof(buffer),
			    &pw) < 0) {
				pkg_emit_error("Unknown user: '%s'", d->uname);
-
				return (EPKG_FATAL);
+
				retcode = EPKG_FATAL;
+
				goto cleanup;
			}
			d->uid = pwent.pw_uid;
		} else {
@@ -1291,7 +1293,8 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			if (getgrnam_r(d->gname, &grent, buffer, sizeof(buffer),
			    &gr) < 0) {
				pkg_emit_error("Unknown group: '%s'", d->gname);
-
				return (EPKG_FATAL);
+
				retcode = EPKG_FATAL;
+
				goto cleanup;
			}
			d->gid = grent.gr_gid;
		} else {
@@ -1320,13 +1323,16 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
	while (pkg_files(pkg, &f) == EPKG_OK) {
		if (fstatat(fromfd, RELATIVE_PATH(f->path), &st,
		    AT_SYMLINK_NOFOLLOW) == -1) {
+
			kh_destroy_hls(hardlinks);
+
			close(fromfd);
			pkg_fatal_errno("%s%s", src, f->path);
		}
		if (f->uname[0] != '\0') {
			if (getpwnam_r(f->uname, &pwent, buffer, sizeof(buffer),
			    &pw) < 0) {
				pkg_emit_error("Unknown user: '%s'", f->uname);
-
				return (EPKG_FATAL);
+
				retcode = EPKG_FATAL;
+
				goto cleanup;
			}
			f->uid = pwent.pw_uid;
		} else {
@@ -1337,7 +1343,8 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			if (getgrnam_r(f->gname, &grent, buffer, sizeof(buffer),
			    &gr) < 0) {
				pkg_emit_error("Unknown group: '%s'", f->gname);
-
				return (EPKG_FATAL);
+
				retcode = EPKG_FATAL;
+
				goto cleanup;
			}
			f->gid = grent.gr_gid;
		} else {
@@ -1372,11 +1379,14 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			}
			target[link_len] = '\0';
			if (create_symlinks(pkg, f, target) == EPKG_FATAL) {
-
				return (EPKG_FATAL);
+
				retcode = EPKG_FATAL;
+
				goto cleanup;
			}
		} else if (S_ISREG(st.st_mode)) {
			if ((fd = openat(fromfd, RELATIVE_PATH(f->path),
			    O_RDONLY)) == -1) {
+
				kh_destroy_hls(hardlinks);
+
				close(fromfd);
				pkg_fatal_errno("Impossible to open source file"
				    " '%s'", RELATIVE_PATH(f->path));
			}
@@ -1384,12 +1394,14 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			if (path != NULL) {
				if (create_hardlink(pkg, f, path) == EPKG_FATAL) {
					close(fd);
-
					return (EPKG_FATAL);
+
					retcode = EPKG_FATAL;
+
					goto cleanup;
				}
			} else {
				if (create_regfile(pkg, f, NULL, NULL, fd, NULL) == EPKG_FATAL) {
					close(fd);
-
					return (EPKG_FATAL);
+
					retcode = EPKG_FATAL;
+
					goto cleanup;
				}
				kh_safe_add(hls, hardlinks, f->path, st.st_ino);
			}
@@ -1399,9 +1411,11 @@ pkg_add_fromdir(struct pkg *pkg, const char *src)
			return (EPKG_FATAL);
		}
	}
-
	kh_destroy_hls(hardlinks);

	retcode = pkg_extract_finalize(pkg);
+

+
cleanup:
+
	kh_destroy_hls(hardlinks);
	close(fromfd);
	return (retcode);
}