Smack: add the execute lable to ldconfig
[platform/upstream/glibc.git] / posix / glob.c
index 4c7dce5..5b92776 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991-2013 Free Software Foundation, Inc.
+/* Copyright (C) 1991-2015 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 # define GET_LOGIN_NAME_MAX()  (-1)
 #endif
 \f
-static const char *next_brace_sub (const char *begin, int flags) __THROW;
+static const char *next_brace_sub (const char *begin, int flags) __THROWNL;
 
 #endif /* !defined _LIBC || !defined GLOB_ONLY_P */
 
@@ -208,8 +208,8 @@ extern int __glob_pattern_type (const char *pattern, int quote)
     attribute_hidden;
 
 #if !defined _LIBC || !defined GLOB_ONLY_P
-static int prefix_array (const char *prefix, char **array, size_t n) __THROW;
-static int collated_compare (const void *, const void *) __THROW;
+static int prefix_array (const char *prefix, char **array, size_t n) __THROWNL;
+static int collated_compare (const void *, const void *) __THROWNL;
 
 
 /* Find the end of the sub-pattern in a brace expression.  */
@@ -276,6 +276,11 @@ glob (pattern, flags, errfunc, pglob)
       return -1;
     }
 
+  /* POSIX requires all slashes to be matched.  This means that with
+     a trailing slash we must match only directories.  */
+  if (pattern[0] && pattern[strlen (pattern) - 1] == '/')
+    flags |= GLOB_ONLYDIR;
+
   if (!(flags & GLOB_DOOFFS))
     /* Have to do this so `globfree' knows where to start freeing.  It
        also makes all the code that uses gl_offs simpler. */
@@ -349,7 +354,7 @@ glob (pattern, flags, errfunc, pglob)
              /* It is an illegal expression.  */
            illegal_brace:
 #ifdef _LIBC
-             if (__builtin_expect (!alloca_onealt, 0))
+             if (__glibc_unlikely (!alloca_onealt))
 #endif
                free (onealt);
              return glob (pattern, flags & ~GLOB_BRACE, errfunc, pglob);
@@ -399,7 +404,7 @@ glob (pattern, flags, errfunc, pglob)
              if (result && result != GLOB_NOMATCH)
                {
 #ifdef _LIBC
-                 if (__builtin_expect (!alloca_onealt, 0))
+                 if (__glibc_unlikely (!alloca_onealt))
 #endif
                    free (onealt);
                  if (!(flags & GLOB_APPEND))
@@ -420,7 +425,7 @@ glob (pattern, flags, errfunc, pglob)
            }
 
 #ifdef _LIBC
-         if (__builtin_expect (!alloca_onealt, 0))
+         if (__glibc_unlikely (!alloca_onealt))
 #endif
            free (onealt);
 
@@ -483,7 +488,7 @@ glob (pattern, flags, errfunc, pglob)
        }
       else
        {
-         if (__builtin_expect (pattern[0] == '\0', 0))
+         if (__glibc_unlikely (pattern[0] == '\0'))
            {
              dirs.gl_pathv = NULL;
              goto no_matches;
@@ -666,7 +671,7 @@ glob (pattern, flags, errfunc, pglob)
                                                2 * pwbuflen);
                          if (newp == NULL)
                            {
-                             if (__builtin_expect (malloc_pwtmpbuf, 0))
+                             if (__glibc_unlikely (malloc_pwtmpbuf))
                                free (pwtmpbuf);
                              retval = GLOB_NOSPACE;
                              goto out;
@@ -712,7 +717,7 @@ glob (pattern, flags, errfunc, pglob)
            {
              if (flags & GLOB_TILDE_CHECK)
                {
-                 if (__builtin_expect (malloc_home_dir, 0))
+                 if (__glibc_unlikely (malloc_home_dir))
                    free (home_dir);
                  retval = GLOB_NOMATCH;
                  goto out;
@@ -725,7 +730,7 @@ glob (pattern, flags, errfunc, pglob)
          /* Now construct the full directory.  */
          if (dirname[1] == '\0')
            {
-             if (__builtin_expect (malloc_dirname, 0))
+             if (__glibc_unlikely (malloc_dirname))
                free (dirname);
 
              dirname = home_dir;
@@ -745,7 +750,7 @@ glob (pattern, flags, errfunc, pglob)
                  newp = malloc (home_len + dirlen);
                  if (newp == NULL)
                    {
-                     if (__builtin_expect (malloc_home_dir, 0))
+                     if (__glibc_unlikely (malloc_home_dir))
                        free (home_dir);
                      retval = GLOB_NOSPACE;
                      goto out;
@@ -755,7 +760,7 @@ glob (pattern, flags, errfunc, pglob)
              mempcpy (mempcpy (newp, home_dir, home_len),
                       &dirname[1], dirlen);
 
-             if (__builtin_expect (malloc_dirname, 0))
+             if (__glibc_unlikely (malloc_dirname))
                free (dirname);
 
              dirname = newp;
@@ -854,7 +859,7 @@ glob (pattern, flags, errfunc, pglob)
                if (pwtmpbuf == NULL)
                  {
                  nomem_getpw:
-                   if (__builtin_expect (malloc_user_name, 0))
+                   if (__glibc_unlikely (malloc_user_name))
                      free (user_name);
                    retval = GLOB_NOSPACE;
                    goto out;
@@ -879,7 +884,7 @@ glob (pattern, flags, errfunc, pglob)
                                          2 * buflen);
                    if (newp == NULL)
                      {
-                       if (__builtin_expect (malloc_pwtmpbuf, 0))
+                       if (__glibc_unlikely (malloc_pwtmpbuf))
                          free (pwtmpbuf);
                        goto nomem_getpw;
                      }
@@ -892,7 +897,7 @@ glob (pattern, flags, errfunc, pglob)
            p = getpwnam (user_name);
 #  endif
 
-           if (__builtin_expect (malloc_user_name, 0))
+           if (__glibc_unlikely (malloc_user_name))
              free (user_name);
 
            /* If we found a home directory use this.  */
@@ -901,7 +906,7 @@ glob (pattern, flags, errfunc, pglob)
                size_t home_len = strlen (p->pw_dir);
                size_t rest_len = end_name == NULL ? 0 : strlen (end_name);
 
-               if (__builtin_expect (malloc_dirname, 0))
+               if (__glibc_unlikely (malloc_dirname))
                  free (dirname);
                malloc_dirname = 0;
 
@@ -913,7 +918,7 @@ glob (pattern, flags, errfunc, pglob)
                    dirname = malloc (home_len + rest_len + 1);
                    if (dirname == NULL)
                      {
-                       if (__builtin_expect (malloc_pwtmpbuf, 0))
+                       if (__glibc_unlikely (malloc_pwtmpbuf))
                          free (pwtmpbuf);
                        retval = GLOB_NOSPACE;
                        goto out;
@@ -926,12 +931,12 @@ glob (pattern, flags, errfunc, pglob)
                dirlen = home_len + rest_len;
                dirname_modified = 1;
 
-               if (__builtin_expect (malloc_pwtmpbuf, 0))
+               if (__glibc_unlikely (malloc_pwtmpbuf))
                  free (pwtmpbuf);
              }
            else
              {
-               if (__builtin_expect (malloc_pwtmpbuf, 0))
+               if (__glibc_unlikely (malloc_pwtmpbuf))
                  free (pwtmpbuf);
 
                if (flags & GLOB_TILDE_CHECK)
@@ -1030,7 +1035,7 @@ glob (pattern, flags, errfunc, pglob)
            *(char *) &dirname[--dirlen] = '\0';
        }
 
-      if (__builtin_expect ((flags & GLOB_ALTDIRFUNC) != 0, 0))
+      if (__glibc_unlikely ((flags & GLOB_ALTDIRFUNC) != 0))
        {
          /* Use the alternative access functions also in the recursive
             call.  */
@@ -1248,7 +1253,7 @@ glob (pattern, flags, errfunc, pglob)
     }
 
  out:
-  if (__builtin_expect (malloc_dirname, 0))
+  if (__glibc_unlikely (malloc_dirname))
     free (dirname);
 
   return retval;
@@ -1525,7 +1530,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
           of the function to copy this name into the result.  */
        flags |= GLOB_NOCHECK;
 
-      if (__builtin_expect (!alloca_fullname, 0))
+      if (__glibc_unlikely (!alloca_fullname))
        free (fullname);
     }
   else
@@ -1568,7 +1573,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
                }
              d64buf;
 
-             if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+             if (__glibc_unlikely (flags & GLOB_ALTDIRFUNC))
                {
                  struct dirent *d32 = (*pglob->gl_readdir) (stream);
                  if (d32 != NULL)
@@ -1727,7 +1732,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags,
   if (stream != NULL)
     {
       save = errno;
-      if (__builtin_expect (flags & GLOB_ALTDIRFUNC, 0))
+      if (__glibc_unlikely (flags & GLOB_ALTDIRFUNC))
        (*pglob->gl_closedir) (stream);
       else
        closedir (stream);