NPN_MemAlloc после NPN_MemFree привинчивает возвращаемые данные в Google Chrome - PullRequest
1 голос
/ 14 сентября 2010

Я закончил свой плагин NPAPI, и он отлично работает в Google Chrome, но есть странная проблема. Проблема в том, что я закодировал метод в плагине, который возвращает строку в браузер. Для этого вам необходимо выделить память в браузере и скопировать полученную строку в него. Что-то вроде:

bool
ScriptablePluginObject::Invoke(NPIdentifier name, const NPVariant *args,
                               uint32_t argCount, NPVariant *result)
{
    if (name == sMethod_id) {
  ...

  //free the memory if it is already allocated
  if (m_pPtr) NPN_MemFree(m_pPtr);

  //allocate the string in the browser memory
  m_pPtr = (char*)NPN_MemAlloc(size+1);
  SecureZeroMemory(m_pPtr, size+1);
  memcpy(m_pATR, string, size);

  //send result to browser
  STRINGZ_TO_NPVARIANT(m_pPtr, *result);

  return true;
 }
  ...

}

Обратите внимание, что 'm_pPtr' является членом данных класса и инициализируется значением NULL при создании. Проблема возникает, когда я дважды вызываю этот метод из Google Chrome. В первый раз это прекрасно работает. Со второго раза и так далее он возвращает значение мусора, отображаемое в браузере как «X». Я протестировал тот же плагин в Firefox, и он отлично работает и возвращает правильное значение, независимо от того, сколько раз я вызываю метод. Но когда я закрываю страницу с загруженным плагином, Firefox вылетает.

Любые указатели на то, что происходит в этой странной ситуации, приветствуются. Я работаю над этим и обновлю тему, как только получу полезную информацию.

1 Ответ

1 голос
/ 22 сентября 2010

Вам необходимо удалить следующую строку:

if (m_pPtr) NPN_MemFree(m_pPtr);

Вы возвращаете строку в скрипт, и вызывающая сторона (в данном случае движок JavaScript браузера) владеет ею.

Если вы освободите его, это приведет к неопределенному поведению , так как память все еще может использоваться или уже повторно использоваться или освобождаться браузером.

...