Skip to content

Commit 2bcc419

Browse files
committed
Fix #73060: php failed with error after temp folder cleaned up
Instead of storing the mapping base address and the address of `execute_ex()` in a separate file in the temporary folder, we store them right at the beginning of the memory mapping.
1 parent f8ff8bb commit 2bcc419

File tree

2 files changed

+17
-58
lines changed

2 files changed

+17
-58
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ PHP NEWS
1212
- LDAP:
1313
. Fixed memory leaks. (ptomulik)
1414

15+
- OPcache:
16+
. Fixed bug #73060 (php failed with error after temp folder cleaned up).
17+
(cmb)
18+
1519
06 Aug 2020, PHP 7.4.9
1620

1721
- Apache:

ext/opcache/shared_alloc_win32.c

Lines changed: 13 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@
3333

3434
#define ACCEL_FILEMAP_NAME "ZendOPcache.SharedMemoryArea"
3535
#define ACCEL_MUTEX_NAME "ZendOPcache.SharedMemoryMutex"
36-
#define ACCEL_FILEMAP_BASE_DEFAULT 0x01000000
37-
#define ACCEL_FILEMAP_BASE "ZendOPcache.MemoryBase"
3836
#define ACCEL_EVENT_SOURCE "Zend OPcache"
3937

38+
/* address of mapping base and address of execute_ex */
39+
#define ACCEL_BASE_POINTER_SIZE (2 * sizeof(void*))
40+
4041
static HANDLE memfile = NULL, memory_mutex = NULL;
4142
static void *mapping_base;
4243

@@ -75,22 +76,6 @@ static char *create_name_with_username(char *name)
7576
return newname;
7677
}
7778

78-
static char *get_mmap_base_file(void)
79-
{
80-
static char windir[MAXPATHLEN+ 32 + 3 + sizeof("\\\\@") + 1 + 32 + 21];
81-
int l;
82-
83-
GetTempPath(MAXPATHLEN, windir);
84-
l = strlen(windir);
85-
if ('\\' == windir[l-1]) {
86-
l--;
87-
}
88-
89-
snprintf(windir + l, sizeof(windir) - l - 1, "\\%s@%.32s@%.20s@%.32s", ACCEL_FILEMAP_BASE, accel_uname_id, sapi_module.name, accel_system_id);
90-
91-
return windir;
92-
}
93-
9479
void zend_shared_alloc_create_lock(void)
9580
{
9681
memory_mutex = CreateMutex(NULL, FALSE, create_name_with_username(ACCEL_MUTEX_NAME));
@@ -119,39 +104,20 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in)
119104
{
120105
int err;
121106
void *wanted_mapping_base;
122-
char *mmap_base_file = get_mmap_base_file();
123-
FILE *fp = fopen(mmap_base_file, "r");
124107
MEMORY_BASIC_INFORMATION info;
125108
void *execute_ex_base;
126109
int execute_ex_moved;
127110

128-
if (!fp) {
129-
err = GetLastError();
130-
zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err);
131-
zend_win_error_message(ACCEL_LOG_FATAL, "Unable to open base address file", err);
132-
*error_in="fopen";
133-
return ALLOC_FAILURE;
134-
}
135-
if (!fscanf(fp, "%p", &wanted_mapping_base)) {
111+
mapping_base = MapViewOfFileEx(memfile, FILE_MAP_ALL_ACCESS, 0, 0, ACCEL_BASE_POINTER_SIZE, NULL);
112+
if (mapping_base == NULL) {
136113
err = GetLastError();
137114
zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read base address", err);
138115
*error_in="read mapping base";
139-
fclose(fp);
140-
return ALLOC_FAILURE;
141-
}
142-
if (!fscanf(fp, "%p", &execute_ex_base)) {
143-
err = GetLastError();
144-
zend_win_error_message(ACCEL_LOG_FATAL, "Unable to read execute_ex base address", err);
145-
*error_in="read execute_ex base";
146-
fclose(fp);
147116
return ALLOC_FAILURE;
148117
}
149-
fclose(fp);
150-
151-
if (0 > win32_utime(mmap_base_file, NULL)) {
152-
err = GetLastError();
153-
zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err);
154-
}
118+
wanted_mapping_base = ((void**)mapping_base)[0];
119+
execute_ex_base = ((void**)mapping_base)[1];
120+
UnmapViewOfFile(mapping_base);
155121

156122
execute_ex_moved = (void *)execute_ex != execute_ex_base;
157123

@@ -207,7 +173,7 @@ static int zend_shared_alloc_reattach(size_t requested_size, char **error_in)
207173
}
208174
return ALLOC_FAIL_MAPPING;
209175
}
210-
smm_shared_globals = (zend_smm_shared_globals *) mapping_base;
176+
smm_shared_globals = (zend_smm_shared_globals *) ((char*)mapping_base + ACCEL_BASE_POINTER_SIZE);
211177

212178
return SUCCESSFULLY_REATTACHED;
213179
}
@@ -325,23 +291,12 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_
325291
*error_in = "MapViewOfFile";
326292
return ALLOC_FAILURE;
327293
} else {
328-
char *mmap_base_file = get_mmap_base_file();
329-
void *execute_ex_base = (void *)execute_ex;
330-
FILE *fp = fopen(mmap_base_file, "w");
331-
if (!fp) {
332-
err = GetLastError();
333-
zend_shared_alloc_unlock_win32();
334-
zend_win_error_message(ACCEL_LOG_WARNING, mmap_base_file, err);
335-
zend_win_error_message(ACCEL_LOG_FATAL, "Unable to write base address", err);
336-
return ALLOC_FAILURE;
337-
}
338-
fprintf(fp, "%p\n", mapping_base);
339-
fprintf(fp, "%p\n", execute_ex_base);
340-
fclose(fp);
294+
((void**)mapping_base)[0] = mapping_base;
295+
((void**)mapping_base)[1] = (void*)execute_ex;
341296
}
342297

343-
shared_segment->pos = 0;
344-
shared_segment->size = requested_size;
298+
shared_segment->pos = ACCEL_BASE_POINTER_SIZE;
299+
shared_segment->size = requested_size - ACCEL_BASE_POINTER_SIZE;
345300

346301
zend_shared_alloc_unlock_win32();
347302

0 commit comments

Comments
 (0)