@@ -69,10 +69,8 @@ static void tsrm_win32_dtor(tsrm_win32_globals *globals)
69
69
70
70
if (globals -> shm ) {
71
71
for (ptr = globals -> shm ; ptr < (globals -> shm + globals -> shm_size ); ptr ++ ) {
72
- UnmapViewOfFile (ptr -> addr );
73
- CloseHandle (ptr -> segment );
74
72
UnmapViewOfFile (ptr -> descriptor );
75
- CloseHandle (ptr -> info );
73
+ CloseHandle (ptr -> segment );
76
74
}
77
75
free (globals -> shm );
78
76
}
@@ -610,26 +608,27 @@ TSRM_API int pclose(FILE *stream)
610
608
}/*}}}*/
611
609
612
610
#define SEGMENT_PREFIX "TSRM_SHM_SEGMENT:"
613
- #define DESCRIPTOR_PREFIX "TSRM_SHM_DESCRIPTOR:"
614
611
#define INT_MIN_AS_STRING "-2147483648"
615
612
616
613
TSRM_API int shmget (key_t key , size_t size , int flags )
617
614
{/*{{{*/
618
615
shm_pair * shm ;
619
- char shm_segment [sizeof (SEGMENT_PREFIX INT_MIN_AS_STRING )], shm_info [ sizeof ( DESCRIPTOR_PREFIX INT_MIN_AS_STRING )] ;
616
+ char shm_segment [sizeof (SEGMENT_PREFIX INT_MIN_AS_STRING )];
620
617
HANDLE shm_handle = NULL , info_handle = NULL ;
621
618
BOOL created = FALSE;
622
619
623
620
if (key != IPC_PRIVATE ) {
624
621
snprintf (shm_segment , sizeof (shm_segment ), SEGMENT_PREFIX "%d" , key );
625
- snprintf (shm_info , sizeof (shm_info ), DESCRIPTOR_PREFIX "%d" , key );
626
622
627
623
shm_handle = OpenFileMapping (FILE_MAP_ALL_ACCESS , FALSE, shm_segment );
628
- info_handle = OpenFileMapping (FILE_MAP_ALL_ACCESS , FALSE, shm_info );
629
624
}
630
625
631
- if (!shm_handle && ! info_handle ) {
626
+ if (!shm_handle ) {
632
627
if (flags & IPC_CREAT ) {
628
+ if (size > SIZE_MAX - sizeof (shm -> descriptor )) {
629
+ return -1 ;
630
+ }
631
+ size += sizeof (shm -> descriptor );
633
632
#if SIZEOF_SIZE_T == 8
634
633
DWORD high = size >> 32 ;
635
634
DWORD low = (DWORD )size ;
@@ -638,39 +637,25 @@ TSRM_API int shmget(key_t key, size_t size, int flags)
638
637
DWORD low = size ;
639
638
#endif
640
639
shm_handle = CreateFileMapping (INVALID_HANDLE_VALUE , NULL , PAGE_READWRITE , high , low , key == IPC_PRIVATE ? NULL : shm_segment );
641
- info_handle = CreateFileMapping (INVALID_HANDLE_VALUE , NULL , PAGE_READWRITE , 0 , sizeof (shm -> descriptor ), key == IPC_PRIVATE ? NULL : shm_info );
642
640
created = TRUE;
643
641
}
644
- if (!shm_handle || !info_handle ) {
645
- if (shm_handle ) {
646
- CloseHandle (shm_handle );
647
- }
648
- if (info_handle ) {
649
- CloseHandle (info_handle );
650
- }
642
+ if (!shm_handle ) {
651
643
return -1 ;
652
644
}
653
645
} else {
654
646
if (flags & IPC_EXCL ) {
655
- if (shm_handle ) {
656
- CloseHandle (shm_handle );
657
- }
658
- if (info_handle ) {
659
- CloseHandle (info_handle );
660
- }
647
+ CloseHandle (shm_handle );
661
648
return -1 ;
662
649
}
663
650
}
664
651
665
652
shm = shm_get (key , NULL );
666
653
if (!shm ) {
667
654
CloseHandle (shm_handle );
668
- CloseHandle (info_handle );
669
655
return -1 ;
670
656
}
671
657
shm -> segment = shm_handle ;
672
- shm -> info = info_handle ;
673
- shm -> descriptor = MapViewOfFileEx (shm -> info , FILE_MAP_ALL_ACCESS , 0 , 0 , 0 , NULL );
658
+ shm -> descriptor = MapViewOfFileEx (shm -> segment , FILE_MAP_ALL_ACCESS , 0 , 0 , 0 , NULL );
674
659
675
660
if (NULL != shm -> descriptor && created ) {
676
661
shm -> descriptor -> shm_perm .key = key ;
@@ -691,7 +676,6 @@ TSRM_API int shmget(key_t key, size_t size, int flags)
691
676
CloseHandle (shm -> segment );
692
677
}
693
678
UnmapViewOfFile (shm -> descriptor );
694
- CloseHandle (shm -> info );
695
679
return -1 ;
696
680
}
697
681
@@ -706,7 +690,7 @@ TSRM_API void *shmat(int key, const void *shmaddr, int flags)
706
690
return (void * )-1 ;
707
691
}
708
692
709
- shm -> addr = MapViewOfFileEx ( shm -> segment , FILE_MAP_ALL_ACCESS , 0 , 0 , 0 , NULL );
693
+ shm -> addr = shm -> descriptor + sizeof ( shm -> descriptor );
710
694
711
695
if (NULL == shm -> addr ) {
712
696
int err = GetLastError ();
@@ -734,7 +718,7 @@ TSRM_API int shmdt(const void *shmaddr)
734
718
shm -> descriptor -> shm_lpid = getpid ();
735
719
shm -> descriptor -> shm_nattch -- ;
736
720
737
- ret = UnmapViewOfFile ( shm -> addr ) ? 0 : - 1 ;
721
+ ret = 1 ;
738
722
if (!ret && shm -> descriptor -> shm_nattch <= 0 ) {
739
723
ret = UnmapViewOfFile (shm -> descriptor ) ? 0 : -1 ;
740
724
shm -> descriptor = NULL ;
0 commit comments