[RESEND]MSI:ACTION_AppSearchReg() should return backslash terminated paths - Solves bug 13838

James Hawkins truiken at gmail.com
Mon Jul 7 11:30:17 CDT 2008


On Mon, Jul 7, 2008 at 10:04 AM, Massimo Del Fedele <max at veneto.com> wrote:
> I'll repost that one... I'd like some feedback if it looks wrong.
>

This isn't going to be committed without a test.

> To maintain consistence between global MSI path properties (as
> CommonAppDataFolder) which are returned with a trailing backslash, and
> local MSI path properties (as LOCALAPPDATAFOLDER) which by now where
> returned without the trailing backslash.

Properties in MSI are just that...properties.  Folders loaded from the
Folder table just happen to be stored as properties.  The AppSearch
action looks for a path (in this case) and sets a user-defined
property to the path of the directory.  You're making a connection
between these two completely separated sets of functionality that
doesn't exist.

> This solves autocad's installer bug 13838.
>

Ok, we've had tons of patches submitted, some committed, that fix one
app and break tons of other apps.  This is exactly why this has to be
backed up by a test.

I'll review your patch for you anyway:

@@ -368,6 +368,17 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE
*package, LPWSTR *appValue, MSISIGNAT
     switch (type & 0x0f)
     {
     case msidbLocatorTypeDirectory:
+	/* directories should be returned with a trailing backslash
+           so check for it and append if necessary */

Leave the comment out.

+        if((LPWSTR)value[sz-1] != L'\\')
+        {

Two things wrong.  That first part is casting the result of
value[sz-1], which is a BYTE (integer), to LPWSTR (pointer).  Second,
you can't use L in Wine.

+            *appValue = (LPWSTR)value;
+            value = msi_alloc(sz+1);

You forgot to check if you're out of memory.

+            lstrcpyW((LPWSTR)value, *appValue);
+            lstrcatW(value, L"\\");

Again, can't use L in Wine.

+            msi_free(*appValue);
+            *appValue = NULL;
+        }
         rc = ACTION_SearchDirectory(package, sig, (LPWSTR)value, 0, appValue);
         break;
     case msidbLocatorTypeFileName:

Now let's look at the whole thing:

            *appValue = (LPWSTR)value;
            value = msi_alloc(sz+1);
            lstrcpyW((LPWSTR)value, *appValue);
            lstrcatW(value, L"\\");
            msi_free(*appValue);
            *appValue = NULL;

You're using *appValue as a temporary pointer, which is ugly.
msi_realloc is your friend.

Check out the warnings you get when you compile this, which is the
first sign that something is wrong:

appsearch.c: In function 'ACTION_AppSearchReg':
appsearch.c:373: warning: cast to pointer from integer of different size
appsearch.c:373: warning: comparison between pointer and integer
appsearch.c:378: warning: passing argument 1 of 'lstrcatW' from
incompatible pointer type
appsearch.c:378: warning: passing argument 2 of 'lstrcatW' from
incompatible pointer type

Taking one more step back:

@@ -368,6 +368,17 @@ static UINT ACTION_AppSearchReg(MSIPACKAGE
*package, LPWSTR *appValue, MSISIGNAT
     switch (type & 0x0f)
     {
     case msidbLocatorTypeDirectory:
+	/* directories should be returned with a trailing backslash
+           so check for it and append if necessary */

So this 'fix' is only for ACTION_AppSearchReg.  What about all the
other AppSearch functionalities that also search for a directory?
Those will remain unfixed.  Also, why are you making it the
responsibility of AppSearchReg to add the backslash?  You're assuming
that ACTION_SearchDirectory never changes the value sent in and only
copies it straight back if it finds the path.  That's a bad
assumption.  Plus, if you fix this at the lowest level, you get a fix
for all the AppSearch functionalities for free.

-- 
James Hawkins



More information about the wine-devel mailing list