In particular, when asked to read an empty file, this function
calls malloc() with a zero size allocation request. Standard C
says that the behaviour of malloc() in this case is implementation
defined.
[C99, 7.20.3 says "... If the size of the space requested is zero,
the behavior is implementation-defined: either a null pointer is
returned, or the behavior is as if the size were some nonzero
value, except that the returned pointer shall not be used to
access an object."]
Finesse the issue by over-allocating by one byte. Setting the extra
byte to '\0' may also provide a useful sentinel for text files.
Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
{
git_file fd;
off_t len;
- void *buff;
+ unsigned char *buff;
assert(obj && path && *path);
if ((fd = gitfo_open(path, O_RDONLY)) < 0)
return GIT_ERROR; /* TODO: error handling */
- if (((len = gitfo_size(fd)) < 0) || ((buff = malloc(len)) == NULL)) {
+ if (((len = gitfo_size(fd)) < 0) || ((buff = malloc(len+1)) == NULL)) {
gitfo_close(fd);
return GIT_ERROR; /* TODO: error handling */
}
free(buff);
return GIT_ERROR; /* TODO: error handling */
}
+ buff[len] = '\0';
gitfo_close(fd);