uint32_t jboot_timestamp(void)
{
- time_t rawtime;
- time(&rawtime);
- return (((uint32_t) rawtime) - TIMESTAMP_MAGIC) >> 2;
+ char *env = getenv("SOURCE_DATE_EPOCH");
+ char *endptr = env;
+ time_t fixed_timestamp = -1;
+ errno = 0;
+
+ if (env && *env) {
+ fixed_timestamp = strtoull(env, &endptr, 10);
+
+ if (errno || (endptr && *endptr != '\0')) {
+ fprintf(stderr, "Invalid SOURCE_DATE_EPOCH");
+ fixed_timestamp = -1;
+ }
+ }
+
+ if (fixed_timestamp == -1)
+ time(&fixed_timestamp);
+
+ return (((uint32_t) fixed_timestamp) - TIMESTAMP_MAGIC) >> 2;
}
uint16_t jboot_checksum(uint16_t start_val, uint16_t *data, int size)
{
FILE *f;
int ret = EXIT_FAILURE;
+ size_t read;
f = fopen(fdata->file_name, "r");
if (f == NULL) {
goto out;
}
- errno = 0;
- fread(buf, fdata->file_size, 1, f);
- if (errno != 0) {
+ read = fread(buf, fdata->file_size, 1, f);
+ if (ferror(f) || read != 1) {
ERRS("unable to read from file \"%s\"", fdata->file_name);
goto out_close;
}