Previous versions were not setting the file_offset properly if a Custom
board type was found, which would prevent subsequent dissectors from
operating properly and terminating the output of 'ipmitool ekanalyze
frushow oc=<atca carrier fruinfo>' early.

Rewrote ipmi_ek_display_board_info_area() to fix indentation and
to properly set the file_offset and end the while loop if a Custom
board_type was found.

Previous versions were also abusing the board_length variable,
treating it as an int and using it to break out of the loop.

Signed-off-by: Dan Gora <d...@adax.com>
---
 ipmitool/lib/ipmi_ekanalyzer.c |  180 ++++++++++++++++++++-------------------
 1 files changed, 92 insertions(+), 88 deletions(-)

diff --git a/ipmitool/lib/ipmi_ekanalyzer.c b/ipmitool/lib/ipmi_ekanalyzer.c
index b1c5cb2..2fcf4e5 100644
--- a/ipmitool/lib/ipmi_ekanalyzer.c
+++ b/ipmitool/lib/ipmi_ekanalyzer.c
@@ -2611,98 +2611,102 @@ static size_t
 ipmi_ek_display_board_info_area( FILE * input_file, char * board_type,
       unsigned int * board_length )
 {
-   size_t file_offset = ftell (input_file);
-   unsigned char len = 0;
-   /* Board length*/
-   if ( !feof(input_file) ){
-      fread ( &len, 1, 1, input_file );
-      (*board_length)--;
-   }
-   /* Board Data */
-   if ( !feof(input_file) ){
-      unsigned int size_board = 0;
+       size_t file_offset = ftell (input_file);
+       unsigned char len = 0;
+       unsigned int size_board = 0;
 
-      /*Bit 5:0 of Board Mfg type represent legnth*/
-      size_board = (len & 0x3f);
-      if (size_board > 0){
-         if ( strncmp( board_type, "Custom", 6 ) == 0 ){
-            #define NO_MORE_INFO_FIELD         0xc1
-            while ( !feof(input_file) && (board_length > 0) ){
-               if (len != NO_MORE_INFO_FIELD){
-                  printf("Additional Custom Mfg. length: 0x%02x\n", len);
-                  if ( (size_board > 0) && (size_board < (*board_length)) ){
-                     unsigned char * additional_data = NULL;
-                     int i=0;
-                     additional_data = malloc (size_board);
-                     if (additional_data != NULL){
-                        fread ( additional_data, size_board, 1, input_file );
-                        printf("Additional Custom Mfg. Data: %02x",
-                                       additional_data[0]);
-                        for ( i =1; i<size_board; i++){
-                           printf("-%02x", additional_data[i]);
-                        }
-                        printf("\n");
-                        free (additional_data);
-                        (*board_length) -= size_board;
-                     }
-                  }
-                  else{
-                     printf("No Additional Custom Mfg. %d\n", *board_length);
-                     board_length = 0;
-                  }
-               }
-               else{
-                  unsigned char padding;
-                  /*take the rest of data in the area minus 1 byte of 
checksum*/
-                  printf("Additional Custom Mfg. length: 0x%02x\n", len);
-                  padding = (*board_length) - 1;
-                  /*we reach the end of the record, so its length is set to 0*/
-                  board_length = 0;
-                  if ( ( padding > 0 ) && ( !feof(input_file) ) ){
-                     printf("Unused space: %d (bytes)\n", padding);
-                     fseek (input_file, padding, SEEK_CUR);
-                  }
-                  if ( !feof(input_file) ){
-                     unsigned char checksum = 0;
-                     fread ( &checksum, 1, 1, input_file );
-                     printf("Checksum: 0x%02x\n", checksum);
+       /* Board length*/
+       if ( !feof(input_file) ){
+               fread ( &len, 1, 1, input_file );
+               (*board_length)--;
+       }
+       /* Board Data */
+       if ( feof(input_file) ) {
+               printf("No Board Data found!\n");
+               goto out;
+       }
 
-                  }
-               }
-            }
-         }
-         else{
-            unsigned char * data;
-            unsigned int i=0;
-            #define TYPE_CODE 0xc0 /*Language code*/
+       /*Bit 5:0 of Board Mfg type represent legnth*/
+       size_board = (len & 0x3f);
+       if (size_board == 0) {
+               printf("%s: None\n", board_type);
+               goto out;
+       }
 
-            data = malloc (size_board);
-            fread ( data, size_board, 1, input_file );
-            printf("%s type: 0x%02x\n", board_type, len);
-            printf("%s: ", board_type);
-            for ( i = 0; i < size_board; i++ ){
-               if ( (len & TYPE_CODE) == TYPE_CODE ){
-                  printf("%c", data[i]);
-               }
-               /*other than language code (binary, BCD, ASCII 6 bit...) is not
-               * supported */
-               else{
-                  printf("%02x", data[i]);
-               }
-            }
-            printf("\n");
-            free (data);
-            (*board_length) -= size_board;
-            file_offset = ftell (input_file);
-         }
-      }
-      else{
-         printf("%s: None\n", board_type);
-         file_offset = ftell (input_file);
-      }
-   }
+       if ( strncmp( board_type, "Custom", 6 ) != 0 ) {
+               unsigned char *data;
+               unsigned int i=0;
+#define TYPE_CODE 0xc0 /*Language code*/
+
+               data = malloc (size_board);
+               fread ( data, size_board, 1, input_file );
+               printf("%s type: 0x%02x\n", board_type, len);
+               printf("%s: ", board_type);
+               for ( i = 0; i < size_board; i++ ) {
+                       if ( (len & TYPE_CODE) == TYPE_CODE ){
+                               printf("%c", data[i]);
+                       }
+                       /*other than language code (binary, BCD, 
+                        * ASCII 6 bit...) is not supported */
+                       else {
+                               printf("%02x", data[i]);
+                       }
+               }
+               printf("\n");
+               free (data);
+               (*board_length) -= size_board;
+               goto out;
+       }
+#define NO_MORE_INFO_FIELD         0xc1
+       while ( !feof(input_file) ) {
+               if (len == NO_MORE_INFO_FIELD) {
+                       unsigned char padding;
+                       /* take the rest of data in the area minus 1 byte of 
+                        * checksum*/
+                       printf("Additional Custom Mfg. length: 0x%02x\n", len);
+                       padding = (*board_length) - 1;
+                       if ( ( padding > 0 ) && ( !feof(input_file) ) ){
+                               printf("Unused space: %d (bytes)\n", padding);
+                               fseek (input_file, padding, SEEK_CUR);
+                       }
+                       if ( !feof(input_file) ){
+                               unsigned char checksum = 0;
+                               fread ( &checksum, 1, 1, input_file );
+                               printf("Checksum: 0x%02x\n", checksum);
+                       }
+                       goto out;
+               }
+               printf("Additional Custom Mfg. length: 0x%02x\n", len);
+               if ( (size_board > 0) && (size_board < (*board_length)) ) {
+                       unsigned char * additional_data = NULL;
+                       unsigned int i=0;
+                       additional_data = malloc (size_board);
+                       if (additional_data == NULL) {
+                               printf("Failed to allocate memory size %d!\n", 
+                                       size_board);
+                               goto out;
+                       }
+                               
+                       fread ( additional_data, size_board, 1, input_file );
+                       printf("Additional Custom Mfg. Data: %02x",
+                              additional_data[0]);
+                       for (i = 1; i < size_board; i++){
+                               printf("-%02x", additional_data[i]);
+                       }
+                       printf("\n");
+                       free (additional_data);
+                       (*board_length) -= size_board;
+               }
+               else {
+                       printf("No Additional Custom Mfg. %d\n", *board_length);
+                       file_offset = ftell (input_file);
+                       return file_offset;
+               }
+       }
 
-   return file_offset;
+out:
+       file_offset = ftell(input_file);
+       return file_offset;
 }
 
 /**************************************************************************
-- 
1.7.7


------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
Ipmitool-devel mailing list
Ipmitool-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ipmitool-devel

Reply via email to