diff --git a/drivers/iohb.c b/drivers/iohb.c index c4aec8d7207987ee541cd40180e041b61eb6a215..ebc849511960d4f8cdbd3ea7d41361aba3bac824 100644 --- a/drivers/iohb.c +++ b/drivers/iohb.c @@ -1066,6 +1066,7 @@ int readHB_mat_char(const char* filename, int colptr[], int rowind[], } } + fclose(in_file); return 1; } @@ -1162,12 +1163,14 @@ int readHB_aux_char(const char* filename, const char AuxType, char b[]) if (Nrhs <= 0) { fprintf(stderr, "Warn: Attempt to read auxillary vector(s) when none are present.\n"); + fclose(in_file); return 0; } if (Rhstype[0] != 'F' ) { fprintf(stderr,"Warn: Attempt to read auxillary vector(s) which are not stored in Full form.\n"); fprintf(stderr," Rhs must be specified as full. \n"); + fclose(in_file); return 0; } @@ -1185,10 +1188,12 @@ int readHB_aux_char(const char* filename, const char AuxType, char b[]) if ( AuxType == 'G' && Rhstype[1] != 'G' ) { fprintf(stderr, "Warn: Attempt to read auxillary Guess vector(s) when none are present.\n"); + fclose(in_file); return 0; } if ( AuxType == 'X' && Rhstype[2] != 'X' ) { fprintf(stderr, "Warn: Attempt to read auxillary eXact solution vector(s) when none are present.\n"); + fclose(in_file); return 0; } @@ -1276,10 +1281,8 @@ int readHB_aux_char(const char* filename, const char AuxType, char b[]) col = 0; } } - } - fclose(in_file); return Nrhs; } @@ -1505,19 +1508,24 @@ int ParseIfmt(char* fmt, int* perline, int* width) /* width and number of elements per line. */ /*************************************************/ char *tmp; + *perline = 0; *width = 0; if (fmt == NULL ) { - *perline = 0; *width = 0; return 0; + return 0; } upcase(fmt); tmp = strchr(fmt,'('); - tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,'I') - tmp - 1); - *perline = atoi(tmp); - if (tmp) free(tmp); + if (tmp) { + tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,'I') - tmp - 1); + *perline = atoi(tmp); + free(tmp); + } tmp = strchr(fmt,'I'); - tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,')') - tmp - 1); - *width = atoi(tmp); - if (tmp) free(tmp); + if (tmp) { + tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,')') - tmp - 1); + *width = atoi(tmp); + free(tmp); + } return *width; } @@ -1535,9 +1543,9 @@ int ParseRfmt(char* fmt, int* perline, int* width, int* prec, char* flag) char* tmp3; int len; + *perline = 0; + *width = 0; if (fmt == NULL ) { - *perline = 0; - *width = 0; flag = NULL; return 0; } @@ -1580,18 +1588,25 @@ int ParseRfmt(char* fmt, int* perline, int* width, int* prec, char* flag) tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,*flag) - tmp - 1); *perline = atoi(tmp); free(tmp); - tmp = strchr(fmt,*flag); - if ( strchr(fmt,'.') ) { - char *tmp2 = substr( fmt, strchr(fmt,'.') - fmt + 1, strchr(fmt,')') - strchr(fmt,'.')-1); - *prec = atoi( tmp2 ); - if (tmp2) free(tmp2); - tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,'.') - tmp - 1); - } else { - tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,')') - tmp - 1); + { + char c; + if ( strchr(fmt,'.') ) { + char *tmp2 = substr( fmt, strchr(fmt,'.') - fmt + 1, strchr(fmt,')') - strchr(fmt,'.')-1); + if (tmp2) { + *prec = atoi( tmp2 ); + free(tmp2); + } + c = '.'; + } else { + c = ')'; + } + tmp = strchr(fmt,*flag); + if (tmp) { + tmp = substr(fmt,tmp - fmt + 1, strchr(fmt,c) - tmp - 1); + *width = atoi(tmp); + free(tmp); + } } - *width = atoi(tmp); - - if (tmp) free(tmp); return *width; } diff --git a/drivers/laplacian.c b/drivers/laplacian.c index 03a25dbb66b806209ab1436fe80a49f5aec4d40e..6c94a5ee5bd86b01eff057ac015ee1ee0c91293e 100644 --- a/drivers/laplacian.c +++ b/drivers/laplacian.c @@ -92,7 +92,7 @@ laplacian_parse_info( const char *filename, char flt; char *tmpf = strdup( filename ); - if ( sscanf( filename, "%c:%s", &flt, tmpf ) == 2 ) { + if ( sscanf( filename, "%c:%256s", &flt, tmpf ) == 2 ) { filename += 2; switch( flt ){ case 'Z': diff --git a/drivers/mmio.c b/drivers/mmio.c index 809b86dac008eeba6c8b089d52c2e5c2d482a11c..a966218f73f11fee6fe465491ac76c1ea4e92c2b 100644 --- a/drivers/mmio.c +++ b/drivers/mmio.c @@ -113,7 +113,7 @@ int mm_read_banner(FILE *f, MM_typecode *matcode) if (fgets(line, MM_MAX_LINE_LENGTH, f) == NULL) return MM_PREMATURE_EOF; - if (sscanf(line, "%s %s %s %s %s", banner, mtx, crd, data_type, + if (sscanf(line, "%63s %63s %63s %63s %63s", banner, mtx, crd, data_type, storage_scheme) != 5) return MM_PREMATURE_EOF; @@ -347,17 +347,21 @@ int mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **row, int **col, if ((f = fopen(fname, "r")) == NULL) return MM_COULD_NOT_READ_FILE; - - if ((ret_code = mm_read_banner(f, matcode)) != 0) + if ((ret_code = mm_read_banner(f, matcode)) != 0) { + if (f != stdin) fclose(f); return ret_code; - - if (!(mm_is_valid(*matcode) && mm_is_sparse(*matcode) && - mm_is_matrix(*matcode))) + } + if (!(mm_is_valid(*matcode) && + mm_is_sparse(*matcode) && + mm_is_matrix(*matcode)) ) + { + if (f != stdin) fclose(f); return MM_UNSUPPORTED_TYPE; - - if ((ret_code = mm_read_mtx_crd_size(f, M, N, nz)) != 0) + } + if ((ret_code = mm_read_mtx_crd_size(f, M, N, nz)) != 0) { + if (f != stdin) fclose(f); return ret_code; - + } *row = (int *) malloc(*nz * sizeof(int)); *col = (int *) malloc(*nz * sizeof(int)); @@ -368,21 +372,30 @@ int mm_read_mtx_crd(char *fname, int *M, int *N, int *nz, int **row, int **col, *val = (double *) malloc(*nz * 2 * sizeof(double)); ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *row, *col, *val, *matcode); - if (ret_code != 0) return ret_code; + if (ret_code != 0) { + if (f != stdin) fclose(f); + return ret_code; + } } else if (mm_is_real(*matcode)) { *val = (double *) malloc(*nz * sizeof(double)); ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *row, *col, *val, *matcode); - if (ret_code != 0) return ret_code; + if (ret_code != 0) { + if (f != stdin) fclose(f); + return ret_code; + } } else if (mm_is_pattern(*matcode)) { ret_code = mm_read_mtx_crd_data(f, *M, *N, *nz, *row, *col, *val, *matcode); - if (ret_code != 0) return ret_code; + if (ret_code != 0) { + if (f != stdin) fclose(f); + return ret_code; + } } if (f != stdin) fclose(f); diff --git a/drivers/readijv.c b/drivers/readijv.c index 0e619fdba861c7f27ec046c50f00cfd835661ba1..ba3c7d8be3d9c8a1fa7ffe00f80c4db1c35210c9 100644 --- a/drivers/readijv.c +++ b/drivers/readijv.c @@ -121,10 +121,12 @@ readIJV( const char *dirname, if (hdrfile == NULL) { fprintf(stderr,"readijv: Cannot open the header file (%s)\n", filename); + free(filename); return PASTIX_ERR_BADPARAMETER; } threeFilesReadHeader(hdrfile, &Nrow, &Ncol, &Nnzero); fclose(hdrfile); + free(filename); } spm->gN = Ncol; @@ -144,6 +146,7 @@ readIJV( const char *dirname, free(filename); return PASTIX_ERR_BADPARAMETER; } + free(filename); sprintf(filename,"%s/ja_threeFiles",dirname); jafile = fopen(filename,"r"); @@ -154,6 +157,7 @@ readIJV( const char *dirname, free(filename); return PASTIX_ERR_BADPARAMETER; } + free(filename); sprintf(filename,"%s/ra_threeFiles",dirname); rafile = fopen(filename,"r"); @@ -165,6 +169,7 @@ readIJV( const char *dirname, free(filename); return PASTIX_ERR_BADPARAMETER; } + free(filename); /* Read the files */ tempcol = spm->colptr; @@ -194,6 +199,5 @@ readIJV( const char *dirname, fclose(iafile); fclose(jafile); fclose(rafile); - free(filename); return PASTIX_SUCCESS; }