[Crash-utility] [PATCH 04/11] sadump, bug: time stamp values displayed are same
HATAYAMA Daisuke
d.hatayama at jp.fujitsu.com
Thu Oct 20 10:42:33 UTC 2011
The bug happens, for example, in the following:
printf("%s%s\n", (efi_time_t_to_tm(buf), efi_time_t_to_tm(buf)));
where efi_time_t_to_tm() returns a pointer to buf, the address of the
buffer passed to in the first argument. Obviously, the second call
overwrites the result of the first call.
It's dull to prepare a buffer for each function call, so I avoid this
simply by calling printf() for each efi_time_to_tm() call:
printf("%s", efi_time_t_to_tm(buf));
printf("%s\n", efi_time_t_to_tm(buf));
When the second call overwrites the result of the first call, printf()
has already finished displaying it.
Also I change efi_time_t_to_tm() so that it uses local buffer. It's
safe if following the above use.
Signed-off-by: HATAYAMA Daisuke <d.hatayama at jp.fujitsu.com>
---
sadump.c | 76 +++++++++++++++++++++++++++++++-------------------------------
1 files changed, 38 insertions(+), 38 deletions(-)
-------------- next part --------------
diff --git a/sadump.c b/sadump.c
index 490eb6c..92573bf 100644
--- a/sadump.c
+++ b/sadump.c
@@ -37,7 +37,7 @@ static inline int is_set_bit(char *bitmap, ulong pfn);
static inline int page_is_ram(unsigned int nr);
static inline int page_is_dumpable(unsigned int nr);
static int lookup_diskset(ulong whole_offset, int *diskid, ulong *disk_offset);
-static struct tm *efi_time_t_to_tm(const efi_time_t *e, struct tm *t);
+static struct tm *efi_time_t_to_tm(const efi_time_t *e);
static char * guid_to_str(efi_guid_t *guid, char *buf, size_t buflen);
static int verify_magic_number(uint32_t magicnum[DUMP_PART_HEADER_MAGICNUM_SIZE]);
static ulong per_cpu_ptr(ulong ptr, int cpu);
@@ -279,19 +279,17 @@ restart:
if (memcmp(&sph->time_stamp, &smh->time_stamp,
sizeof(efi_time_t)) != 0) {
- struct tm tm;
- if (CRASHDEBUG(1))
- error(INFO, "sadump: time stamp mismatch\n"
- " partition header: %s\n"
- " media header: %s\n",
+ if (CRASHDEBUG(1)) {
+ error(INFO, "sadump: time stamp mismatch\n");
+ error(INFO, "sadump: partition header: %s\n",
strip_linefeeds(asctime
(efi_time_t_to_tm
- (&sph->time_stamp,
- &tm))),
+ (&sph->time_stamp))));
+ error(INFO, "sadump: media header: %s\n",
strip_linefeeds(asctime
(efi_time_t_to_tm
- (&smh->time_stamp,
- &tm))));
+ (&smh->time_stamp))));
+ }
goto err;
}
@@ -538,18 +536,20 @@ add_disk(char *file)
if (memcmp(&sd->header->time_stamp, &ph->time_stamp,
sizeof(efi_time_t)) != 0) {
- struct tm tm;
- if (CRASHDEBUG(1))
- error(INFO, "sadump: time stamp mismatch\n"
- " partition header on disk #1: %s\n"
- " partition header on disk #%d: %s\n",
- strip_linefeeds(asctime(efi_time_t_to_tm
- (&sd->header->time_stamp,
- &tm))),
+ if (CRASHDEBUG(1)) {
+ error(INFO, "sadump: time stamp mismatch\n");
+ error(INFO,
+ "sadump: partition header on disk #1: %s\n",
+ strip_linefeeds(asctime
+ (efi_time_t_to_tm
+ (&sd->header->time_stamp))));
+ error(INFO,
+ "sadump: partition header on disk #%d: %s\n",
diskid+1,
- strip_linefeeds(asctime(efi_time_t_to_tm
- (&ph->time_stamp,
- &tm))));
+ strip_linefeeds(asctime
+ (efi_time_t_to_tm
+ (&ph->time_stamp))));
+ }
free(ph);
return FALSE;
}
@@ -794,30 +794,31 @@ ulong get_sadump_switch_stack(ulong task)
}
static struct tm *
-efi_time_t_to_tm(const efi_time_t *e, struct tm *t)
+efi_time_t_to_tm(const efi_time_t *e)
{
+ static struct tm t;
time_t ti;
- memset(t, 0, sizeof(*t));
+ memset(&t, 0, sizeof(t));
- t->tm_sec = e->second;
- t->tm_min = e->minute;
- t->tm_hour = e->hour;
- t->tm_mday = e->day;
- t->tm_mon = e->month - 1;
- t->tm_year = e->year - 1900;
+ t.tm_sec = e->second;
+ t.tm_min = e->minute;
+ t.tm_hour = e->hour;
+ t.tm_mday = e->day;
+ t.tm_mon = e->month - 1;
+ t.tm_year = e->year - 1900;
if (e->timezone != EFI_UNSPECIFIED_TIMEZONE)
- t->tm_hour += e->timezone;
+ t.tm_hour += e->timezone;
else if (CRASHDEBUG(1))
error(INFO, "sadump: timezone information is missing\n");
- ti = mktime(t);
+ ti = mktime(&t);
if (ti == (time_t)-1)
- return t;
+ return &t;
- return localtime_r(&ti, t);
+ return localtime_r(&ti, &t);
}
static char *
@@ -867,7 +868,6 @@ int sadump_memory_dump(FILE *fp)
struct sadump_header *sh;
struct sadump_media_header *smh;
int i, others;
- struct tm tm;
char guid[33];
fprintf(fp, "sadump_data: \n");
@@ -908,7 +908,7 @@ int sadump_memory_dump(FILE *fp)
fprintf(fp, " disk_set_id: %s\n", guid_to_str(&sph->disk_set_id, guid, sizeof(guid)));
fprintf(fp, " vol_id: %s\n", guid_to_str(&sph->vol_id, guid, sizeof(guid)));
fprintf(fp, " time_stamp: %s\n",
- strip_linefeeds(asctime(efi_time_t_to_tm(&sph->time_stamp, &tm))));
+ strip_linefeeds(asctime(efi_time_t_to_tm(&sph->time_stamp))));
fprintf(fp, " set_disk_set: %u\n", sph->set_disk_set);
fprintf(fp, " reserve: %u\n", sph->reserve);
fprintf(fp, " used_device: %llu\n", (ulonglong)sph->used_device);
@@ -922,7 +922,7 @@ int sadump_memory_dump(FILE *fp)
fprintf(fp, " header_version: %u\n", sh->header_version);
fprintf(fp, " reserve: %u\n", sh->reserve);
fprintf(fp, " timestamp: %s\n",
- strip_linefeeds(asctime(efi_time_t_to_tm(&sh->timestamp, &tm))));
+ strip_linefeeds(asctime(efi_time_t_to_tm(&sh->timestamp))));
fprintf(fp, " status: %u\n", sh->status);
fprintf(fp, " compress: %u\n", sh->compress);
fprintf(fp, " block_size: %u\n", sh->block_size);
@@ -998,7 +998,7 @@ int sadump_memory_dump(FILE *fp)
fprintf(fp, "\n sadump_id: %s\n", guid_to_str(&smh->sadump_id, guid, sizeof(guid)));
fprintf(fp, " disk_set_id: %s\n", guid_to_str(&smh->disk_set_id, guid, sizeof(guid)));
fprintf(fp, " time_stamp: %s\n",
- strip_linefeeds(asctime(efi_time_t_to_tm(&smh->time_stamp, &tm))));
+ strip_linefeeds(asctime(efi_time_t_to_tm(&smh->time_stamp))));
fprintf(fp, " sequential_num: %d\n", smh->sequential_num);
fprintf(fp, " term_cord: %d\n", smh->term_cord);
fprintf(fp, "disk_set_header_size: %d\n", smh->disk_set_header_size);
@@ -1039,7 +1039,7 @@ int sadump_memory_dump(FILE *fp)
fprintf(fp, " disk_set_id: %s\n", guid_to_str(&sph->disk_set_id, guid, sizeof(guid)));
fprintf(fp, " vol_id: %s\n", guid_to_str(&sph->vol_id, guid, sizeof(guid)));
fprintf(fp, " time_stamp: %s\n",
- strip_linefeeds(asctime(efi_time_t_to_tm(&sph->time_stamp, &tm))));
+ strip_linefeeds(asctime(efi_time_t_to_tm(&sph->time_stamp))));
fprintf(fp, " set_disk_set: %u\n", sph->set_disk_set);
fprintf(fp, " reserve: %u\n", sph->reserve);
fprintf(fp, " used_device: %llu\n", (ulonglong)sph->used_device);
More information about the Crash-utility
mailing list