From 4ba672ee9f3a74c1c68ed7f372816d67e0f5eba2 Mon Sep 17 00:00:00 2001 From: Soren Sandmann Date: Thu, 23 Nov 2006 08:03:02 +0000 Subject: [PATCH] Set inode for vdso to 0. 2006-11-23 Soren Sandmann * process.c (read_maps): Set inode for vdso to 0. * binfile.c (read_inode): Return -1 on error, 0 on vdso (bin_file_new): Only read the inode if the file actually exists and is an elf file. (bin_file_check_inode): Return FALSE if there is no file. --- ChangeLog | 9 +++++++++ binfile.c | 26 +++++++++++++++----------- process.c | 6 ++++-- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 01db7f7f..342f3788 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2006-11-23 Soren Sandmann + + * process.c (read_maps): Set inode for vdso to 0. + + * binfile.c (read_inode): Return -1 on error, 0 on vdso + (bin_file_new): Only read the inode if the file actually exists + and is an elf file. + (bin_file_check_inode): Return FALSE if there is no file. + 2006-11-22 Soren Sandmann * sfile.c (sfile_load): Use GMappedFile instead diff --git a/binfile.c b/binfile.c index d53ca834..89b4421c 100644 --- a/binfile.c +++ b/binfile.c @@ -54,16 +54,17 @@ struct BinFile ino_t inode; }; -/* FIXME: error handling */ static ino_t read_inode (const char *filename) { struct stat statbuf; if (strcmp (filename, "[vdso]") == 0) + return (ino_t)0; + + if (stat (filename, &statbuf) < 0) return (ino_t)-1; - - stat (filename, &statbuf); + return statbuf.st_ino; } @@ -242,6 +243,13 @@ bin_file_new (const char *filename) { bf = g_new0 (BinFile, 1); + bf->inode_check = FALSE; + bf->filename = g_strdup (filename); + bf->undefined_name = g_strdup_printf ("In file %s", filename); + bf->ref_count = 1; + + g_hash_table_insert (bin_files, bf->filename, bf); + if (strcmp (filename, "[vdso]") == 0) { gsize length; @@ -295,15 +303,8 @@ bin_file_new (const char *filename) else g_print (" opened the original elf file\n"); #endif + bf->inode = read_inode (filename); } - - bf->inode_check = FALSE; - bf->inode = read_inode (filename); - bf->filename = g_strdup (filename); - bf->undefined_name = g_strdup_printf ("In file %s", filename); - bf->ref_count = 1; - - g_hash_table_insert (bin_files, bf->filename, bf); } return bf; @@ -369,6 +370,9 @@ bin_file_check_inode (BinFile *bin_file, if (bin_file->inode == inode) return TRUE; + if (!bin_file->elf) + return FALSE; + if (!bin_file->inode_check) { g_print ("warning: %s has inode %lld. It should be %lld\n", diff --git a/process.c b/process.c index 972f5f14..63832c9a 100644 --- a/process.c +++ b/process.c @@ -106,10 +106,12 @@ read_maps (int pid, int *n_maps) { /* For the vdso, the kernel reports 'offset' as the * the same as the mapping addres. This doesn't make - * any sense to me, so we just zero it here. + * any sense to me, so we just zero it here. There + * is code in binfile.c (read_inode) that returns 0 + * for [vdso]. */ map.offset = 0; - map.inode = -1; + map.inode = 0; } else {