/* * What value of "tz" was in effect back then at "time" in the * local timezone? */ static int local_tzoffset(timestamp_t time) { time_t t, t_local; struct tm tm; int offset, eastwest; if (date_overflows(time)) die("Timestamp too large for this system: %"PRItime, time); t = (time_t)time; localtime_r(&t, &tm); t_local = tm_to_time_t(&tm); if (t_local == -1) return 0; /* error; just use +0000 */ if (t_local < t) { eastwest = -1; offset = t - t_local; } else { eastwest = 1; offset = t_local - t; } offset /= 60; /* in minutes */ offset = (offset % 60) + ((offset / 60) * 100); return offset * eastwest; }
const char *show_ident_date(const struct ident_split *ident, enum date_mode mode) { unsigned long date = 0; long tz = 0; if (ident->date_begin && ident->date_end) date = strtoul(ident->date_begin, NULL, 10); if (date_overflows(date)) date = 0; else { if (ident->tz_begin && ident->tz_end) tz = strtol(ident->tz_begin, NULL, 10); if (tz >= INT_MAX || tz <= INT_MIN) tz = 0; } return show_date(date, tz, mode); }
const char *show_ident_date(const struct ident_split *ident, const struct date_mode *mode) { timestamp_t date = 0; long tz = 0; if (ident->date_begin && ident->date_end) date = parse_timestamp(ident->date_begin, NULL, 10); if (date_overflows(date)) date = 0; else { if (ident->tz_begin && ident->tz_end) tz = strtol(ident->tz_begin, NULL, 10); if (tz >= INT_MAX || tz <= INT_MIN) tz = 0; } return show_date(date, tz, mode); }
static int fsck_ident(const char **ident, struct object *obj, struct fsck_options *options) { const char *p = *ident; char *end; *ident = strchrnul(*ident, '\n'); if (**ident == '\n') (*ident)++; if (*p == '<') return report(options, obj, FSCK_MSG_MISSING_NAME_BEFORE_EMAIL, "invalid author/committer line - missing space before email"); p += strcspn(p, "<>\n"); if (*p == '>') return report(options, obj, FSCK_MSG_BAD_NAME, "invalid author/committer line - bad name"); if (*p != '<') return report(options, obj, FSCK_MSG_MISSING_EMAIL, "invalid author/committer line - missing email"); if (p[-1] != ' ') return report(options, obj, FSCK_MSG_MISSING_SPACE_BEFORE_EMAIL, "invalid author/committer line - missing space before email"); p++; p += strcspn(p, "<>\n"); if (*p != '>') return report(options, obj, FSCK_MSG_BAD_EMAIL, "invalid author/committer line - bad email"); p++; if (*p != ' ') return report(options, obj, FSCK_MSG_MISSING_SPACE_BEFORE_DATE, "invalid author/committer line - missing space before date"); p++; if (*p == '0' && p[1] != ' ') return report(options, obj, FSCK_MSG_ZERO_PADDED_DATE, "invalid author/committer line - zero-padded date"); if (date_overflows(strtoul(p, &end, 10))) return report(options, obj, FSCK_MSG_BAD_DATE_OVERFLOW, "invalid author/committer line - date causes integer overflow"); if ((end == p || *end != ' ')) return report(options, obj, FSCK_MSG_BAD_DATE, "invalid author/committer line - bad date"); p = end + 1; if ((*p != '+' && *p != '-') || !isdigit(p[1]) || !isdigit(p[2]) || !isdigit(p[3]) || !isdigit(p[4]) || (p[5] != '\n')) return report(options, obj, FSCK_MSG_BAD_TIMEZONE, "invalid author/committer line - bad time zone"); p += 6; return 0; }
static time_t gm_time_t(timestamp_t time, int tz) { int minutes; minutes = tz < 0 ? -tz : tz; minutes = (minutes / 100)*60 + (minutes % 100); minutes = tz < 0 ? -minutes : minutes; if (minutes > 0) { if (unsigned_add_overflows(time, minutes * 60)) die("Timestamp+tz too large: %"PRItime" +%04d", time, tz); } else if (time < -minutes * 60) die("Timestamp before Unix epoch: %"PRItime" %04d", time, tz); time += minutes * 60; if (date_overflows(time)) die("Timestamp too large for this system: %"PRItime, time); return (time_t)time; }
static int fsck_ident(char **ident, struct object *obj, fsck_error error_func) { char *end; if (**ident == '<') return error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before email"); *ident += strcspn(*ident, "<>\n"); if (**ident == '>') return error_func(obj, FSCK_ERROR, "invalid author/committer line - bad name"); if (**ident != '<') return error_func(obj, FSCK_ERROR, "invalid author/committer line - missing email"); if ((*ident)[-1] != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before email"); (*ident)++; *ident += strcspn(*ident, "<>\n"); if (**ident != '>') return error_func(obj, FSCK_ERROR, "invalid author/committer line - bad email"); (*ident)++; if (**ident != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - missing space before date"); (*ident)++; if (**ident == '0' && (*ident)[1] != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - zero-padded date"); if (date_overflows(strtoul(*ident, &end, 10))) return error_func(obj, FSCK_ERROR, "invalid author/committer line - date causes integer overflow"); if (end == *ident || *end != ' ') return error_func(obj, FSCK_ERROR, "invalid author/committer line - bad date"); *ident = end + 1; if ((**ident != '+' && **ident != '-') || !isdigit((*ident)[1]) || !isdigit((*ident)[2]) || !isdigit((*ident)[3]) || !isdigit((*ident)[4]) || ((*ident)[5] != '\n')) return error_func(obj, FSCK_ERROR, "invalid author/committer line - bad time zone"); (*ident) += 6; return 0; }