File librtas.fix_LE_parsing_of_SRC-FRU_events.patch of Package librtas.156
commit 52263814c46210b51e564748050299620726dfd1
Author: Nathan Fontenot <nfont@linux.vnet.ibm.com>
Date: Fri Oct 17 10:12:54 2014 -0400
Fix LE parsing of SRC/FRU events
Signed-off-by: Thomas L Falcon <tlfalcon@linux.vnet.ibm.com>
Signed-off-by: Suzuki K. Poulose <suzuki@in.ibm.com>
diff --git a/librtasevent_src/get_rtas_event.c b/librtasevent_src/get_rtas_event.c
index efd412f..3a5e034 100644
--- a/librtasevent_src/get_rtas_event.c
+++ b/librtasevent_src/get_rtas_event.c
@@ -336,12 +336,7 @@ parse_v6_rtas_event(struct rtas_event *re)
case RTAS_PSRC_SCN:
case RTAS_SSRC_SCN:
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- fprintf(stderr, "Parsing RTAS SRC Sections on little endian not supported\n");
- rc = -1;
-#else
rc = parse_src_scn(re);
-#endif
break;
case RTAS_HP_SCN:
diff --git a/librtasevent_src/rtas_srcfru.c b/librtasevent_src/rtas_srcfru.c
index 1fb1840..6ce9e76 100644
--- a/librtasevent_src/rtas_srcfru.c
+++ b/librtasevent_src/rtas_srcfru.c
@@ -56,7 +56,7 @@ parse_fru_id_scn(struct rtas_event *re)
memset(fru_id, 0, sizeof(*fru_id));
- fru_id_raw = (struct rtas_fru_id_scn_raw *)re->buffer + re->offset;
+ fru_id_raw = (struct rtas_fru_id_scn_raw *)(re->buffer + re->offset);
parse_fru_hdr(&fru_id->fruhdr, &fru_id_raw->fruhdr);
re->offset += RE_FRU_HDR_SZ;
@@ -105,7 +105,7 @@ parse_fru_pe_scn(struct rtas_event *re)
}
memset(fru_pe, 0, sizeof(*fru_pe));
- fru_pe_raw = (struct rtas_fru_pe_scn_raw *)re->buffer + re->offset;
+ fru_pe_raw = (struct rtas_fru_pe_scn_raw *)(re->buffer + re->offset);
parse_fru_hdr(&fru_pe->fruhdr, &fru_pe_raw->fruhdr);
re->offset += RE_FRU_HDR_SZ;
@@ -138,7 +138,7 @@ parse_fru_mr_scn(struct rtas_event *re)
}
memset(fru_mr, 0, sizeof(*fru_mr));
- fru_mr_raw = (struct rtas_fru_mr_scn_raw *)re->buffer + re->offset;
+ fru_mr_raw = (struct rtas_fru_mr_scn_raw *)(re->buffer + re->offset);
parse_fru_hdr(&fru_mr->fruhdr, &fru_mr_raw->fruhdr);
re->offset += RE_FRU_HDR_SZ;
@@ -186,17 +186,23 @@ parse_src_scn(struct rtas_event *re)
struct rtas_src_scn_raw *src_raw;
struct rtas_fru_scn *fru, *last_fru;
int total_len, srcsub_len;
-
src = malloc(sizeof(*src));
if (src == NULL) {
errno = ENOMEM;
return 1;
}
+
+ src_raw = malloc(sizeof(*src_raw));
+ if (src_raw == NULL) {
+ errno = ENOMEM;
+ return 1;
+ }
memset(src, 0, sizeof(*src));
+ memset(src_raw, 0, sizeof(*src_raw));
src->shdr.raw_offset = re->offset;
- src_raw = (struct rtas_src_scn_raw *)(re->buffer + re->offset);
+ rtas_copy(src_raw, re, RE_SRC_SCN_SZ);
parse_v6_hdr(&src->v6hdr, &src_raw->v6hdr);
src->version = src_raw->version;
@@ -216,16 +222,16 @@ parse_src_scn(struct rtas_event *re)
memcpy(&src->primary_refcode, &src_raw->primary_refcode,
sizeof(src->primary_refcode));
- re->offset += RE_SRC_SCN_SZ;
add_re_scn(re, src, re_scn_id(&src_raw->v6hdr));
if (!src_subscns_included(src))
return 0;
+ rtas_copy( (char *) src_raw + RE_SRC_SCN_SZ + 4, re, RE_SRC_SUBSCN_SZ);
+
src->subscn_id = src_raw->subscn_id;
src->subscn_platform_data = src_raw->subscn_platform_data;
src->subscn_length = be16toh(src_raw->subscn_length);
- re->offset += RE_SRC_SUBSCN_SZ;
srcsub_len = src->subscn_length * 4; /*get number of bytes */
total_len = RE_SRC_SUBSCN_SZ;
@@ -236,7 +242,6 @@ parse_src_scn(struct rtas_event *re)
uint32_t fru_len, fru_end;
struct rtas_fru_hdr *last_fruhdr = NULL;
struct rtas_fru_scn_raw *rawfru;
-
fru = malloc(sizeof(*fru));
if (fru == NULL) {
cleanup_rtas_event(re);
@@ -245,7 +250,7 @@ parse_src_scn(struct rtas_event *re)
}
memset(fru, 0, sizeof(*fru));
-
+
rawfru = (struct rtas_fru_scn_raw *)(re->buffer + re->offset);
parse_fru_scn(re, fru, rawfru);