This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] DCIGETTEXT: Use getcwd, asprintf to construct absolute pathname



On 19/06/2017 13:17, Florian Weimer wrote:
> 2017-06-19  Florian Weimer  <fweimer@redhat.com>
> 
> 	* intl/dcigettext.c (DCIGETTEXT): Use getcwd (NULL, 0) and
> 	asprintf to construct an absolute pathname.

LGTM.

> 
> diff --git a/intl/dcigettext.c b/intl/dcigettext.c
> index 49127d0..0e79b1f 100644
> --- a/intl/dcigettext.c
> +++ b/intl/dcigettext.c
> @@ -59,6 +59,7 @@ extern int errno;
>  
>  #include <stddef.h>
>  #include <stdlib.h>
> +#include <stdio.h>
>  #include <string.h>
>  
>  #if defined HAVE_UNISTD_H || defined _LIBC
> @@ -495,6 +496,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
>    const char *categoryname;
>    const char *categoryvalue;
>    const char *dirname;
> +  char *xdirname = NULL;
>    char *xdomainname;
>    char *single_locale;
>    char *retval;
> @@ -624,35 +626,17 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
>        if (!IS_ABSOLUTE_PATH (dirname))
>  	{
>  	  /* We have a relative path.  Make it absolute now.  */
> -	  size_t dirname_len = strlen (dirname) + 1;
> -	  size_t path_max;
> -	  char *resolved_dirname;
> -	  char *ret;
> -
> -	  path_max = (unsigned int) PATH_MAX;
> -	  path_max += 2;		/* The getcwd docs say to do this.  */
> -
> -	  for (;;)
> -	    {
> -	      resolved_dirname = (char *) alloca (path_max + dirname_len);
> -	      ADD_BLOCK (block_list, tmp_dirname);
> -
> -	      __set_errno (0);
> -	      ret = getcwd (resolved_dirname, path_max);
> -	      if (ret != NULL || errno != ERANGE)
> -		break;
> -
> -	      path_max += path_max / 2;
> -	      path_max += PATH_INCR;
> -	    }
> -
> -	  if (ret == NULL)
> -	    /* We cannot get the current working directory.  Don't signal an
> -	       error but simply return the default string.  */
> +	  char *cwd = getcwd (NULL, 0);
> +	  if (cwd == NULL)
> +	    /* We cannot get the current working directory.  Don't
> +	       signal an error but simply return the default
> +	       string.  */
>  	    goto return_untranslated;
> -
> -	  stpcpy (stpcpy (strchr (resolved_dirname, '\0'), "/"), dirname);
> -	  dirname = resolved_dirname;
> +	  int ret = __asprintf (&xdirname, "%s/%s", cwd, dirname);
> +	  free (cwd);
> +	  if (ret < 0)
> +	      return NULL;
> +	  dirname = xdirname;
>  	}
>  #ifndef IN_LIBGLOCALE
>      }
> @@ -767,6 +751,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
>  	    {
>  	      /* Found the translation of MSGID1 in domain DOMAIN:
>  		 starting at RETVAL, RETLEN bytes.  */
> +	      free (xdirname);
>  	      FREE_BLOCKS (block_list);
>  	      if (foundp == NULL)
>  		{
> @@ -850,6 +835,7 @@ DCIGETTEXT (const char *domainname, const char *msgid1, const char *msgid2,
>  
>   return_untranslated:
>    /* Return the untranslated MSGID.  */
> +  free (xdirname);
>    FREE_BLOCKS (block_list);
>    gl_rwlock_unlock (_nl_state_lock);
>  #ifdef _LIBC
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]