Re-calculate size and digestresult after stripping, to ensure that

correct values appear in the metalog.
This commit is contained in:
apb 2009-04-17 06:09:08 +00:00
parent f7271183be
commit 7097476cb5
1 changed files with 28 additions and 12 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: xinstall.c,v 1.107 2009/04/14 08:54:59 lukem Exp $ */
/* $NetBSD: xinstall.c,v 1.108 2009/04/17 06:09:08 apb Exp $ */
/*
* Copyright (c) 1987, 1993
@ -46,7 +46,7 @@ __COPYRIGHT("@(#) Copyright (c) 1987, 1993\
#if 0
static char sccsid[] = "@(#)xinstall.c 8.1 (Berkeley) 7/21/93";
#else
__RCSID("$NetBSD: xinstall.c,v 1.107 2009/04/14 08:54:59 lukem Exp $");
__RCSID("$NetBSD: xinstall.c,v 1.108 2009/04/17 06:09:08 apb Exp $");
#endif
#endif /* not lint */
@ -594,17 +594,18 @@ void
install(char *from_name, char *to_name, u_int flags)
{
struct stat from_sb;
#if ! HAVE_NBTOOL_CONFIG_H
struct stat to_sb;
#endif
struct timeval tv[2];
off_t size;
int devnull, from_fd, to_fd, serrno, tmpmode;
char *p, tmpl[MAXPATHLEN], *oto_name, *digestresult;
size = -1;
if (!dolink) {
/* ensure that from_sb & tv are sane if !dolink */
if (stat(from_name, &from_sb))
err(1, "%s: stat", from_name);
size = from_sb.st_size;
#if BSD4_4 && !HAVE_NBTOOL_CONFIG_H
TIMESPEC_TO_TIMEVAL(&tv[0], &from_sb.st_atimespec);
TIMESPEC_TO_TIMEVAL(&tv[1], &from_sb.st_mtimespec);
@ -616,7 +617,8 @@ install(char *from_name, char *to_name, u_int flags)
#endif
}
if (flags & DIRECTORY || strcmp(from_name, _PATH_DEVNULL)) {
if (flags & DIRECTORY || strcmp(from_name, _PATH_DEVNULL) != 0) {
devnull = 0;
if (!dolink) {
if (!S_ISREG(from_sb.st_mode))
errx(1, "%s: not a regular file", from_name);
@ -628,12 +630,12 @@ install(char *from_name, char *to_name, u_int flags)
(p = strrchr(from_name, '/')) ? ++p : from_name);
to_name = pathbuf;
}
devnull = 0;
} else {
devnull = 1;
size = 0;
#if HAVE_STRUCT_STAT_ST_FLAGS
from_sb.st_flags = 0; /* XXX */
#endif
devnull = 1;
}
/*
@ -694,6 +696,16 @@ install(char *from_name, char *to_name, u_int flags)
close(to_fd);
if ((to_fd = open(to_name, O_RDONLY, S_IRUSR | S_IWUSR)) < 0)
err(1, "stripping %s", to_name);
/*
* Recalculate size and digestresult after stripping.
*/
if (fstat(to_fd, &to_sb) != 0)
err(1, "%s: fstat", to_name);
size = to_sb.st_size;
digestresult =
copy(to_fd, to_name, -1, NULL, size);
}
if (afterinstallcmd != NULL) {
@ -761,14 +773,15 @@ install(char *from_name, char *to_name, u_int flags)
}
#endif
metadata_log(to_name, "file", tv, NULL, digestresult,
(devnull ? 0 : from_sb.st_size));
metadata_log(to_name, "file", tv, NULL, digestresult, size);
free(digestresult);
}
/*
* copy --
* copy from one file to another
* copy from one file to another, returning a digest.
*
* If to_fd < 0, just calculate a digest, don't copy.
*/
char *
copy(int from_fd, char *from_name, int to_fd, char *to_name, off_t size)
@ -792,6 +805,8 @@ copy(int from_fd, char *from_name, int to_fd, char *to_name, off_t size)
SHA1Init(&ctxSHA1);
break;
case DIGEST_NONE:
if (to_fd < 0)
return NULL; /* no need to do anything */
default:
break;
}
@ -819,7 +834,7 @@ copy(int from_fd, char *from_name, int to_fd, char *to_name, off_t size)
warnx("madvise: %s", strerror(errno));
#endif
if (write(to_fd, p, size) != size) {
if (to_fd >= 0 && write(to_fd, p, size) != size) {
serrno = errno;
(void)unlink(to_name);
errx(1, "%s: write: %s",
@ -842,7 +857,8 @@ copy(int from_fd, char *from_name, int to_fd, char *to_name, off_t size)
} else {
mmap_failed:
while ((nr = read(from_fd, buf, sizeof(buf))) > 0) {
if ((nw = write(to_fd, buf, nr)) != nr) {
if (to_fd >= 0 &&
(nw = write(to_fd, buf, nr)) != nr) {
serrno = errno;
(void)unlink(to_name);
errx(1, "%s: write: %s", to_name,