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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user