diff --git a/lustre/utils/llog_reader.c b/lustre/utils/llog_reader.c index 0df37e2dffb6d6eb10a3852a679d01c450dd45d3..d2f1f1a92e75c673aee9129c0a111d717b887995 100644 --- a/lustre/utils/llog_reader.c +++ b/lustre/utils/llog_reader.c @@ -366,6 +366,7 @@ void print_lustre_cfg(struct lustre_cfg *lcfg, int *skip) case(LCFG_MARKER):{ struct cfg_marker *marker = lustre_cfg_buf(lcfg, 1); char createtime[26], canceltime[26] = ""; + time_t time_tmp; if (marker->cm_flags & CM_SKIP) { if (marker->cm_flags & CM_START) { @@ -376,19 +377,39 @@ void print_lustre_cfg(struct lustre_cfg *lcfg, int *skip) *skip = 0; } } + if (marker->cm_flags & CM_EXCLUDE) { if (marker->cm_flags & CM_START) printf("EXCLUDE START "); else printf("EXCLUDE END "); } - ctime_r((time_t *)((char*)&marker->cm_createtime), createtime); - createtime[strlen(createtime) - 1] = 0; + + /* Handle overflow of 32-bit time_t gracefully. + * The copy to time_tmp is needed in any case to + * keep the pointer happy, even on 64-bit systems. */ + time_tmp = marker->cm_createtime; + if (time_tmp == marker->cm_createtime) { + ctime_r(&time_tmp, createtime); + createtime[strlen(createtime) - 1] = 0; + } else { + strcpy(createtime, "in the distant future"); + } + if (marker->cm_canceltime) { - ctime_r((time_t *)((char*)&marker->cm_canceltime), - canceltime); - canceltime[strlen(canceltime) - 1] = 0; + /* Like cm_createtime, we try to handle overflow of + * 32-bit time_t gracefully. The copy to time_tmp + * is also needed on 64-bit systems to keep the + * pointer happy, see bug 16771 */ + time_tmp = marker->cm_canceltime; + if (time_tmp == marker->cm_canceltime) { + ctime_r(&time_tmp, canceltime); + canceltime[strlen(canceltime) - 1] = 0; + } else { + strcpy(canceltime, "in the distant future"); + } } + printf("marker %3d (flags=%#04x, v%d.%d.%d.%d) %-15s '%s' %s-%s", marker->cm_step, marker->cm_flags, OBD_OCD_VERSION_MAJOR(marker->cm_vers),