Compare commits

..

5 Commits

Author SHA1 Message Date
Michael Müller
4df6fee769 Add font symlink patch. 2014-07-23 01:20:57 +02:00
Erich E. Hoover
6b2cc4c58f Return correct IMediaSeeking stream positions in quartz. 2014-07-22 08:38:10 -06:00
Michael Müller
a3d2b4b9e0 Fix fuzz in patches. 2014-07-20 22:36:08 +02:00
Erich E. Hoover
95bee0aa1e Fix race condition between EndOfStream and Pause. 2014-07-18 10:58:54 -06:00
Erich E. Hoover
bc6f854478 Fix possible race conditions in strmbase/quartz. 2014-07-17 10:54:33 -06:00
18 changed files with 710 additions and 15 deletions

6
debian/changelog vendored
View File

@@ -1,3 +1,9 @@
wine-compholio (1.7.23) UNRELEASED; urgency=low
* Fix possible race conditions in strmbase/quartz.
* Fix race condition between EndOfStream and Pause.
* Return correct IMediaSeeking stream positions in quartz.
-- Erich E. Hoover <erich.e.hoover@gmail.com> Tue, 22 Jul 2014 08:37:27 -0600
wine-compholio (1.7.22) unstable; urgency=low
* Implement passing ACLs to CreateProcess.
* Removed several patches (accepted upstream).

View File

@@ -0,0 +1,27 @@
From b089b250846590430d7908f2cff86ba40f40a696 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 17 Jul 2014 10:28:42 -0600
Subject: strmbase: Fix race condition on InputPin_BeginFlush between
csRenderLock and filter.csFilter.
---
dlls/strmbase/renderer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index bb91236..fb0902e 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -130,8 +130,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_BeginFlush(IPin * iface)
TRACE("(%p/%p)->()\n", This, iface);
- EnterCriticalSection(&pFilter->filter.csFilter);
EnterCriticalSection(&pFilter->csRenderLock);
+ EnterCriticalSection(&pFilter->filter.csFilter);
EnterCriticalSection(This->pin.pCritSec);
hr = BaseInputPinImpl_BeginFlush(iface);
if (SUCCEEDED(hr))
--
1.7.9.5

View File

@@ -0,0 +1,37 @@
From 9941d6cd8ac96f5f90d3a93257acb9bee8181ba6 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 17 Jul 2014 10:35:43 -0600
Subject: strmbase: Fix race condition on InputPin_EndFlush between
csRenderLock and filter.csFilter.
---
dlls/strmbase/renderer.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index fb0902e..d175fa5 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -155,8 +155,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface)
TRACE("(%p/%p)->()\n", This, pFilter);
- EnterCriticalSection(&pFilter->filter.csFilter);
EnterCriticalSection(&pFilter->csRenderLock);
+ EnterCriticalSection(&pFilter->filter.csFilter);
EnterCriticalSection(This->pin.pCritSec);
hr = BaseInputPinImpl_EndFlush(iface);
if (SUCCEEDED(hr))
@@ -167,8 +167,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndFlush(IPin * iface)
hr = BaseRendererImpl_EndFlush(pFilter);
}
LeaveCriticalSection(This->pin.pCritSec);
- LeaveCriticalSection(&pFilter->csRenderLock);
LeaveCriticalSection(&pFilter->filter.csFilter);
+ LeaveCriticalSection(&pFilter->csRenderLock);
return hr;
}
--
1.7.9.5

View File

@@ -0,0 +1,37 @@
From 88b8e012138b2fc81718cde5f4e4f50cc6b4ed6b Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 17 Jul 2014 10:37:37 -0600
Subject: strmbase: Fix race condition on InputPin_EndOfStream between
csRenderLock and filter.csFilter.
---
dlls/strmbase/renderer.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c
index d175fa5..c8f130c 100644
--- a/dlls/strmbase/renderer.c
+++ b/dlls/strmbase/renderer.c
@@ -105,8 +105,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
TRACE("(%p/%p)->()\n", This, pFilter);
- EnterCriticalSection(&pFilter->filter.csFilter);
EnterCriticalSection(&pFilter->csRenderLock);
+ EnterCriticalSection(&pFilter->filter.csFilter);
hr = BaseInputPinImpl_EndOfStream(iface);
EnterCriticalSection(This->pin.pCritSec);
if (SUCCEEDED(hr))
@@ -117,8 +117,8 @@ static HRESULT WINAPI BaseRenderer_InputPin_EndOfStream(IPin * iface)
hr = BaseRendererImpl_EndOfStream(pFilter);
}
LeaveCriticalSection(This->pin.pCritSec);
- LeaveCriticalSection(&pFilter->csRenderLock);
LeaveCriticalSection(&pFilter->filter.csFilter);
+ LeaveCriticalSection(&pFilter->csRenderLock);
return hr;
}
--
1.7.9.5

View File

@@ -0,0 +1,27 @@
From a67e8965650e75947a899cec4540d428e2cd1236 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 17 Jul 2014 10:30:19 -0600
Subject: quartz: Fix race condition on EndOfStream between csRenderLock and
filter.csFilter.
---
dlls/quartz/dsoundrender.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 57e3d3b..8c67374 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -254,8 +254,8 @@ static HRESULT DSoundRender_HandleEndOfStream(DSoundRenderImpl *This)
LeaveCriticalSection(&This->renderer.filter.csFilter);
LeaveCriticalSection(&This->renderer.csRenderLock);
WaitForSingleObject(This->blocked, 10);
- EnterCriticalSection(&This->renderer.filter.csFilter);
EnterCriticalSection(&This->renderer.csRenderLock);
+ EnterCriticalSection(&This->renderer.filter.csFilter);
This->in_loop = 0;
}
--
1.7.9.5

View File

@@ -0,0 +1,27 @@
From 90faffc9d768d674eb603dabe72b107444e19712 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 17 Jul 2014 10:31:17 -0600
Subject: quartz: Fix race condition on EndFlush between csRenderLock and
filter.csFilter.
---
dlls/quartz/videorenderer.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/quartz/videorenderer.c b/dlls/quartz/videorenderer.c
index 4e8f359..5fe0aea 100644
--- a/dlls/quartz/videorenderer.c
+++ b/dlls/quartz/videorenderer.c
@@ -377,8 +377,8 @@ static HRESULT WINAPI VideoRenderer_EndFlush(BaseRenderer* iface)
LeaveCriticalSection(&iface->csRenderLock);
LeaveCriticalSection(&iface->filter.csFilter);
WaitForSingleObject(This->hEvent, INFINITE);
- EnterCriticalSection(&iface->filter.csFilter);
EnterCriticalSection(&iface->csRenderLock);
+ EnterCriticalSection(&iface->filter.csFilter);
EnterCriticalSection(iface->pInputPin->pin.pCritSec);
}
if (This->renderer.filter.state == State_Paused) {
--
1.7.9.5

View File

@@ -0,0 +1,25 @@
From abaf77994534eaa61cdb2e6dad10de2d5ff7f50f Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Fri, 18 Jul 2014 10:57:13 -0600
Subject: quartz: Fix race condition between EndOfStream and Pause.
---
dlls/quartz/dsoundrender.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 8c67374..2914b15 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -243,7 +243,7 @@ end:
static HRESULT DSoundRender_HandleEndOfStream(DSoundRenderImpl *This)
{
- while (1)
+ while (This->renderer.filter.state == State_Running)
{
DWORD pos1, pos2;
DSoundRender_UpdatePositions(This, &pos1, &pos2);
--
1.7.9.5

View File

@@ -0,0 +1,3 @@
Revision: 1
Author: Erich E. Hoover
Title: Fix possible race conditions in strmbase/quartz.

View File

@@ -0,0 +1,58 @@
From fb2417ad73fb67b20340a65d645b9dac245bdbf0 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 22 Jul 2014 08:26:47 -0600
Subject: quartz: Include the stream position in addition to the reference
clock offset in the time returned by MediaSeeking_GetPositions.
---
dlls/quartz/filtergraph.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 771a330..ad24691 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -2539,16 +2539,37 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *
return hr;
}
+static HRESULT WINAPI found_getposition(IFilterGraphImpl *This, IMediaSeeking *seek, DWORD_PTR pargs)
+{
+ struct pos_args *args = (void*)pargs;
+
+ return IMediaSeeking_GetPositions(seek, args->current, args->stop);
+}
+
static HRESULT WINAPI MediaSeeking_GetPositions(IMediaSeeking *iface, LONGLONG *pCurrent,
LONGLONG *pStop)
{
IFilterGraphImpl *This = impl_from_IMediaSeeking(iface);
+ struct pos_args args;
+ LONGLONG time = 0;
HRESULT hr;
TRACE("(%p/%p)->(%p, %p)\n", This, iface, pCurrent, pStop);
- hr = IMediaSeeking_GetCurrentPosition(iface, pCurrent);
- if (SUCCEEDED(hr))
- hr = IMediaSeeking_GetStopPosition(iface, pStop);
+
+ args.current = pCurrent;
+ args.stop = pStop;
+ EnterCriticalSection(&This->cs);
+ hr = all_renderers_seek(This, found_getposition, (DWORD_PTR)&args);
+ if (This->state == State_Running && This->refClock && This->start_time >= 0)
+ {
+ IReferenceClock_GetTime(This->refClock, &time);
+ if (time)
+ time -= This->start_time;
+ }
+ if (This->pause_time > 0)
+ time += This->pause_time;
+ *pCurrent += time;
+ LeaveCriticalSection(&This->cs);
return hr;
}
--
1.7.9.5

View File

@@ -0,0 +1,72 @@
From 77648650211d1750a49494b2d0bcf7943b58e1b1 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 22 Jul 2014 08:27:52 -0600
Subject: quartz: Implement MediaSeeking_GetCurrentPosition on top of
MediaSeeking_GetPositions.
---
dlls/quartz/filtergraph.c | 41 ++++++++++++++++-------------------------
1 file changed, 16 insertions(+), 25 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index ad24691..4c093f3 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -2451,31 +2451,6 @@ static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface, LONGLON
return hr;
}
-static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent)
-{
- IFilterGraphImpl *This = impl_from_IMediaSeeking(iface);
- LONGLONG time = 0;
-
- if (!pCurrent)
- return E_POINTER;
-
- EnterCriticalSection(&This->cs);
- if (This->state == State_Running && This->refClock && This->start_time >= 0)
- {
- IReferenceClock_GetTime(This->refClock, &time);
- if (time)
- time -= This->start_time;
- }
- if (This->pause_time > 0)
- time += This->pause_time;
- *pCurrent = time;
- LeaveCriticalSection(&This->cs);
-
- TRACE("Time: %u.%03u\n", (DWORD)(*pCurrent / 10000000), (DWORD)((*pCurrent / 10000)%1000));
-
- return S_OK;
-}
-
static HRESULT WINAPI MediaSeeking_ConvertTimeFormat(IMediaSeeking *iface, LONGLONG *pTarget,
const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat)
{
@@ -2574,6 +2549,22 @@ static HRESULT WINAPI MediaSeeking_GetPositions(IMediaSeeking *iface, LONGLONG *
return hr;
}
+static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent)
+{
+ IFilterGraphImpl *This = impl_from_IMediaSeeking(iface);
+ LONGLONG time;
+ HRESULT hr;
+
+ if (!pCurrent)
+ return E_POINTER;
+
+ hr = MediaSeeking_GetPositions(iface, pCurrent, &time);
+
+ TRACE("Time: %u.%03u\n", (DWORD)(*pCurrent / 10000000), (DWORD)((*pCurrent / 10000)%1000));
+
+ return hr;
+}
+
static HRESULT WINAPI MediaSeeking_GetAvailable(IMediaSeeking *iface, LONGLONG *pEarliest,
LONGLONG *pLatest)
{
--
1.7.9.5

View File

@@ -0,0 +1,68 @@
From e2abc9b73d2e909f62468de5d66c5d9ec51fce0f Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 22 Jul 2014 08:32:31 -0600
Subject: quartz: Implement MediaSeeking_GetStopPosition on top of
MediaSeeking_GetPositions.
---
dlls/quartz/filtergraph.c | 37 ++++++++++++++++---------------------
1 file changed, 16 insertions(+), 21 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 4c093f3..0d06ba4 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -2430,27 +2430,6 @@ static HRESULT WINAPI MediaSeeking_GetDuration(IMediaSeeking *iface, LONGLONG *p
return hr;
}
-static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface, LONGLONG *pStop)
-{
- IFilterGraphImpl *This = impl_from_IMediaSeeking(iface);
- HRESULT hr = S_OK;
-
- TRACE("(%p/%p)->(%p)\n", This, iface, pStop);
-
- if (!pStop)
- return E_POINTER;
-
- EnterCriticalSection(&This->cs);
- if (This->stop_position < 0)
- /* Stop position not set, use duration instead */
- hr = IMediaSeeking_GetDuration(iface, pStop);
- else
- *pStop = This->stop_position;
- LeaveCriticalSection(&This->cs);
-
- return hr;
-}
-
static HRESULT WINAPI MediaSeeking_ConvertTimeFormat(IMediaSeeking *iface, LONGLONG *pTarget,
const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat)
{
@@ -2565,6 +2544,22 @@ static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface, LONG
return hr;
}
+static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface, LONGLONG *pStop)
+{
+ IFilterGraphImpl *This = impl_from_IMediaSeeking(iface);
+ LONGLONG time;
+ HRESULT hr;
+
+ TRACE("(%p/%p)->(%p)\n", This, iface, pStop);
+
+ if (!pStop)
+ return E_POINTER;
+
+ hr = MediaSeeking_GetPositions(iface, &time, pStop);
+
+ return hr;
+}
+
static HRESULT WINAPI MediaSeeking_GetAvailable(IMediaSeeking *iface, LONGLONG *pEarliest,
LONGLONG *pLatest)
{
--
1.7.9.5

View File

@@ -0,0 +1,44 @@
From 3c9438db949d434b8cb5fba36ee55df384624016 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Tue, 22 Jul 2014 08:34:09 -0600
Subject: quartz: Remove unused cache of MediaSeeking stop position.
---
dlls/quartz/filtergraph.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 0d06ba4..df6b4bd 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -201,7 +201,6 @@ typedef struct _IFilterGraphImpl {
GUID timeformatseek;
REFERENCE_TIME start_time;
REFERENCE_TIME pause_time;
- LONGLONG stop_position;
LONG recursioncount;
IUnknown *pSite;
LONG version;
@@ -2471,11 +2470,6 @@ static HRESULT WINAPI MediaSeeking_SetPositions(IMediaSeeking *iface, LONGLONG *
(dwCurrentFlags & 0x7) != AM_SEEKING_NoPositioning)
FIXME("Adjust method %x not handled yet!\n", dwCurrentFlags & 0x7);
- if ((dwStopFlags & 0x7) == AM_SEEKING_AbsolutePositioning)
- This->stop_position = *pStop;
- else if ((dwStopFlags & 0x7) != AM_SEEKING_NoPositioning)
- FIXME("Stop position not handled yet!\n");
-
if (state == State_Running && !(dwCurrentFlags & AM_SEEKING_NoFlush))
IMediaControl_Pause(&This->IMediaControl_iface);
args.current = pCurrent;
@@ -5669,7 +5663,6 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj)
fimpl->nItfCacheEntries = 0;
memcpy(&fimpl->timeformatseek, &TIME_FORMAT_MEDIA_TIME, sizeof(GUID));
fimpl->start_time = fimpl->pause_time = 0;
- fimpl->stop_position = -1;
fimpl->punkFilterMapper2 = NULL;
fimpl->recursioncount = 0;
fimpl->version = 0;
--
1.7.9.5

View File

@@ -0,0 +1,3 @@
Revision: 1
Author: Erich E. Hoover
Title: Return correct IMediaSeeking stream positions in quartz.

View File

@@ -0,0 +1,255 @@
From 1b190ec8ab3c976cdc82fa6b40d8e3bef5caece4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Wed, 23 Jul 2014 01:11:08 +0200
Subject: gdi32: add symlinks for external fonts
---
dlls/gdi32/freetype.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 167 insertions(+), 6 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index fae9ffe..49aa651 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -108,6 +108,10 @@
#include "resource.h"
+#ifdef HAVE_SYS_STAT_H
+ #include <sys/stat.h>
+#endif
+
WINE_DEFAULT_DEBUG_CHANNEL(font);
#ifdef HAVE_FREETYPE
@@ -2936,6 +2940,74 @@ static void load_system_fonts(void)
}
}
+static char* get_filename(char *path)
+{
+ char *p;
+
+ if (!path)
+ return NULL;
+
+ p = path + strlen(path) - 1;
+ while (p > path && *p != '/') p--;
+ p++;
+
+ return (*p != 0) ? p : NULL;
+}
+
+static char* combine_path(char *dir, char *filename)
+{
+ char *result;
+
+ if (!dir || !filename)
+ return NULL;
+
+ result = HeapAlloc(GetProcessHeap(), 0, strlen(dir) + strlen(filename) + 2);
+ if (result)
+ sprintf(result, "%s/%s", dir, filename);
+
+ return result;
+}
+
+static WCHAR* add_font_symlink(char *fontdir, char *fontfile)
+{
+ char *combined;
+ struct stat file_st;
+ char link_path[MAX_PATH];
+ WCHAR *result = NULL;
+
+ if (!fontdir || !fontfile)
+ return NULL;
+
+ combined = combine_path(fontdir, get_filename(fontfile));
+ if (!combined)
+ return NULL;
+
+ /*
+ * Check if a file with the same name already exists and
+ * points to the same destination. We do not overwrite
+ * any files, just add new ones.
+ */
+ if (lstat(combined, &file_st))
+ {
+ if (!symlink(fontfile, combined))
+ result = wine_get_dos_file_name( combined );
+ }
+ else if (S_ISLNK(file_st.st_mode))
+ {
+ ssize_t size = readlink(combined, link_path, MAX_PATH-1);
+ if (size > 0)
+ {
+ link_path[size] = 0;
+
+ if (!strcmp(fontfile, link_path))
+ result = wine_get_dos_file_name( combined );
+ }
+ }
+
+ HeapFree(GetProcessHeap(), 0, combined);
+ return result;
+}
+
/*************************************************************
*
* This adds registry entries for any externally loaded fonts
@@ -2951,8 +3023,16 @@ static void update_reg_entries(void)
Family *family;
Face *face;
WCHAR *file, *path;
+ WCHAR fontsdir[MAX_PATH];
+ char *fontsdir_unix = NULL;
+
+ static const WCHAR fonts[] = {'\\','F','o','n','t','s','\0'};
static const WCHAR TrueType[] = {' ','(','T','r','u','e','T','y','p','e',')','\0'};
+ GetWindowsDirectoryW(fontsdir, sizeof(fontsdir) / sizeof(WCHAR));
+ strcatW(fontsdir, fonts); /* TODO: use something better */
+ fontsdir_unix = wine_get_unix_file_name(fontsdir);
+
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, winnt_font_reg_key,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL) != ERROR_SUCCESS) {
ERR("Can't create Windows font reg key\n");
@@ -2992,7 +3072,8 @@ static void update_reg_entries(void)
}
buffer = strWtoA( CP_UNIXCP, face->file );
- path = wine_get_dos_file_name( buffer );
+ path = add_font_symlink(fontsdir_unix, buffer);
+ if (!path) path = wine_get_dos_file_name( buffer );
HeapFree( GetProcessHeap(), 0, buffer );
if (path)
@@ -3015,15 +3096,73 @@ static void update_reg_entries(void)
if(external_key) RegCloseKey(external_key);
if(win9x_key) RegCloseKey(win9x_key);
if(winnt_key) RegCloseKey(winnt_key);
+ if(fontsdir_unix) HeapFree(GetProcessHeap(), 0, fontsdir_unix);
return;
}
+static BOOL stat_parent(char *filename, struct stat *parent_st)
+{
+ char *path, *p;
+ int length, result;
+
+ length = strlen(filename);
+ path = HeapAlloc(GetProcessHeap(), 0, length + 1);
+ if (!path) return FALSE;
+
+ /* copy including null character */
+ memcpy(path, filename, length + 1);
+
+ p = path + length - 1;
+
+ /* get parent */
+ while (p > path && *p != '/') p--;
+ while (p > path && *p == '/') p--;
+ p[1] = 0;
+
+ result = stat( path, parent_st );
+
+ HeapFree(GetProcessHeap(), 0, path);
+ return !result;
+}
+
+static void unlink_symlink_same_parent(WCHAR *path, struct stat *directory_st)
+{
+ char *path_unix;
+ struct stat file_st, parent_st;
+
+ path_unix = wine_get_unix_file_name(path);
+ if (!path_unix) return;
+
+ if (stat_parent(path_unix, &parent_st) &&
+ parent_st.st_dev == directory_st->st_dev &&
+ parent_st.st_ino == directory_st->st_ino)
+ {
+ if (!lstat( path_unix, &file_st ) && S_ISLNK(file_st.st_mode))
+ unlink(path_unix);
+ }
+
+ HeapFree(GetProcessHeap(), 0, path_unix);
+}
+
static void delete_external_font_keys(void)
{
HKEY winnt_key = 0, win9x_key = 0, external_key = 0;
DWORD dlen, vlen, datalen, valuelen, i, type;
- LPWSTR valueW;
- LPVOID data;
+ LPWSTR valueW, data;
+ WCHAR fontsdir[MAX_PATH];
+ char *fontsdir_unix = NULL;
+ struct stat fontdir_st;
+ static const WCHAR fonts[] = {'\\','F','o','n','t','s','\0'};
+
+ GetWindowsDirectoryW(fontsdir, sizeof(fontsdir) / sizeof(WCHAR));
+ strcatW(fontsdir, fonts); /* TODO: use something better */
+
+ fontsdir_unix = wine_get_unix_file_name(fontsdir);
+ if (!fontsdir_unix || stat( fontsdir_unix, &fontdir_st ))
+ {
+ fontdir_st.st_ino = 0;
+ fontdir_st.st_dev = 0;
+ }
if(RegCreateKeyExW(HKEY_LOCAL_MACHINE, winnt_font_reg_key,
0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL) != ERROR_SUCCESS) {
@@ -3047,17 +3186,38 @@ static void delete_external_font_keys(void)
RegQueryInfoKeyW(external_key, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
&valuelen, &datalen, NULL, NULL);
valuelen++; /* returned value doesn't include room for '\0' */
+ datalen++;
+
+ datalen *= sizeof(WCHAR);
+
valueW = HeapAlloc(GetProcessHeap(), 0, valuelen * sizeof(WCHAR));
- data = HeapAlloc(GetProcessHeap(), 0, datalen * sizeof(WCHAR));
+ data = HeapAlloc(GetProcessHeap(), 0, datalen);
- dlen = datalen * sizeof(WCHAR);
+ dlen = datalen;
vlen = valuelen;
i = 0;
- while(RegEnumValueW(external_key, i++, valueW, &vlen, NULL, &type, data,
+ while(RegEnumValueW(external_key, i++, valueW, &vlen, NULL, &type, (LPBYTE)data,
&dlen) == ERROR_SUCCESS) {
RegDeleteValueW(winnt_key, valueW);
RegDeleteValueW(win9x_key, valueW);
+
+ if (type == REG_SZ)
+ {
+ /*
+ * Depending on how the string was added, the returned length
+ * includes the null character or not. We try to add the character
+ * if it is missing or skip the string if it is not possible.
+ */
+ if (data[dlen-1] == 0)
+ unlink_symlink_same_parent(data, &fontdir_st);
+ else if (dlen < datalen)
+ {
+ data[dlen] = 0;
+ unlink_symlink_same_parent(data, &fontdir_st);
+ }
+ }
+
/* reset dlen and vlen */
dlen = datalen;
vlen = valuelen;
@@ -3072,6 +3232,7 @@ static void delete_external_font_keys(void)
end:
if(win9x_key) RegCloseKey(win9x_key);
if(winnt_key) RegCloseKey(winnt_key);
+ if(fontsdir_unix) HeapFree(GetProcessHeap(), 0, fontsdir_unix);
}
/*************************************************************
--
1.8.3.2

View File

@@ -0,0 +1,3 @@
Revision: 1
Author: Michael Müller
Title: Add symlinks for external fonts

View File

@@ -1,6 +1,6 @@
From 46663b2c660db111ba9a208929cec841caa9308a Mon Sep 17 00:00:00 2001
From 343eb8dc82b72e641dc239a339f2419bb7f936c9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Tue, 27 May 2014 02:53:05 +0200
Date: Sun, 20 Jul 2014 22:22:14 +0200
Subject: wined3d: allow changing strict drawing through an exported function
---
@@ -9,21 +9,21 @@ Subject: wined3d: allow changing strict drawing through an exported function
2 files changed, 7 insertions(+)
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index f1a45dd..7ee0914 100644
index a53c74b..7c9ebbd 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -277,3 +277,5 @@
@@ -271,3 +271,5 @@
@ cdecl wined3d_volume_map(ptr ptr ptr long)
@ cdecl wined3d_volume_preload(ptr)
@ cdecl wined3d_volume_set_priority(ptr long)
@ cdecl wined3d_volume_unmap(ptr)
+
+@ cdecl wined3d_strictdrawing_set(long)
\ No newline at end of file
diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c
index e2a7f3f..c160ae0 100644
index 7ab2448..8b4134d 100644
--- a/dlls/wined3d/wined3d_main.c
+++ b/dlls/wined3d/wined3d_main.c
@@ -509,6 +509,11 @@ void wined3d_unregister_window(HWND window)
@@ -505,6 +505,11 @@ void wined3d_unregister_window(HWND window)
wined3d_wndproc_mutex_unlock();
}

View File

@@ -1,14 +1,14 @@
From b1b13aac629c00d03d68dcca64cb81e976e20580 Mon Sep 17 00:00:00 2001
From 018b5f5d6211aa706e5aef762acb98d39240d9f1 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 3 Apr 2014 21:36:33 -0600
Date: Sun, 20 Jul 2014 22:29:02 +0200
Subject: wined3d: Silence repeated resource_check_usage FIXME.
---
dlls/wined3d/resource.c | 5 ++++-
dlls/wined3d/resource.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 3a54dd8..d164681 100644
index 2f44d36..5988c82 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -50,7 +50,7 @@ static DWORD resource_access_from_pool(enum wined3d_pool pool)
@@ -20,8 +20,8 @@ index 3a54dd8..d164681 100644
| WINED3DUSAGE_DEPTHSTENCIL
| WINED3DUSAGE_WRITEONLY
| WINED3DUSAGE_DYNAMIC
@@ -60,7 +60,10 @@ static void resource_check_usage(DWORD usage)
| WINED3DUSAGE_TEXTURE;
@@ -66,7 +66,10 @@ static void resource_check_usage(DWORD usage)
* driver. */
if (usage & ~handled)
+ {
@@ -32,5 +32,5 @@ index 3a54dd8..d164681 100644
WARN_(d3d_perf)("WINED3DUSAGE_DYNAMIC used without WINED3DUSAGE_WRITEONLY.\n");
}
--
1.7.9.5
1.8.3.2

View File

@@ -6,7 +6,7 @@ diff --git a/libs/wine/config.c b/libs/wine/config.c
index a273502..5fa0cd5 100644
--- a/libs/wine/config.c
+++ b/libs/wine/config.c
@@ -478,6 +478,44 @@ const char *wine_get_version(void)
@@ -478,6 +478,47 @@ const char *wine_get_version(void)
return PACKAGE_VERSION;
}
@@ -32,6 +32,9 @@ index a273502..5fa0cd5 100644
+ { "e46b26df-3c1b-419c-9579-f0d1e1c50bea:1", "Sebastian Lackner", "Workaround for broken implementation of shlwapi url functions." },
+ { "3790a2d5-f930-423e-9c03-f7fc1c1e0811:1", "Sebastian Lackner", "Partial implementation of WTSEnumerateProcessesW." },
+ { "a3f43350-092c-11e4-9b1e-0090f5c75ad5:1", "Joris van der Wel", "Implement passing ACLs to CreateProcess." },
+ { "c64ef9a8-0dd2-11e4-ab01-0090f5c75ad5:1", "Erich E. Hoover", "Fix possible race conditions in strmbase/quartz." },
+ { "748e5166-11ad-11e4-ae23-0090f5c75ad5:1", "Erich E. Hoover", "Return correct IMediaSeeking stream positions in quartz." },
+ { "bb1082ca-9960-4edb-a2ee-540ef8f1b834:1", "Michael Müller", "Add symlinks for external fonts" },
+ { "0b21d7ac-0387-4493-aa38-fbafe3e749f5:2", "Michael Müller", "Decrease minimum SetTimer interval to 5 ms." },
+ { "2394843e-2bc4-4fa4-8368-1ef32093b89e:1", "Michael Müller", "Allow changing strict draw ordering through an exported function." },
+ { "255473fa-4e0a-4f51-952b-4deecc1a2181:1", "Michael Müller", "Indicate direct rendering through OpenGL extension." },