diff --git a/stagit.c b/stagit.c
@@ -499,10 +499,19 @@ void writefooter(FILE *fp)
/*
* Writes the raw contents of a blob in a file
*/
-int writeblobraw(const git_blob *blob, const char *fpath)
+ssize_t writeblobraw(const git_blob *blob, const char *fpath)
{
+ char tmp[PATH_MAX] = "", *d;
+
+ if (strlcpy(tmp, fpath, sizeof(tmp)) >= sizeof(tmp))
+ errx(1, "path truncated: '%s'", fpath);
+ if (!(d = dirname(tmp)))
+ err(1, "dirname");
+ if (mkdirp(d))
+ return -1;
+
int fd = open(fpath, O_CREAT);
- if (fd == -1) return 0;
+ if (fd == -1) return -1;
int len = git_blob_rawsize(blob);
const void *s = git_blob_rawcontent(blob);
@@ -919,7 +928,7 @@ size_t writeblob(git_object *obj, const char *fpath, const char *filename, size_
fp = efopen(fpath, "w");
writeheader(fp, filename);
- fprintf(fp, "<li><a href=\"%s/blob/%s\">raw file (blob)</a></li>", relpath, filename);
+ fprintf(fp, "<li><a href=\"%sblob/%s\">raw file (blob)</a></li>", relpath, filename);
fputs("</ul>\n", fp);
fputs("<div class=\"titled-block\">\n<h1>", fp);
xmlencode(fp, filename, strlen(filename));
@@ -1027,7 +1036,8 @@ int writefilestree(FILE *fp, git_tree *tree, const char *path)
filesize = git_blob_rawsize((git_blob *)obj);
lc = writeblob(obj, filepath, entryname, filesize);
- writeblobraw((git_blob *)obj, blobpath);
+ if (writeblobraw((git_blob *)obj, blobpath) < 0)
+ return 1;
fputs("<tr><td>", fp);
fputs(filemode(git_tree_entry_filemode(entry)), fp);