[Libreoffice-commits] osl_areCommandArgsSet
Stephan Bergmann
sbergman at redhat.com
Thu Jul 31 01:48:38 PDT 2014
* osl_areCommandArgsSet should arguably have been given a return type of
sal_Bool, not int
* the documentation of osl_areCommandArgsSet is missing a @since tag;
please fix
* given that osl_setCommandArgs is deprecated and for internal use only,
osl_areCommandArgsSet should arguably have been added as internal-only
functionality ("detail" identifier namespace, "PRIVATE_" ELF symbol map
namespace); please at least mark it as internal-only in the documentation
* the implementations of osl_areCommandArgsSet
(sal/osl/unx/process_impl.cxx, sal/osl/w32/process.cxx) are broken as
they access g_command_args.m_nCount without the corresponding mutex
locked; please fix
* the design of osl_areCommandArgsSet and its use in
desktop/source/lib/init.cxx are broken, as it is prone to TOCTOU
* adding osl_areCommandArgsSet was unnecessary; given that
osl_setCommandArgs(0,NULL) is already handled as a special case, that
case can be extended to silently do nothing if osl_setCommandArgs has
already been called previously; please fix the LOK use-case that way
* "and possibly if UNO is being used in addition to LOK in an external
program": by design, osl_setCommandsArgs is exclusively called from
sal_detail_initialize, which in turn is exclusively called form
SAL_IMPLEMENT_MAIN[_WITH_ARGS], and every process that uses binary UNO
needs to implement main via those macros; note that
sal_detail_[de]initialize potentially does further things necessary for
binary UNO to work properly besides calling osl_setCommandArgs; it is
unwise to hack around that for the LOK use-case in an ad hoc way
* was it necessary to backport osl_areCommandArgsSet to LO 4.3 (given I
see no mention of LOK in
<https://wiki.documentfoundation.org/ReleaseNotes/4.3>)?
Stephan
On 07/10/2014 08:17 PM, Andrzej Hunt wrote:
> Rebased ref, commits from common ancestor:
> commit aef3fcd39558e424b816e5eb07a9421ab046ff0f
> Author: Andrzej Hunt <andrzej.hunt at collabora.com>
> Date: Thu Jul 10 12:19:36 2014 +0200
>
> Check whether Command Args are already set up before doing so.
>
> Could already be set up e.g. if a client application is using UNO
> separately, in addition to LOK.
>
> Change-Id: I50c3230b6f2456360273902a308c303576baac10
>
> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
> index e1931b5..520d7ca 100644
> --- a/desktop/source/lib/init.cxx
> +++ b/desktop/source/lib/init.cxx
> @@ -607,7 +607,14 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath)
>
> try
> {
> - osl_setCommandArgs(0, NULL);
> + // If we've set up the command args elsewhere then we cannot do it
> + // again (as an assert will fire), this will be the case e.g.
> + // for unit tests (and possibly if UNO is being used in addition
> + // to LOK in an external program).
> + if (!osl_areCommandArgsSet())
> + {
> + osl_setCommandArgs(0, NULL);
> + }
> initialize_uno(aAppURL);
> force_c_locale();
>
> commit 91e852a36d57e514dd4b1fb5421e9e5e19172ea4
> Author: Andrzej Hunt <andrzej.hunt at collabora.com>
> Date: Thu Jul 10 12:17:05 2014 +0200
>
> Introduce osl_areCommandArgsSet.
>
> We cannot call osl_setCommandArgs twice, however there is currently
> no way to determine whether or not this has already been done. This is
> necessary e.g. for LibreOfficeKit where we may also be using UNO
> separately (and also for unit tests where LO is already set-up prior
> to the unit test running, and therefore we can't set up osl again
> from within LOK).
>
> Change-Id: Id1f357ef604eb2b6b7814c9a04ac6933a39fd3eb
>
> diff --git a/include/osl/process.h b/include/osl/process.h
> index 7d0960e..1a9a416 100644
> --- a/include/osl/process.h
> +++ b/include/osl/process.h
> @@ -366,6 +366,11 @@ SAL_DLLPUBLIC sal_uInt32 SAL_CALL osl_getCommandArgCount(void);
> SAL_DLLPUBLIC oslProcessError SAL_CALL osl_getCommandArg(
> sal_uInt32 nArg, rtl_uString **strCommandArg);
>
> +/** Determine whether or not the command args have already been set.
> + @return The command args are already set, and may not be set again.
> +*/
> +SAL_DLLPUBLIC int SAL_CALL osl_areCommandArgsSet ();
> +
> /** Set the command-line arguments as passed to the main-function of this process.
>
> Deprecated: This function is only for internal use. Passing the args from main will
> diff --git a/sal/osl/unx/process_impl.cxx b/sal/osl/unx/process_impl.cxx
> index d28f46d..b63f222 100644
> --- a/sal/osl/unx/process_impl.cxx
> +++ b/sal/osl/unx/process_impl.cxx
> @@ -191,6 +191,11 @@ oslProcessError SAL_CALL osl_getCommandArg (sal_uInt32 nArg, rtl_uString ** strC
> return (result);
> }
>
> +int SAL_CALL osl_areCommandArgsSet (void)
> +{
> + return (g_command_args.m_nCount > 0);
> +}
> +
> /***************************************
> osl_setCommandArgs().
> **************************************/
> diff --git a/sal/osl/w32/process.cxx b/sal/osl/w32/process.cxx
> index 3dd0e77..25f4e58 100644
> --- a/sal/osl/w32/process.cxx
> +++ b/sal/osl/w32/process.cxx
> @@ -374,6 +374,12 @@ oslProcessError SAL_CALL osl_getCommandArg( sal_uInt32 nArg, rtl_uString **strCo
>
> /***************************************************************************/
>
> +int SAL_CALL osl_areCommandArgsSet(void)
> +{
> + return (g_command_args.m_nCount > 0);
> +}
> +
> +
> void SAL_CALL osl_setCommandArgs (int argc, char ** argv)
> {
> osl_acquireMutex (*osl_getGlobalMutex());
> diff --git a/sal/util/sal.map b/sal/util/sal.map
> index 1d7d491..6e95369 100644
> --- a/sal/util/sal.map
> +++ b/sal/util/sal.map
> @@ -677,6 +677,12 @@ LIBO_UDK_4.3 { # symbols available in >= LibO 4.3
> rtl_freeAlignedMemory;
> } LIBO_UDK_4.2;
>
> +LIBO_UDK_4.4 { # symbols available in >= LibO 4.4
> + global:
> + osl_areCommandArgsSet;
> +} LIBO_UDK_4.3;
> +
> +
> PRIVATE_1.0 {
> global:
> osl_detail_ObjectRegistry_storeAddresses;
More information about the LibreOffice
mailing list