[vlc-devel] [PATCH 1/2] compat: add realpath used by test_media_subitems()

Hugo Beauzée-Luyssen hugo at beauzee.fr
Thu Sep 15 10:53:33 CEST 2016


On 09/15/2016 10:44 AM, Steve Lhomme wrote:
> --
> replaces https://patches.videolan.org/patch/14469/
> * support non ASCII chars in pathes
> * use resolved_path if provided
> ---
>  compat/realpath.c    | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  configure.ac         |  3 +++
>  include/vlc_fixups.h |  4 ++++
>  3 files changed, 73 insertions(+)
>  create mode 100644 compat/realpath.c
>
> diff --git a/compat/realpath.c b/compat/realpath.c
> new file mode 100644
> index 0000000..635247c
> --- /dev/null
> +++ b/compat/realpath.c
> @@ -0,0 +1,66 @@
> +/*****************************************************************************
> + * realpath.c: POSIX realpath replacement
> + *****************************************************************************
> + * Copyright © 2016 VLC authors and VideoLAN
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include <config.h>
> +#endif
> +
> +#include <stdlib.h>
> +#ifdef _WIN32
> +#include <windows.h>
> +#endif
> +
> +char *realpath(const char * restrict relpath, char * restrict resolved_path)
> +{
> +#ifdef _WIN32
> +    int len = MultiByteToWideChar( CP_UTF8, 0, relpath, -1, NULL, 0 );
> +    if (len == 0)
> +        return NULL;
> +
> +    wchar_t *wrelpath = (wchar_t *)malloc(len * sizeof (wchar_t));
> +    if (wrelpath == NULL)
> +        return NULL;
> +
> +    MultiByteToWideChar( CP_UTF8, 0, relpath, -1, wrelpath, len );
> +
> +    wchar_t *wfullpath = _wfullpath( NULL, wrelpath, _MAX_PATH );

This seems to be leaking wrelpath

> +    if (wfullpath != NULL)
> +    {
> +        size_t len = WideCharToMultiByte( CP_UTF8, 0, wfullpath, -1, NULL, 0, NULL, NULL );
> +        if (len != 0)
> +        {
> +            if (resolved_path != NULL)
> +                len = len >= _MAX_PATH ? _MAX_PATH : len;
> +            else
> +                resolved_path = (char *)malloc(len);
> +
> +            if (resolved_path != NULL)
> +                WideCharToMultiByte( CP_UTF8, 0, wfullpath, -1, resolved_path, len, NULL, NULL );
> +            free(wfullpath);
> +            return resolved_path;
> +        }
> +        free(wfullpath);
> +    }
> +#else
> +    (void)resolved_path;
> +    (void)relpath;
> +#endif
> +    return NULL;
> +}
> diff --git a/configure.ac b/configure.ac
> index 59f116e..cec9e56 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -604,6 +604,9 @@ AC_CHECK_FUNCS(fdatasync,,
>    [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.])
>  ])
>
> +dnl for tests
> +VLC_REPLACE_DECL([realpath], [#include <stdlib.h>])
> +
>  dnl mingw64 implements those as static inline, not functions with C linkage
>  VLC_REPLACE_DECL([asprintf], [#include <stdio.h>])
>  VLC_REPLACE_DECL([vasprintf], [#include <stdio.h>])
> diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h
> index a14764f..2992796 100644
> --- a/include/vlc_fixups.h
> +++ b/include/vlc_fixups.h
> @@ -473,6 +473,10 @@ void freeaddrinfo (struct addrinfo *res);
>  #define nanf(tagp) NAN
>  #endif
>
> +#ifndef HAVE_REALPATH
> +char *realpath(const char * restrict pathname, char * restrict resolved_path);
> +#endif
> +
>  #ifdef _WIN32
>  FILE *vlc_win32_tmpfile(void);
>  #endif
>



More information about the vlc-devel mailing list