I am using fgets() to read lines from file. I am able to read a few lines of the file then fgets() returns an access violation. One would expect that there is an issue with my file buffer but as you can see in my code, that is not the case. One bit of strange behavior I noticed was if I read and print all the lines of the file in a tight loop, I have no issues. I used some printf() statements to debug this problem and noticed that the file position is different depending on which loop is executed. The FILE * is not touched in my “full loop” logic.
The tight loop file positions go: 0, 27, 53, 80, 82, 99, 127, 155, etc.
The full loop file positions go: 0, 27, 53, 80, 82, 99, 138
input file:
!!!!!!!!!!!!!!!!!!!!!!!!!
! Test sparc gagdet file
!!!!!!!!!!!!!!!!!!!!!!!!!
! instruction 1
1: subcc %g0, %i4, %i4
1: subc %g0, %i4, %i4 ** access violation reading this line **
! instruction 2
** etc. **
code:
/*
* parse_profile: Parse the gadget profile and load the memory structures required to scan the library file
*/
int parse_profile(FILE * gadget_file, struct g_handle * gadget_handle){
// Buffers used to temporarily store file imput
char op_code [NODE_BUF_SIZE] = "\0";
char reg [NODE_BUF_SIZE] = "\0";
// Reference nodes in the bod_ops and save_regs lists
struct char_node * temp_node = NULL;
struct char_node * op_node = NULL;
struct char_node * reg_node = NULL;
//
int level = 1;
int old_level = 1;
int curr_line = 0;
// A buffer to hold file data
char file_buffer [PAGE_SIZE];
// Reference nocdes in the instruction tree
struct instruction_node * current_node = NULL;
struct instruction_node * prev_node = NULL;
struct instruction_node * prev_level = NULL;
// Read a line from the gadget file (data for a single instruction)
//while(fgets(file_buffer, PAGE_SIZE, gadget_file) != NULL){
char * shiz = file_buffer;
while(shiz != NULL){
printf("\n file location: %d", ftell(gadget_file));
fflush(stdout);
shiz = fgets(file_buffer, PAGE_SIZE, gadget_file);
/*
// tight loop with different file position
while(shit != NULL){
printf("\n file location: %d", ftell(gadget_file));
fflush(stdout);
shiz = fgets(file_buffer, PAGE_SIZE, gadget_file);
}
*/
// Increment the current line
curr_line = curr_line + 1;
printf("\nline (%d)", curr_line);
fflush(stdout);
// Ensure we have gathered the entire line of the file
if(strlen(file_buffer) >= PAGE_SIZE){
// We have exceeded the maximum line size, quit
printf("\nError reading gadget profile, Line %d: Maximum line length of 4096 has been exceeded", curr_line);
return(-1);
} // Ensure we have gathered the entire line of the file
// If this is a comment
if(*file_buffer == '!'){
// Do nothing
}
// If this is a blank line
else if(sscanf(file_buffer," %s ") < 1){
// Do nothing
}
// Scan the current line until we have saved all instructions
else if(sscanf(file_buffer,"%d: %s", &level, op_code) == 2){
printf("\n file location: %d", ftell(gadget_file));
fflush(stdout);
printf("1");
fflush(stdout);
// Store instruction information
/*
commented block
*/
} // Scan the current line until we have saved all instruction/nibble pairs
// Scan the current line until we have saved all registers to be preserved
else if(sscanf (file_buffer,"r: %s", reg) == 1){
/*
commented block
*/
} // Scan the current line until we have saved all registers to be preserved
// Scan the current line until we have saved all op_codes to be avoided
else if(sscanf (file_buffer,"o: %s", op_code) == 1){
/*
commented block
*/
} // Scan the current line until we have saved all op_codes to be avoided
else{
// quit
printf("\nError reading gadget profile, Line %d: \n%s", curr_line, file_buffer);
return(-1);
}
printf("7");
printf("\n file location: %d", ftell(gadget_file));
fflush(stdout);
} // Read a line from the gadget file (data for a single instruction)
printf("a");
fflush(stdout);
// If fread() returned an error, exit with an error
if(ferror(gadget_file) != 0){
// Print error and exit
printf("\nError reading gadget profile");
return(-1);
} // If fread() returned an error, exit with an error
return 0;
}
You have undefined results on the line
The number of format specifiers exceeds the number of pointers passed. It is quite possible that the
sscanftries to store the scan result at the arbitrary location whose bit-pattern was in the wrong place.