@@ -633,6 +633,7 @@ static key_t tsrm_choose_random_shm_key(key_t prev_key) {
633633TSRM_API int shmget (key_t key , size_t size , int flags )
634634{/*{{{*/
635635 shm_pair * shm ;
636+ size_t mapping_size ;
636637 char shm_segment [sizeof (SEGMENT_PREFIX INT_MIN_AS_STRING )];
637638 HANDLE shm_handle = NULL ;
638639 BOOL created = FALSE;
@@ -648,16 +649,16 @@ TSRM_API int shmget(key_t key, size_t size, int flags)
648649
649650 if (!shm_handle ) {
650651 if (flags & IPC_CREAT ) {
651- if (size == 0 || size > SIZE_MAX - sizeof (shm -> descriptor )) {
652+ if (size == 0 || size > SIZE_MAX - sizeof (* shm -> descriptor )) {
652653 return -1 ;
653654 }
654- size += sizeof (shm -> descriptor );
655+ mapping_size = size + sizeof (* shm -> descriptor );
655656#if SIZEOF_SIZE_T == 8
656- DWORD high = size >> 32 ;
657- DWORD low = (DWORD )size ;
657+ DWORD high = mapping_size >> 32 ;
658+ DWORD low = (DWORD )mapping_size ;
658659#else
659660 DWORD high = 0 ;
660- DWORD low = size ;
661+ DWORD low = mapping_size ;
661662#endif
662663 shm_handle = CreateFileMapping (INVALID_HANDLE_VALUE , NULL , PAGE_READWRITE , high , low , key == IPC_PRIVATE ? NULL : shm_segment );
663664 created = TRUE;
@@ -728,7 +729,7 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags)
728729 return (void * )-1 ;
729730 }
730731
731- shm -> addr = shm -> descriptor + sizeof ( shm -> descriptor ) ;
732+ shm -> addr = shm -> descriptor + 1 ;
732733 shm -> descriptor -> shm_atime = time (NULL );
733734 shm -> descriptor -> shm_lpid = getpid ();
734735 shm -> descriptor -> shm_nattch ++ ;
0 commit comments