summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAloisio Almeida Jr <aloisio.almeida@openbosssa.org>2008-08-01 18:15:09 -0300
committerRodrigo Vivi <rodrigo.vivi@openbossa.org>2008-10-23 17:55:58 -0300
commit536e078b7ac3f622801c252303d0b24d05e1ab7e (patch)
tree1bdaa5d04ffd2e52639a7c245f6164c16c52e02b
parenta4493a930cab5f6fc658cbc882451980b7c382d5 (diff)
bash-noemu: Adding patch to prevent dlopen in runtime
The solution adopted was "copy" the following libc functions from libc: * setpwent * endpwent * getpwent * getpwuid With this patch bash looses the capability of NSS, it will just read info from /etc/passwd file
-rw-r--r--packages/mamona/bash-noemu-3.2/006-add_internal_libcpwd_functions.patch752
-rw-r--r--packages/mamona/bash-noemu_3.2.bb3
2 files changed, 754 insertions, 1 deletions
diff --git a/packages/mamona/bash-noemu-3.2/006-add_internal_libcpwd_functions.patch b/packages/mamona/bash-noemu-3.2/006-add_internal_libcpwd_functions.patch
new file mode 100644
index 0000000000..c0f501dcbc
--- /dev/null
+++ b/packages/mamona/bash-noemu-3.2/006-add_internal_libcpwd_functions.patch
@@ -0,0 +1,752 @@
+Index: bash-3.2/libcnisint.c
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ bash-3.2/libcnisint.c 2008-08-01 17:52:42.000000000 -0300
+@@ -0,0 +1,296 @@
++#include "libcnisint.h"
++
++#include <stdlib.h>
++#include <stdio.h>
++#include <errno.h>
++#include <string.h>
++
++# undef ENTDATA
++
++struct parser_data
++ {
++#ifdef ENTDATA
++ struct ENTDATA entdata;
++# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata;
++#else
++# define ENTDATA_DECL(data)
++#endif
++ char linebuffer[0];
++ };
++
++
++static FILE *stream = NULL;
++static struct passwd passwd;
++static char buffer[NSS_BUFLEN_PASSWD];
++
++# define STRING_FIELD(variable, terminator_p, swallow) \
++ { \
++ variable = line; \
++ while (*line != '\0' && !terminator_p (*line)) \
++ ++line; \
++ if (*line != '\0') \
++ { \
++ *line = '\0'; \
++ do \
++ ++line; \
++ while (swallow && terminator_p (*line)); \
++ } \
++ }
++
++# define STRUCTURE passwd
++# define TRAILING_LIST_PARSER
++
++# define LINE_PARSER(EOLSET, BODY) \
++int parse_line (char *line, struct STRUCTURE *result, \
++ struct parser_data *data, size_t datalen) \
++{ \
++ ENTDATA_DECL (data) \
++ char *p = strpbrk (line, EOLSET "\n"); \
++ if (p != NULL) \
++ *p = '\0'; \
++ BODY; \
++ TRAILING_LIST_PARSER; \
++ return 1; \
++}
++
++# define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default) \
++ { \
++ char *endp; \
++ if (*line == '\0') \
++ /* We expect some more input, so don't allow the string to end here. */ \
++ return 0; \
++ variable = convert (strtoul (line, &endp, base)); \
++ if (endp == line) \
++ variable = default; \
++ if (terminator_p (*endp)) \
++ do \
++ ++endp; \
++ while (swallow && terminator_p (*endp)); \
++ else if (*endp != '\0') \
++ return 0; \
++ line = endp; \
++ }
++
++# define INT_FIELD(variable, terminator_p, swallow, base, convert) \
++ { \
++ char *endp; \
++ variable = convert (strtoul (line, &endp, base)); \
++ if (endp == line) \
++ return 0; \
++ else if (terminator_p (*endp)) \
++ do \
++ ++endp; \
++ while (swallow && terminator_p (*endp)); \
++ else if (*endp != '\0') \
++ return 0; \
++ line = endp; \
++ }
++
++# define ISCOLON(c) ((c) == ':')
++
++LINE_PARSER (,
++ STRING_FIELD (result->pw_name, ISCOLON, 0)
++ if (line[0] == '\0'
++ && (result->pw_name[0] == '+' || result->pw_name[0] == '-'))
++ {
++ /* This a special case. We allow lines containing only a `+' sign
++ since this is used for nss_compat. All other services will
++ reject this entry later. Initialize all other fields now. */
++ result->pw_passwd = NULL;
++ result->pw_uid = 0;
++ result->pw_gid = 0;
++ result->pw_gecos = NULL;
++ result->pw_dir = NULL;
++ result->pw_shell = NULL;
++ }
++ else
++ {
++ STRING_FIELD (result->pw_passwd, ISCOLON, 0)
++ if (result->pw_name[0] == '+' || result->pw_name[0] == '-')
++ {
++ INT_FIELD_MAYBE_NULL (result->pw_uid, ISCOLON, 0, 10, , 0)
++ INT_FIELD_MAYBE_NULL (result->pw_gid, ISCOLON, 0, 10, , 0)
++ }
++ else
++ {
++ INT_FIELD (result->pw_uid, ISCOLON, 0, 10,)
++ INT_FIELD (result->pw_gid, ISCOLON, 0, 10,)
++ }
++ STRING_FIELD (result->pw_gecos, ISCOLON, 0)
++ STRING_FIELD (result->pw_dir, ISCOLON, 0)
++ result->pw_shell = line;
++ }
++ )
++
++
++void internal_setpwent (void)
++{
++ if (stream == NULL)
++ {
++ stream = fopen ("/etc/passwd", "rme");
++
++ if (stream == NULL)
++ fprintf (stderr, "ERROR: Cannot fopen \"/etc/passwd\". Errno: %d", errno);
++ }
++ else
++ rewind (stream);
++
++}
++
++void internal_endpwent (void)
++{
++ if (stream != NULL)
++ {
++ fclose (stream);
++ stream = NULL;
++ }
++}
++
++struct passwd *internal_getpwent (void)
++{
++ struct parser_data *data = (void *) &buffer;
++ struct passwd *result = &passwd;
++ int buflen = NSS_BUFLEN_PASSWD;
++
++ while (1)
++ {
++ fpos_t pos;
++ char *p;
++ int parse_res;
++
++ do
++ {
++ /* We need at least 3 characters for one line. */
++ if (buflen < 3)
++ {
++ erange:
++ fprintf (stderr, "ERROR: Range error");
++ return NULL;
++ }
++
++ fgetpos (stream, &pos);
++ buffer[buflen - 1] = '\xff';
++ p = fgets (buffer, buflen, stream);
++ if (p == NULL && feof (stream))
++ return NULL;
++
++ if (p == NULL || buffer[buflen - 1] != '\xff')
++ {
++ erange_reset:
++ fsetpos (stream, &pos);
++ goto erange;
++ }
++
++ /* Terminate the line for any case. */
++ buffer[buflen - 1] = '\0';
++
++ /* Skip leading blanks. */
++ while (isspace (*p))
++ ++p;
++ }
++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
++ /* Parse the line. If it is invalid, loop to
++ get the next line of the file to parse. */
++ !(parse_res = parse_line (p, result, data, buflen)));
++
++ if (parse_res == -1)
++ /* The parser ran out of space. */
++ goto erange_reset;
++
++ if (result->pw_name[0] != '+' && result->pw_name[0] != '-')
++ /* This is a real entry. */
++ break;
++
++ /* XXX Ignoring
++ *
++ * -@netgroup
++ * +@netgroup
++ * -user
++ * +user
++ * +:...
++ *
++ * as we don't suppose to use them */
++
++ }
++
++ return result;
++
++}
++
++/* Searches in /etc/passwd and the NSS subsystem for a special user id */
++struct passwd *internal_getpwuid (uid_t uid)
++{
++ struct parser_data *data = (void *) buffer;
++ struct passwd *result = &passwd;
++ int buflen = NSS_BUFLEN_PASSWD;
++
++ internal_setpwent ();
++
++ while (1)
++ {
++ fpos_t pos;
++ char *p;
++ int parse_res;
++
++ do
++ {
++ /* We need at least 3 characters for one line. */
++ if (buflen < 3)
++ {
++ erange:
++ fprintf (stderr, "ERROR: Range error");
++ return NULL;
++ }
++
++ fgetpos (stream, &pos);
++ buffer[buflen - 1] = '\xff';
++ p = fgets (buffer, buflen, stream);
++ if (p == NULL && feof (stream))
++ return NULL;
++
++ if (p == NULL || buffer[buflen - 1] != '\xff')
++ {
++ erange_reset:
++ fsetpos (stream, &pos);
++ goto erange;
++ }
++
++ /* Terminate the line for any case. */
++ buffer[buflen - 1] = '\0';
++
++ /* Skip leading blanks. */
++ while (isspace (*p))
++ ++p;
++ }
++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */
++ /* Parse the line. If it is invalid, loop to
++ get the next line of the file to parse. */
++ !(parse_res = parse_line (p, result, data, buflen)));
++
++ if (parse_res == -1)
++ /* The parser ran out of space. */
++ goto erange_reset;
++
++ /* This is a real entry. */
++ if (result->pw_name[0] != '+' && result->pw_name[0] != '-')
++ {
++ if (result->pw_uid == uid)
++ return result;
++ else
++ continue;
++ }
++
++ /* XXX Ignoring
++ *
++ * -@netgroup
++ * +@netgroup
++ * -user
++ * +user
++ * +:...
++ *
++ * as we don't suppose to use them */
++
++ }
++ internal_endpwent ();
++ return result;
++}
+Index: bash-3.2/libcnisint.h
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ bash-3.2/libcnisint.h 2008-08-01 17:18:20.000000000 -0300
+@@ -0,0 +1,7 @@
++#include <pwd.h>
++
++void internal_setpwent (void);
++void internal_endpwent (void);
++struct passwd *internal_getpwent (void);
++struct passwd *internal_getpwuid (uid_t uid);
++
+Index: bash-3.2/examples/loadables/finfo.c
+===================================================================
+--- bash-3.2.orig/examples/loadables/finfo.c 2008-08-01 14:29:55.000000000 -0300
++++ bash-3.2/examples/loadables/finfo.c 2008-08-01 15:32:37.000000000 -0300
+@@ -9,7 +9,6 @@
+ #include <sys/types.h>
+ #include "posixstat.h"
+ #include <stdio.h>
+-#include <pwd.h>
+ #include <grp.h>
+ #include <errno.h>
+
+@@ -18,6 +17,8 @@
+ #include "builtins.h"
+ #include "common.h"
+
++#include "libcnisint.h"
++
+ #ifndef errno
+ extern int errno;
+ #endif
+@@ -262,7 +263,7 @@
+ printf("Mode: (%o) ", (int) st->st_mode);
+ printmode((int) st->st_mode);
+ printf("Link count: %d\n", (int) st->st_nlink);
+- pw = getpwuid(st->st_uid);
++ pw = internal_getpwuid(st->st_uid);
+ owner = pw ? pw->pw_name : "unknown";
+ printf("Uid of owner: %d (%s)\n", (int) st->st_uid, owner);
+ gr = getgrgid(st->st_gid);
+@@ -341,7 +342,7 @@
+ else if (flags & OPT_PMASK)
+ printf("%o\n", getperm(st->st_mode) & pmask);
+ else if (flags & OPT_UID) {
+- pw = getpwuid(st->st_uid);
++ pw = internal_getpwuid(st->st_uid);
+ if (flags & OPT_ASCII)
+ printf("%s\n", pw ? pw->pw_name : "unknown");
+ else
+Index: bash-3.2/examples/loadables/id.c
+===================================================================
+--- bash-3.2.orig/examples/loadables/id.c 2008-08-01 14:17:24.000000000 -0300
++++ bash-3.2/examples/loadables/id.c 2008-08-01 14:51:23.000000000 -0300
+@@ -12,7 +12,6 @@
+ #include <config.h>
+ #include <stdio.h>
+ #include "bashtypes.h"
+-#include <pwd.h>
+ #include <grp.h>
+ #include "bashansi.h"
+
+@@ -22,9 +21,8 @@
+ # include <sys/param.h>
+ #endif
+
+-#if !defined (HAVE_GETPW_DECLS)
+-extern struct passwd *getpwuid ();
+-#endif
++#include "libcnisint.h"
++
+ extern struct group *getgrgid ();
+
+ #include "shell.h"
+@@ -152,7 +150,7 @@
+ r = 0;
+ if (id_flags & ID_USENAME)
+ {
+- pwd = getpwuid (uid);
++ pwd = internal_getpwuid (uid);
+ if (pwd == NULL)
+ r = 1;
+ }
+@@ -233,7 +231,7 @@
+
+ r = 0;
+ printf ("uid=%u", (unsigned) ruid);
+- pwd = getpwuid (ruid);
++ pwd = internal_getpwuid (ruid);
+ if (pwd == NULL)
+ r = 1;
+ else
+@@ -249,7 +247,7 @@
+ if (euid != ruid)
+ {
+ printf (" euid=%u", (unsigned) euid);
+- pwd = getpwuid (euid);
++ pwd = internal_getpwuid (euid);
+ if (pwd == NULL)
+ r = 1;
+ else
+Index: bash-3.2/lib/readline/complete.c
+===================================================================
+--- bash-3.2.orig/lib/readline/complete.c 2008-07-31 19:06:06.000000000 -0300
++++ bash-3.2/lib/readline/complete.c 2008-08-01 15:52:25.000000000 -0300
+@@ -48,9 +48,7 @@
+ extern int errno;
+ #endif /* !errno */
+
+-#if defined (HAVE_PWD_H)
+-#include <pwd.h>
+-#endif
++#include "libcnisint.h"
+
+ #include "posixdir.h"
+ #include "posixstat.h"
+@@ -79,12 +77,6 @@
+ /* Unix version of a hidden file. Could be different on other systems. */
+ #define HIDDEN_FILE(fname) ((fname)[0] == '.')
+
+-/* Most systems don't declare getpwent in <pwd.h> if _POSIX_SOURCE is
+- defined. */
+-#if defined (HAVE_GETPWENT) && (!defined (HAVE_GETPW_DECLS) || defined (_POSIX_SOURCE))
+-extern struct passwd *getpwent PARAMS((void));
+-#endif /* HAVE_GETPWENT && (!HAVE_GETPW_DECLS || _POSIX_SOURCE) */
+-
+ /* If non-zero, then this is the address of a function to call when
+ completing a word would normally display the list of possible matches.
+ This function is called instead of actually doing the display.
+@@ -1849,24 +1841,19 @@
+
+ username = savestring (&text[first_char_loc]);
+ namelen = strlen (username);
+- setpwent ();
++ internal_setpwent ();
+ }
+
+-#if defined (HAVE_GETPWENT)
+- while (entry = getpwent ())
++ while (entry = internal_getpwent ())
+ {
+ /* Null usernames should result in all users as possible completions. */
+ if (namelen == 0 || (STREQN (username, entry->pw_name, namelen)))
+ break;
+ }
+-#endif
+
+ if (entry == 0)
+ {
+-#if defined (HAVE_GETPWENT)
+- endpwent ();
+-#endif
+- return ((char *)NULL);
++ internal_endpwent ();
+ }
+ else
+ {
+Index: bash-3.2/lib/readline/shell.c
+===================================================================
+--- bash-3.2.orig/lib/readline/shell.c 2008-08-01 14:44:38.000000000 -0300
++++ bash-3.2/lib/readline/shell.c 2008-08-01 15:36:03.000000000 -0300
+@@ -51,9 +51,8 @@
+ #if defined (HAVE_FCNTL_H)
+ #include <fcntl.h>
+ #endif
+-#if defined (HAVE_PWD_H)
+-#include <pwd.h>
+-#endif
++
++#include "libcnisint.h"
+
+ #include <stdio.h>
+
+@@ -61,10 +60,6 @@
+ #include "rlshell.h"
+ #include "xmalloc.h"
+
+-#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
+-extern struct passwd *getpwuid PARAMS((uid_t));
+-#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
+-
+ #ifndef NULL
+ # define NULL 0
+ #endif
+@@ -163,11 +158,9 @@
+ struct passwd *entry;
+
+ home_dir = (char *)NULL;
+-#if defined (HAVE_GETPWUID)
+- entry = getpwuid (getuid ());
++ entry = internal_getpwuid (getuid ());
+ if (entry)
+ home_dir = entry->pw_dir;
+-#endif
+ return (home_dir);
+ }
+
+Index: bash-3.2/lib/readline/tilde.c
+===================================================================
+--- bash-3.2.orig/lib/readline/tilde.c 2008-07-31 19:09:19.000000000 -0300
++++ bash-3.2/lib/readline/tilde.c 2008-08-01 15:51:52.000000000 -0300
+@@ -42,10 +42,7 @@
+ # include "ansi_stdlib.h"
+ #endif /* HAVE_STDLIB_H */
+
+-#include <sys/types.h>
+-#if defined (HAVE_PWD_H)
+-#include <pwd.h>
+-#endif
++#include "libcnisint.h"
+
+ #include "tilde.h"
+
+@@ -56,9 +53,6 @@
+ #endif /* TEST || STATIC_MALLOC */
+
+ #if !defined (HAVE_GETPW_DECLS)
+-# if defined (HAVE_GETPWUID)
+-extern struct passwd *getpwuid PARAMS((uid_t));
+-# endif
+ # if defined (HAVE_GETPWNAM)
+ extern struct passwd *getpwnam PARAMS((const char *));
+ # endif
+@@ -409,15 +403,11 @@
+ if (dirname == 0)
+ dirname = savestring (filename);
+ }
+-#if defined (HAVE_GETPWENT)
+ else
+ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+-#endif
+
+ free (username);
+-#if defined (HAVE_GETPWENT)
+- endpwent ();
+-#endif
++ internal_endpwent ();
+ return (dirname);
+ }
+
+Index: bash-3.2/lib/tilde/shell.c
+===================================================================
+--- bash-3.2.orig/lib/tilde/shell.c 2008-08-01 14:41:32.000000000 -0300
++++ bash-3.2/lib/tilde/shell.c 2008-08-01 15:32:49.000000000 -0300
+@@ -43,11 +43,7 @@
+ # include <strings.h>
+ #endif /* !HAVE_STRING_H */
+
+-#include <pwd.h>
+-
+-#if !defined (HAVE_GETPW_DECLS)
+-extern struct passwd *getpwuid ();
+-#endif /* !HAVE_GETPW_DECLS */
++#include "libcnisint.h"
+
+ char *
+ get_env_value (varname)
+@@ -63,7 +59,7 @@
+ struct passwd *entry;
+
+ home_dir = (char *)NULL;
+- entry = getpwuid (getuid ());
++ entry = internal_getpwuid (getuid ());
+ if (entry)
+ home_dir = entry->pw_dir;
+ return (home_dir);
+Index: bash-3.2/lib/tilde/tilde.c
+===================================================================
+--- bash-3.2.orig/lib/tilde/tilde.c 2008-08-01 15:41:27.000000000 -0300
++++ bash-3.2/lib/tilde/tilde.c 2008-08-01 15:51:13.000000000 -0300
+@@ -43,9 +43,8 @@
+ #endif /* HAVE_STDLIB_H */
+
+ #include <sys/types.h>
+-#if defined (HAVE_PWD_H)
+-#include <pwd.h>
+-#endif
++
++#include "libcnisint.h"
+
+ #include "tilde.h"
+
+@@ -56,9 +55,6 @@
+ #endif /* TEST || STATIC_MALLOC */
+
+ #if !defined (HAVE_GETPW_DECLS)
+-# if defined (HAVE_GETPWUID)
+-extern struct passwd *getpwuid PARAMS((uid_t));
+-# endif
+ # if defined (HAVE_GETPWNAM)
+ extern struct passwd *getpwnam PARAMS((const char *));
+ # endif
+@@ -409,15 +405,11 @@
+ if (dirname == 0)
+ dirname = savestring (filename);
+ }
+-#if defined (HAVE_GETPWENT)
+ else
+ dirname = glue_prefix_and_suffix (user_entry->pw_dir, filename, user_len);
+-#endif
+
+ free (username);
+-#if defined (HAVE_GETPWENT)
+- endpwent ();
+-#endif
++ internal_endpwent ();
+ return (dirname);
+ }
+
+Index: bash-3.2/shell.c
+===================================================================
+--- bash-3.2.orig/shell.c 2008-07-31 19:10:00.000000000 -0300
++++ bash-3.2/shell.c 2008-08-01 15:46:10.000000000 -0300
+@@ -37,7 +37,8 @@
+ #include <signal.h>
+ #include <errno.h>
+ #include "filecntl.h"
+-#include <pwd.h>
++
++#include "libcnisint.h"
+
+ #if defined (HAVE_UNISTD_H)
+ # include <unistd.h>
+@@ -78,10 +79,6 @@
+ # include <opennt/opennt.h>
+ #endif
+
+-#if !defined (HAVE_GETPW_DECLS)
+-extern struct passwd *getpwuid ();
+-#endif /* !HAVE_GETPW_DECLS */
+-
+ #if !defined (errno)
+ extern int errno;
+ #endif
+@@ -1586,7 +1583,7 @@
+ /* Don't fetch this more than once. */
+ if (current_user.user_name == 0)
+ {
+- entry = getpwuid (current_user.uid);
++ entry = internal_getpwuid (current_user.uid);
+ if (entry)
+ {
+ current_user.user_name = savestring (entry->pw_name);
+@@ -1602,7 +1599,7 @@
+ current_user.shell = savestring ("/bin/sh");
+ current_user.home_dir = savestring ("/");
+ }
+- endpwent ();
++ internal_endpwent ();
+ }
+ }
+
+Index: bash-3.2/config.h.in
+===================================================================
+--- bash-3.2.orig/config.h.in 2008-08-01 15:54:05.000000000 -0300
++++ bash-3.2/config.h.in 2008-08-01 15:54:34.000000000 -0300
+@@ -553,15 +553,9 @@
+ /* Define if you have the getpeername function. */
+ #undef HAVE_GETPEERNAME
+
+-/* Define if you have the getpwent function. */
+-#undef HAVE_GETPWENT
+-
+ /* Define if you have the getpwnam function. */
+ #undef HAVE_GETPWNAM
+
+-/* Define if you have the getpwuid function. */
+-#undef HAVE_GETPWUID
+-
+ /* Define if you have the getrlimit function. */
+ #undef HAVE_GETRLIMIT
+
+Index: bash-3.2/configure.in
+===================================================================
+--- bash-3.2.orig/configure.in 2008-08-01 15:55:19.000000000 -0300
++++ bash-3.2/configure.in 2008-08-01 15:56:12.000000000 -0300
+@@ -710,7 +710,7 @@
+
+ AC_CHECK_FUNCS(vsnprintf snprintf vasprintf asprintf)
+ AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit)
+-AC_CHECK_FUNCS(getpwent getpwnam getpwuid)
++AC_CHECK_FUNCS(getpwnam)
+ AC_REPLACE_FUNCS(getcwd memset strcasecmp strerror strftime strnlen strpbrk strstr)
+ AC_REPLACE_FUNCS(strtod strtol strtoul strtoll strtoull strtoimax strtoumax)
+
+@@ -790,12 +790,6 @@
+ BASH_FUNC_INET_ATON
+ fi
+
+-dnl libraries
+-dnl this is reportedly no longer necessary for irix[56].?
+-case "$host_os" in
+-irix4*) AC_CHECK_LIB(sun, getpwent) ;;
+-esac
+-
+ dnl check for getpeername in the socket library only if it's not in libc
+ if test "$ac_cv_func_getpeername" = no; then
+ BASH_CHECK_LIB_SOCKET
+Index: bash-3.2/patchlevel.h
+===================================================================
+--- bash-3.2.orig/patchlevel.h 2008-08-01 16:24:52.000000000 -0300
++++ bash-3.2/patchlevel.h 2008-08-01 16:25:03.000000000 -0300
+@@ -25,6 +25,6 @@
+ regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
+ looks for to find the patch level (for the sccs version string). */
+
+-#define PATCHLEVEL 5
++#define PATCHLEVEL 6
+
+ #endif /* _PATCHLEVEL_H_ */
+Index: bash-3.2/Makefile.in
+===================================================================
+--- bash-3.2.orig/Makefile.in 2008-08-01 16:32:13.000000000 -0300
++++ bash-3.2/Makefile.in 2008-08-01 17:12:17.000000000 -0300
+@@ -405,7 +405,7 @@
+ input.c bashhist.c array.c arrayfunc.c sig.c pathexp.c \
+ unwind_prot.c siglist.c bashline.c bracecomp.c error.c \
+ list.c stringlib.c locale.c findcmd.c redir.c \
+- pcomplete.c pcomplib.c syntax.c xmalloc.c
++ pcomplete.c pcomplib.c syntax.c xmalloc.c libcnisint.c
+
+ HSOURCES = shell.h flags.h trap.h hashcmd.h hashlib.h jobs.h builtins.h \
+ general.h variables.h config.h $(ALLOC_HEADERS) alias.h \
+@@ -413,7 +413,7 @@
+ command.h input.h error.h bashansi.h dispose_cmd.h make_cmd.h \
+ subst.h externs.h siglist.h bashhist.h bashline.h bashtypes.h \
+ array.h arrayfunc.h sig.h mailcheck.h bashintl.h bashjmp.h \
+- execute_cmd.h parser.h pathexp.h pathnames.h pcomplete.h \
++ execute_cmd.h parser.h pathexp.h pathnames.h pcomplete.h libcnisint.h \
+ $(BASHINCFILES)
+
+ SOURCES = $(CSOURCES) $(HSOURCES) $(BUILTIN_DEFS)
+@@ -433,7 +433,7 @@
+ trap.o input.o unwind_prot.o pathexp.o sig.o test.o version.o \
+ alias.o array.o arrayfunc.o braces.o bracecomp.o bashhist.o \
+ bashline.o $(SIGLIST_O) list.o stringlib.o locale.o findcmd.o redir.o \
+- pcomplete.o pcomplib.o syntax.o xmalloc.o $(SIGNAMES_O)
++ pcomplete.o pcomplib.o syntax.o xmalloc.o libcnisint.o $(SIGNAMES_O)
+
+ # Where the source code of the shell builtins resides.
+ BUILTIN_SRCDIR=$(srcdir)/builtins
+@@ -978,7 +978,7 @@
+ shell.o: make_cmd.h subst.h sig.h pathnames.h externs.h
+ shell.o: flags.h trap.h mailcheck.h builtins.h $(DEFSRC)/common.h
+ shell.o: jobs.h siglist.h input.h execute_cmd.h findcmd.h bashhist.h
+-shell.o: ${GLOB_LIBSRC}/strmatch.h ${BASHINCDIR}/posixtime.h
++shell.o: ${GLOB_LIBSRC}/strmatch.h ${BASHINCDIR}/posixtime.h libcnisint.h
+ sig.o: config.h bashtypes.h
+ sig.o: shell.h syntax.h config.h bashjmp.h ${BASHINCDIR}/posixjmp.h command.h ${BASHINCDIR}/stdc.h error.h
+ sig.o: general.h xmalloc.h bashtypes.h variables.h arrayfunc.h conftypes.h array.h hashlib.h
diff --git a/packages/mamona/bash-noemu_3.2.bb b/packages/mamona/bash-noemu_3.2.bb
index 5ff66f910c..4d46d6fd79 100644
--- a/packages/mamona/bash-noemu_3.2.bb
+++ b/packages/mamona/bash-noemu_3.2.bb
@@ -5,7 +5,8 @@ RCONFLICTS = "bash"
RREPLACES = "bash"
SRC_URI = "${GNU_MIRROR}/bash/bash-${PV}.tar.gz \
- file://001-005.patch;patch=1"
+ file://001-005.patch;patch=1 \
+ file://006-add_internal_libcpwd_functions.patch;patch=1"
S = "${WORKDIR}/bash-${PV}"