
1 Sep
2011
1 Sep
'11
7:47 p.m.
On Thursday, September 01, 2011 11:57:09 David Wagner wrote:
- txt_filename = argv[optind];
- if (strcmp(txt_filename, "-") == 0) {
txt_fd = STDIN_FILENO;
- } else {
txt_fd = open(txt_filename, O_RDONLY);
if (txt_fd == -1) {
fprintf(stderr, "Can't open \"%s\": %s\n",
txt_filename, strerror(errno));
return EXIT_FAILURE;
}
- }
- /* ... and check it */
- ret = fstat(txt_fd, &txt_file_stat);
- if (ret == -1) {
fprintf(stderr, "Can't stat() on \"%s\": "
"%s\n", txt_filename, strerror(errno));
return EXIT_FAILURE;
- }
- /*
* The right test to do is "=>" (not ">") because of the additionnal
* ending \0. See below.
*/
- if (txt_file_stat.st_size >= envsize) {
fprintf(stderr, "The input file is larger than the "
"envrionnment partition size\n");
return EXIT_FAILURE;
- }
- /* Read the raw input file and transform it */
- filebuf = malloc(sizeof(*envptr) * txt_file_stat.st_size);
- ret = read(txt_fd, filebuf, sizeof(*envptr) * txt_file_stat.st_size);
- if (ret != txt_file_stat.st_size) {
fprintf(stderr, "Can't read the whole input file\n");
return EXIT_FAILURE;
- }
i think the stdin logic here is broken. when you fstat() stdin, you get back st_size == 0, and so you end up doing a read() on stdin of 0 bytes, and it writes out an empty image.
simple test: echo foo=var | ./mkenvimage -s 0x1000 -o foo - hexdump -C foo <see that the env is empty>
running it through strace shows the bum read(0, "", 0) ... -mike