From: Philippe E. <ph...@us...> - 2007-10-24 19:00:57
|
Update of /cvsroot/oprofile/oprofile/libpp In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv12735/libpp Modified Files: op_header.cpp profile.cpp Log Message: bump sample file format version. It should has been done before 0.9.3. Fix an annoying bug related to sample file format change: when odb_open() failed due to sanity checking failure we reported the error has an 'Invalid argument' because we checked the version number only if odb_open() succeed Index: op_header.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/op_header.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -p -d -r1.24 -r1.25 --- op_header.cpp 17 Nov 2006 23:47:29 -0000 1.24 +++ op_header.cpp 24 Oct 2007 19:00:58 -0000 1.25 @@ -15,6 +15,11 @@ #include <set> #include <sstream> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +#include "op_config.h" #include "op_exception.h" #include "odb.h" #include "op_cpu_type.h" @@ -99,19 +104,28 @@ void check_mtime(string const & file, op opd_header const read_header(string const & sample_filename) { - odb_t samples_db; - - int rc = odb_open(&samples_db, sample_filename.c_str(), ODB_RDONLY, - sizeof(struct opd_header)); + int fd = open(sample_filename.c_str(), O_RDONLY); + if (fd < 0) + throw op_fatal_error("Can't open sample file:" + + sample_filename); - if (rc) - throw op_fatal_error(sample_filename + ": " + strerror(rc)); + opd_header header; + if (read(fd, &header, sizeof(header)) != sizeof(header)) { + close(fd); + throw op_fatal_error("Can't read sample file header:" + + sample_filename); + } - opd_header head = *static_cast<opd_header *>(samples_db.data->base_memory); + if (memcmp(header.magic, OPD_MAGIC, sizeof(header.magic))) { + throw op_fatal_error("Invalid sample file, " + "bad magic number: " + + sample_filename); + close(fd); + } - odb_close(&samples_db); + close(fd); - return head; + return header; } Index: profile.cpp =================================================================== RCS file: /cvsroot/oprofile/oprofile/libpp/profile.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -u -p -d -r1.26 -r1.27 --- profile.cpp 10 May 2007 23:54:35 -0000 1.26 +++ profile.cpp 24 Oct 2007 19:00:58 -0000 1.27 @@ -70,14 +70,9 @@ enum profile_type profile_t::is_spu_samp //static member void profile_t::open_sample_file(string const & filename, odb_t & db) { - int rc = odb_open(&db, filename.c_str(), ODB_RDONLY, - sizeof(struct opd_header)); - - if (rc) - throw op_fatal_error(filename + ": " + strerror(rc)); - - opd_header const & head = - *static_cast<opd_header *>(odb_get_data(&db)); + // Check first if the sample file version is ok else odb_open() can + // fail and the error message will be obscure. + opd_header head = read_header(filename); if (head.version != OPD_VERSION) { ostringstream os; @@ -86,6 +81,12 @@ void profile_t::open_sample_file(string << "mismatch ?\n"; throw op_fatal_error(os.str()); } + + int rc = odb_open(&db, filename.c_str(), ODB_RDONLY, + sizeof(struct opd_header)); + + if (rc) + throw op_fatal_error(filename + ": " + strerror(rc)); } void profile_t::add_sample_file(string const & filename) |