Hi,

i will test using patch and update the test results soon.

Since previous mail  was mangled, resending it.

I have used below program for testing. Below are the steps I have followed.
Compile: gcc -g3 test_shm.c -o test_shm
Create shared memory: ./test_shm –c
Get shared memory without valgrind: ./test_shm –g ( this works fine)
Get with valgrind: /usr/bin/valgrind --tool=memcheck --leak-check=full
--track-origins=yes --log-file=/tmp/val_log /home/rtp99/test_shm –g
With valgrind shmat command fails.

Total shared memory segments active on the my system is 320.
My process will attach to 40 shared memory segments. Shmat will fails
when tested with 14 shared memory attach also.
Total RAM available on my system is 124GB. I am using HP C7000 blade
hardware with RHEL6.2 OS.
I am using 64bit binary. 'file test_shm' command output is
test_shm: ELF 64-bit LSB executable, x86-64, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not
stripped

Thanks and regards,
Adishesh

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>

struct shm_details
{
 key_t key;
 size_t size;
 int shmid;
 void *shm;
};


main(int argc,char **argv)
{
  int i;
  struct shm_details test_shm[] =
  {
{0xe300626d,2147456,-1,NULL  },
{0xe300626c ,144271608  ,-1,NULL},
{0xe300626e,115604     ,-1,NULL},
{0xe300626f ,118376704 ,-1,NULL},
{0xe300653d ,574592     ,-1,NULL},
{0xe300653c ,22578504   ,-1,NULL},
{0xe300653e ,18092      ,-1,NULL},
{0xe300653f ,208416960  ,-1,NULL},
{0xe30066b9 ,2147456    ,-1,NULL},
{0xe30066b8 ,120870984  ,-1,NULL},
{0xe30066ba ,484260     ,-1,NULL},
{0xe30066bb ,9793648960 ,-1,NULL},
{0xe30068ad ,8438912,-1,NULL },
{0xe30068ac,553973472,-1,NULL}
};
        
int list = (sizeof(test_shm)/sizeof(test_shm[0]));
int shmflg;
int delete=0;
struct shmid_ds buf;

if(argc != 2)
{
  printf("Usage: ./test_shm -c|-g|-d\n -c for create shared memory\n
-g for get shared memory\n -d delete the shared memory\n");
  return(0);
}

if(strcmp(argv[1],"-c") == 0)
{
 shmflg = IPC_CREAT | 0666;
}else if(strcmp(argv[1],"-g") == 0)
{
  shmflg = 0666;
}else if(strcmp(argv[1],"-d") == 0)
{
 shmflg = 0666;
 delete = 1;
}else{
 printf("Usage: ./test_shm -c|-g|-d\n -c for create\n -g for get
shared memory\n -d delete the shared memory\n");
 return(0);
}

for (i=0;i<list;i++)
{

 if ((test_shm[i].shmid = shmget(test_shm[i].key,
test_shm[i].size,shmflg)) < 0)
 {
        perror("shmget");
        printf("ERROR: shmget failed for shmkey=0x%x\n", test_shm[i].key);
        return(1);
 }      
}
        
/*delete*/
if(delete == 1)
{
  for (i=0;i<list;i++)
 {
   if(shmctl(test_shm[i].shmid, IPC_RMID, &buf) != 0){
      perror("shmctl");
      printf("ERROR: shmctl failed for shmkey=0x%x\n", test_shm[i].key);
      return(1);
   }
 }
 printf("INFO: All shared memories are deleted\n");
 return(0);
}

/* Now we attach the segment to our data space. */
for (i=0;i<list;i++)
{
 if((test_shm[i].shm = shmat(test_shm[i].shmid, 0, 0)) == (char *) -1){
   perror("shmat");
   printf("ERROR: shmat failed for shmkey=0x%x\n", test_shm[i].key);
   return(1);
 }
}
        
for (i=0;i<list;i++)
{

 if(shmdt(test_shm[i].shm) !=0 ) {
  perror("shmat");
  printf("ERROR: shmdt failed for shmkey=0x%x\n", test_shm[i].key);
  return(1);
 }
}

printf("INFO: exit success\n");
return(0);

}

>Can you try again after applying the attached patch ?

>Thanks

>Philippe

------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to