xsparse dry runs should not create output

* scripts/xsparse.c (expand_sparse, main): Check for syscall
failure.  Do not create output file if a dry run.
This commit is contained in:
Paul Eggert
2024-08-02 21:58:53 -07:00
parent 44196e198f
commit 9cb1293628

View File

@@ -106,7 +106,7 @@ get_line (char *s, int size, FILE *stream)
die (1, "unexpected end of file"); die (1, "unexpected end of file");
len = strlen (p); len = strlen (p);
if (s[len - 1] != '\n') if (s[len - 1] != '\n')
die (1, "buffer overflow"); die (1, "invalid or too-long data");
s[len - 1] = '\0'; s[len - 1] = '\0';
} }
@@ -300,17 +300,25 @@ expand_sparse (FILE *sfp, int ofd)
off_t size = sparse_map[i].numbytes; off_t size = sparse_map[i].numbytes;
if (size == 0) if (size == 0)
ftruncate (ofd, sparse_map[i].offset); {
if (0 <= ofd && ftruncate (ofd, sparse_map[i].offset) < 0)
die (1, "ftruncate error (%d)", errno);
}
else else
{ {
lseek (ofd, sparse_map[i].offset, SEEK_SET); if (0 <= ofd && lseek (ofd, sparse_map[i].offset, SEEK_SET) < 0)
die (1, "lseek error (%d)", errno);
while (size) while (size)
{ {
size_t rdsize = (size < maxbytes) ? size : maxbytes; size_t rdsize = (size < maxbytes) ? size : maxbytes;
if (rdsize != fread (buffer, 1, rdsize, sfp)) if (rdsize != fread (buffer, 1, rdsize, sfp))
die (1, "read error (%d)", errno); die (1, "read error (%d)", errno);
if (rdsize != write (ofd, buffer, rdsize)) if (0 <= ofd)
die (1, "write error (%d)", errno); {
ssize_t written = write (ofd, buffer, rdsize);
if (written != rdsize)
die (1, "write error (%d)", written < 0 ? errno : 0);
}
size -= rdsize; size -= rdsize;
} }
} }
@@ -405,17 +413,15 @@ main (int argc, char **argv)
if (!outname) if (!outname)
guess_outname (inname); guess_outname (inname);
int ofd = open (outname, O_RDWR|O_CREAT|O_TRUNC, st.st_mode);
if (ofd < 0)
die (1, "cannot open file %s (%d)", outname, errno);
if (verbose) if (verbose)
printf ("Expanding file '%s' to '%s'\n", inname, outname); printf ("Expanding file '%s' to '%s'\n", inname, outname);
if (dry_run) int ofd = -1;
if (!dry_run)
{ {
printf ("Finished dry run\n"); ofd = open (outname, O_RDWR | O_CREAT | O_TRUNC, st.st_mode);
return 0; if (ofd < 0)
die (1, "cannot open file %s (%d)", outname, errno);
} }
expand_sparse (ifp, ofd); expand_sparse (ifp, ofd);
@@ -428,6 +434,12 @@ main (int argc, char **argv)
if (verbose) if (verbose)
printf ("Done\n"); printf ("Done\n");
if (dry_run)
{
printf ("Finished dry run\n");
return 0;
}
if (outsize) if (outsize)
{ {
if (stat (outname, &st) < 0) if (stat (outname, &st) < 0)