Boost logo

Boost :

Subject: Re: [boost] [interprocess] SHARING_VIOLATION due to antivirus
From: Lars Hagstrom (lars_at_[hidden])
Date: 2009-08-19 03:40:07


I made a quick patch to create_file in win32_api.hpp (the patch is
rather verbose, to make its workings obvious):

static inline void *create_file(const char *name, unsigned long access,
unsigned long creation_flags, unsigned long attributes = 0)
{
     int tries = 0;
     for (;;)
     {
         void * const res = CreateFileA(name, access, file_share_read |
file_share_write | file_share_delete, 0, creation_flags, attributes, 0);
         if (tries > 100)
         {
             //ran out of attempts, return and let the exceptions fly
             return res;
         }
         if (res != invalid_handle_value)
         {
             //all went well, return
             return res;
         }
         else if (GetLastError() != 32)
         {
             //we got some other error than an ERROR_SHARING_VIOLATION,
             //let the caller handle the error.
             return res;
         }

         Sleep(1);
         ++tries;
     }
}

With this added my program works fine. I'm not sure whether this sort of
stuff is needed in any of the other functions in win32_api.hpp.

Cheers
Lars

Lars Hagstrom wrote:
> Hi,
>
> I've discovered that there is some unfortunate interaction of
> boost::interprocess and at least one antivirus product (ESET Nod32). The
> problem manifests on some installations, and the symptom is that an
> interprocess_exception with a native error code of 32
> (ERROR_SHARING_VIOLATION) occurs when a named_semaphore (or other named
> objects) are opened (well, I've only seen it when opening, but depending
> on the AV product I guess it may happen when creating as well).
>
> Googling a bit on this I found http://support.microsoft.com/kb/316609,
> which suggests that AV products take exclusive locks on files just as a
> file is being opened, which sometimes upsets calls to CreateFile. What
> they suggest is doing retries when a sharing violation occurs.
>
> I'm not really saying that this is a boost.interprocess bug, but at
> least for me it would be handy if it was a little bit more tolerant
> towards AV products.
>
> I've managed (after quite a lot of hard work) to get a test environment
> where I can reproduce this quite easily, so I'm more than willing to
> help out with testing.
>
> Cheers
> Lars
>


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk