<div dir="ltr"><div>Right, I have now dropped it.</div><div><br></div><div>Alex<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, 10 Dec 2019 at 05:57, Alex Kiernan &lt;<a href="mailto:alex.kiernan@gmail.com">alex.kiernan@gmail.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On Thu, Dec 5, 2019 at 3:46 PM Alexander Kanavin &lt;<a href="mailto:alex.kanavin@gmail.com" target="_blank">alex.kanavin@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Drop two backports.<br>
&gt;<br>
&gt; Refactor 0001-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt; to make the changes less invasive (and easier to rebase).<br>
&gt;<br>
<br>
Is that change even needed any more?<br>
<br>
<a href="https://github.com/shadow-maint/shadow/commit/b3b6d9d77c1d18b98670b97157777bb74092cd69" rel="noreferrer" target="_blank">https://github.com/shadow-maint/shadow/commit/b3b6d9d77c1d18b98670b97157777bb74092cd69</a><br>
<br>
Looks like it ought to be doing the same thing.<br>
<br>
&gt; Rebase the rest of the paches.<br>
&gt;<br>
&gt; Add a patch to remove the check for validity of login shells<br>
&gt; which does not work in our environment.<br>
&gt;<br>
&gt; Signed-off-by: Alexander Kanavin &lt;<a href="mailto:alex.kanavin@gmail.com" target="_blank">alex.kanavin@gmail.com</a>&gt;<br>
&gt; ---<br>
&gt;  ...01-Disable-use-of-syslog-for-sysroot.patch |  18 ++-<br>
&gt;  ...eck-for-validity-of-shell-executable.patch |  29 +++++<br>
&gt;  ...chg-shadow-field-reproducible-re.-71.patch |  89 --------------<br>
&gt;  ...ure.ac-fix-configure-error-with-dash.patch |  36 ------<br>
&gt;  ...te-parent-directories-when-necessary.patch | 116 ------------------<br>
&gt;  ...-for-setting-password-in-clear-text.patch} | 101 +++++++--------<br>
&gt;  ...te-parent-directories-when-necessary.patch |  63 ++++++++++<br>
&gt;  ...nexpected-open-failure-in-chroot-env.patch |  15 ++-<br>
&gt;  .../files/shadow-relaxed-usernames.patch      |  51 +++++---<br>
&gt;  meta/recipes-extended/shadow/shadow.inc       |  11 +-<br>
&gt;  .../shadow/{<a href="http://shadow_4.6.bb" rel="noreferrer" target="_blank">shadow_4.6.bb</a> =&gt; <a href="http://shadow_4.8.bb" rel="noreferrer" target="_blank">shadow_4.8.bb</a>}   |   0<br>
&gt;  11 files changed, 196 insertions(+), 333 deletions(-)<br>
&gt;  create mode 100644 meta/recipes-extended/shadow/files/0001-Do-not-check-for-validity-of-shell-executable.patch<br>
&gt;  delete mode 100644 meta/recipes-extended/shadow/files/0001-Make-the-sp_lstchg-shadow-field-reproducible-re.-71.patch<br>
&gt;  delete mode 100644 meta/recipes-extended/shadow/files/0001-configure.ac-fix-configure-error-with-dash.patch<br>
&gt;  delete mode 100644 meta/recipes-extended/shadow/files/0001-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt;  rename meta/recipes-extended/shadow/files/{allow-for-setting-password-in-clear-text.patch =&gt; 0002-Allow-for-setting-password-in-clear-text.patch} (81%)<br>
&gt;  create mode 100644 meta/recipes-extended/shadow/files/0004-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt;  rename meta/recipes-extended/shadow/{<a href="http://shadow_4.6.bb" rel="noreferrer" target="_blank">shadow_4.6.bb</a> =&gt; <a href="http://shadow_4.8.bb" rel="noreferrer" target="_blank">shadow_4.8.bb</a>} (100%)<br>
&gt;<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0001-Disable-use-of-syslog-for-sysroot.patch b/meta/recipes-extended/shadow/files/0001-Disable-use-of-syslog-for-sysroot.patch<br>
&gt; index aac2d42b12a..ab317b9aa03 100644<br>
&gt; --- a/meta/recipes-extended/shadow/files/0001-Disable-use-of-syslog-for-sysroot.patch<br>
&gt; +++ b/meta/recipes-extended/shadow/files/0001-Disable-use-of-syslog-for-sysroot.patch<br>
&gt; @@ -1,4 +1,4 @@<br>
&gt; -From 8cf3454d567f77233023be49a39a33e9f0836f89 Mon Sep 17 00:00:00 2001<br>
&gt; +From fa2d9453656641002802d8165e80adb9e6a729d2 Mon Sep 17 00:00:00 2001<br>
&gt;  From: Scott Garman &lt;<a href="mailto:scott.a.garman@intel.com" target="_blank">scott.a.garman@intel.com</a>&gt;<br>
&gt;  Date: Thu, 14 Apr 2016 12:28:57 +0200<br>
&gt;  Subject: [PATCH] Disable use of syslog for sysroot<br>
&gt; @@ -12,6 +12,7 @@ Upstream-Status: Inappropriate [disable feature]<br>
&gt;  Signed-off-by: Scott Garman &lt;<a href="mailto:scott.a.garman@intel.com" target="_blank">scott.a.garman@intel.com</a>&gt;<br>
&gt;  Signed-off-by: Peter Kjellerstedt &lt;<a href="mailto:peter.kjellerstedt@axis.com" target="_blank">peter.kjellerstedt@axis.com</a>&gt;<br>
&gt;  Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +<br>
&gt;  ---<br>
&gt;   src/groupadd.c  | 3 +++<br>
&gt;   src/groupdel.c  | 3 +++<br>
&gt; @@ -23,7 +24,7 @@ Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt;   7 files changed, 21 insertions(+)<br>
&gt;<br>
&gt;  diff --git a/src/groupadd.c b/src/groupadd.c<br>
&gt; -index 63e1c48..a596c49 100644<br>
&gt; +index 2dd8eec..e9c4bb7 100644<br>
&gt;  --- a/src/groupadd.c<br>
&gt;  +++ b/src/groupadd.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -37,7 +38,7 @@ index 63e1c48..a596c49 100644<br>
&gt;   #include &lt;fcntl.h&gt;<br>
&gt;   #include &lt;getopt.h&gt;<br>
&gt;  diff --git a/src/groupdel.c b/src/groupdel.c<br>
&gt; -index 70bed01..ababd81 100644<br>
&gt; +index f941a84..5a70056 100644<br>
&gt;  --- a/src/groupdel.c<br>
&gt;  +++ b/src/groupdel.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -65,7 +66,7 @@ index fc91c8b..2842514 100644<br>
&gt;   #include &lt;getopt.h&gt;<br>
&gt;   #include &lt;grp.h&gt;<br>
&gt;  diff --git a/src/groupmod.c b/src/groupmod.c<br>
&gt; -index 72daf2c..8965f9d 100644<br>
&gt; +index 1dca5fc..bc14438 100644<br>
&gt;  --- a/src/groupmod.c<br>
&gt;  +++ b/src/groupmod.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -79,7 +80,7 @@ index 72daf2c..8965f9d 100644<br>
&gt;   #include &lt;fcntl.h&gt;<br>
&gt;   #include &lt;getopt.h&gt;<br>
&gt;  diff --git a/src/useradd.c b/src/useradd.c<br>
&gt; -index 3aaf45c..1ab9174 100644<br>
&gt; +index 4af0f7c..1b7bf06 100644<br>
&gt;  --- a/src/useradd.c<br>
&gt;  +++ b/src/useradd.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -93,7 +94,7 @@ index 3aaf45c..1ab9174 100644<br>
&gt;   #include &lt;ctype.h&gt;<br>
&gt;   #include &lt;errno.h&gt;<br>
&gt;  diff --git a/src/userdel.c b/src/userdel.c<br>
&gt; -index c8de1d3..24d3ea9 100644<br>
&gt; +index cc951e5..153e0be 100644<br>
&gt;  --- a/src/userdel.c<br>
&gt;  +++ b/src/userdel.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -107,7 +108,7 @@ index c8de1d3..24d3ea9 100644<br>
&gt;   #include &lt;errno.h&gt;<br>
&gt;   #include &lt;fcntl.h&gt;<br>
&gt;  diff --git a/src/usermod.c b/src/usermod.c<br>
&gt; -index ccfbb99..24fb60d 100644<br>
&gt; +index 05b9871..21c6da9 100644<br>
&gt;  --- a/src/usermod.c<br>
&gt;  +++ b/src/usermod.c<br>
&gt;  @@ -34,6 +34,9 @@<br>
&gt; @@ -120,6 +121,3 @@ index ccfbb99..24fb60d 100644<br>
&gt;   #include &lt;assert.h&gt;<br>
&gt;   #include &lt;ctype.h&gt;<br>
&gt;   #include &lt;errno.h&gt;<br>
&gt; ---<br>
&gt; -2.11.0<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0001-Do-not-check-for-validity-of-shell-executable.patch b/meta/recipes-extended/shadow/files/0001-Do-not-check-for-validity-of-shell-executable.patch<br>
&gt; new file mode 100644<br>
&gt; index 00000000000..2d15ff0673a<br>
&gt; --- /dev/null<br>
&gt; +++ b/meta/recipes-extended/shadow/files/0001-Do-not-check-for-validity-of-shell-executable.patch<br>
&gt; @@ -0,0 +1,29 @@<br>
&gt; +From 0d0aded7307a9f4ee0d299951512acd18b3e029e Mon Sep 17 00:00:00 2001<br>
&gt; +From: Alexander Kanavin &lt;<a href="mailto:alex.kanavin@gmail.com" target="_blank">alex.kanavin@gmail.com</a>&gt;<br>
&gt; +Date: Wed, 4 Dec 2019 19:28:48 +0100<br>
&gt; +Subject: [PATCH] Do not check for validity of shell executable.<br>
&gt; +<br>
&gt; +This kind of check fails when building a rootfs.<br>
&gt; +<br>
&gt; +Upstream-Status: Inappropriate [oe-core specific]<br>
&gt; +Signed-off-by: Alexander Kanavin &lt;<a href="mailto:alex.kanavin@gmail.com" target="_blank">alex.kanavin@gmail.com</a>&gt;<br>
&gt; +---<br>
&gt; + src/useradd.c | 5 +----<br>
&gt; + 1 file changed, 1 insertion(+), 4 deletions(-)<br>
&gt; +<br>
&gt; +diff --git a/src/useradd.c b/src/useradd.c<br>
&gt; +index 4af0f7c..898fe02 100644<br>
&gt; +--- a/src/useradd.c<br>
&gt; ++++ b/src/useradd.c<br>
&gt; +@@ -1328,10 +1328,7 @@ static void process_flags (int argc, char **argv)<br>
&gt; +                               if (   ( !VALID (optarg) )<br>
&gt; +                                   || (   (&#39;\0&#39; != optarg[0])<br>
&gt; +                                       &amp;&amp; (&#39;/&#39;  != optarg[0])<br>
&gt; +-                                      &amp;&amp; (&#39;*&#39;  != optarg[0]) )<br>
&gt; +-                                  || (stat(optarg, &amp;st) != 0)<br>
&gt; +-                                  || (S_ISDIR(st.st_mode))<br>
&gt; +-                                  || (access(optarg, X_OK) != 0)) {<br>
&gt; ++                                      &amp;&amp; (&#39;*&#39;  != optarg[0]) )) {<br>
&gt; +                                       fprintf (stderr,<br>
&gt; +                                                _(&quot;%s: invalid shell &#39;%s&#39;\n&quot;),<br>
&gt; +                                                Prog, optarg);<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0001-Make-the-sp_lstchg-shadow-field-reproducible-re.-71.patch b/meta/recipes-extended/shadow/files/0001-Make-the-sp_lstchg-shadow-field-reproducible-re.-71.patch<br>
&gt; deleted file mode 100644<br>
&gt; index de0ba3ebb42..00000000000<br>
&gt; --- a/meta/recipes-extended/shadow/files/0001-Make-the-sp_lstchg-shadow-field-reproducible-re.-71.patch<br>
&gt; +++ /dev/null<br>
&gt; @@ -1,89 +0,0 @@<br>
&gt; -From fe34a2a0e44bc80ff213bfd185046a5f10c94997 Mon Sep 17 00:00:00 2001<br>
&gt; -From: Chris Lamb &lt;<a href="mailto:chris@chris-lamb.co.uk" target="_blank">chris@chris-lamb.co.uk</a>&gt;<br>
&gt; -Date: Wed, 2 Jan 2019 18:06:16 +0000<br>
&gt; -Subject: [PATCH 1/2] Make the sp_lstchg shadow field reproducible (re. #71)<br>
&gt; -<br>
&gt; -From &lt;<a href="https://github.com/shadow-maint/shadow/pull/71" rel="noreferrer" target="_blank">https://github.com/shadow-maint/shadow/pull/71</a>&gt;:<br>
&gt; -<br>
&gt; -```<br>
&gt; -The third field in the /etc/shadow file (sp_lstchg) contains the date of<br>
&gt; -the last password change expressed as the number of days since Jan 1, 1970.<br>
&gt; -As this is a relative time, creating a user today will result in:<br>
&gt; -<br>
&gt; -username:17238:0:99999:7:::<br>
&gt; -whilst creating the same user tomorrow will result in:<br>
&gt; -<br>
&gt; -username:17239:0:99999:7:::<br>
&gt; -This has an impact for the Reproducible Builds[0] project where we aim to<br>
&gt; -be independent of as many elements the build environment as possible,<br>
&gt; -including the current date.<br>
&gt; -<br>
&gt; -This patch changes the behaviour to use the SOURCE_DATE_EPOCH[1]<br>
&gt; -environment variable (instead of Jan 1, 1970) if valid.<br>
&gt; -```<br>
&gt; -<br>
&gt; -This updated PR adds some missing calls to gettime (). This was originally<br>
&gt; -filed by Johannes Schauer in Debian as #917773 [2].<br>
&gt; -<br>
&gt; -[0] <a href="https://reproducible-builds.org/" rel="noreferrer" target="_blank">https://reproducible-builds.org/</a><br>
&gt; -[1] <a href="https://reproducible-builds.org/specs/source-date-epoch/" rel="noreferrer" target="_blank">https://reproducible-builds.org/specs/source-date-epoch/</a><br>
&gt; -[2] <a href="https://bugs.debian.org/917773" rel="noreferrer" target="_blank">https://bugs.debian.org/917773</a><br>
&gt; -<br>
&gt; -Upstream-Status: Backport<br>
&gt; -Signed-off-by: Alex Kiernan &lt;<a href="mailto:alex.kiernan@gmail.com" target="_blank">alex.kiernan@gmail.com</a>&gt;<br>
&gt; ----<br>
&gt; - libmisc/pwd2spwd.c | 3 +--<br>
&gt; - src/pwck.c         | 2 +-<br>
&gt; - src/pwconv.c       | 2 +-<br>
&gt; - 3 files changed, 3 insertions(+), 4 deletions(-)<br>
&gt; -<br>
&gt; -diff --git a/libmisc/pwd2spwd.c b/libmisc/pwd2spwd.c<br>
&gt; -index c1b9b29ac873..6799dd50d490 100644<br>
&gt; ---- a/libmisc/pwd2spwd.c<br>
&gt; -+++ b/libmisc/pwd2spwd.c<br>
&gt; -@@ -40,7 +40,6 @@<br>
&gt; - #include &quot;prototypes.h&quot;<br>
&gt; - #include &quot;defines.h&quot;<br>
&gt; - #include &lt;pwd.h&gt;<br>
&gt; --extern time_t time (time_t *);<br>
&gt; -<br>
&gt; - /*<br>
&gt; -  * pwd_to_spwd - create entries for new spwd structure<br>
&gt; -@@ -66,7 +65,7 @@ struct spwd *pwd_to_spwd (const struct passwd *pw)<br>
&gt; -                */<br>
&gt; -               sp.sp_min = 0;<br>
&gt; -               sp.sp_max = (10000L * DAY) / SCALE;<br>
&gt; --              sp.sp_lstchg = (long) time ((time_t *) 0) / SCALE;<br>
&gt; -+              sp.sp_lstchg = (long) gettime () / SCALE;<br>
&gt; -               if (0 == sp.sp_lstchg) {<br>
&gt; -                       /* Better disable aging than requiring a password<br>
&gt; -                        * change */<br>
&gt; -diff --git a/src/pwck.c b/src/pwck.c<br>
&gt; -index 0ffb711efb13..f70071b12500 100644<br>
&gt; ---- a/src/pwck.c<br>
&gt; -+++ b/src/pwck.c<br>
&gt; -@@ -609,7 +609,7 @@ static void check_pw_file (int *errors, bool *changed)<br>
&gt; -                                       sp.sp_inact  = -1;<br>
&gt; -                                       sp.sp_expire = -1;<br>
&gt; -                                       sp.sp_flag   = SHADOW_SP_FLAG_UNSET;<br>
&gt; --                                      sp.sp_lstchg = (long) time ((time_t *) 0) / SCALE;<br>
&gt; -+                                      sp.sp_lstchg = (long) gettime () / SCALE;<br>
&gt; -                                       if (0 == sp.sp_lstchg) {<br>
&gt; -                                               /* Better disable aging than<br>
&gt; -                                                * requiring a password change<br>
&gt; -diff --git a/src/pwconv.c b/src/pwconv.c<br>
&gt; -index 9c69fa131d8e..f932f266c59c 100644<br>
&gt; ---- a/src/pwconv.c<br>
&gt; -+++ b/src/pwconv.c<br>
&gt; -@@ -267,7 +267,7 @@ int main (int argc, char **argv)<br>
&gt; -                       spent.sp_flag   = SHADOW_SP_FLAG_UNSET;<br>
&gt; -               }<br>
&gt; -               spent.sp_pwdp = pw-&gt;pw_passwd;<br>
&gt; --              spent.sp_lstchg = (long) time ((time_t *) 0) / SCALE;<br>
&gt; -+              spent.sp_lstchg = (long) gettime () / SCALE;<br>
&gt; -               if (0 == spent.sp_lstchg) {<br>
&gt; -                       /* Better disable aging than requiring a password<br>
&gt; -                        * change */<br>
&gt; ---<br>
&gt; -2.17.1<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0001-configure.ac-fix-configure-error-with-dash.patch b/meta/recipes-extended/shadow/files/0001-configure.ac-fix-configure-error-with-dash.patch<br>
&gt; deleted file mode 100644<br>
&gt; index a74cbb0c0e7..00000000000<br>
&gt; --- a/meta/recipes-extended/shadow/files/0001-configure.ac-fix-configure-error-with-dash.patch<br>
&gt; +++ /dev/null<br>
&gt; @@ -1,36 +0,0 @@<br>
&gt; -From 3c52a84ff8775590e7e9da9c0d4408c23494305e Mon Sep 17 00:00:00 2001<br>
&gt; -From: Yi Zhao &lt;<a href="mailto:yi.zhao@windriver.com" target="_blank">yi.zhao@windriver.com</a>&gt;<br>
&gt; -Date: Mon, 17 Jun 2019 15:36:34 +0800<br>
&gt; -Subject: [PATCH] <a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a>: fix configure error with dash<br>
&gt; -<br>
&gt; -A configure error occurs when /bin/sh -&gt; dash:<br>
&gt; -  checking for is_selinux_enabled in -lselinux... yes<br>
&gt; -  checking for semanage_connect in -lsemanage... yes<br>
&gt; -  configure: 16322: test: yesyes: unexpected operator<br>
&gt; -<br>
&gt; -Use &quot;=&quot; instead of &quot;==&quot; since dash doesn&#39;t support this operator.<br>
&gt; -<br>
&gt; -Upstream-Status: Backport<br>
&gt; -[<a href="https://github.com/shadow-maint/shadow/commit/3c52a84ff8775590e7e9da9c0d4408c23494305e" rel="noreferrer" target="_blank">https://github.com/shadow-maint/shadow/commit/3c52a84ff8775590e7e9da9c0d4408c23494305e</a>]<br>
&gt; -<br>
&gt; -Signed-off-by: Yi Zhao &lt;<a href="mailto:yi.zhao@windriver.com" target="_blank">yi.zhao@windriver.com</a>&gt;<br>
&gt; ----<br>
&gt; - <a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a> | 2 +-<br>
&gt; - 1 file changed, 1 insertion(+), 1 deletion(-)<br>
&gt; -<br>
&gt; -diff --git a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a> b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
&gt; -index 6762556..1907afb 100644<br>
&gt; ---- a/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
&gt; -+++ b/<a href="http://configure.ac" rel="noreferrer" target="_blank">configure.ac</a><br>
&gt; -@@ -500,7 +500,7 @@ if test &quot;$with_selinux&quot; != &quot;no&quot;; then<br>
&gt; -                       AC_MSG_ERROR([libsemanage not found])<br>
&gt; -               fi<br>
&gt; -<br>
&gt; --              if test &quot;$selinux_lib$semanage_lib&quot; == &quot;yesyes&quot; ; then<br>
&gt; -+              if test &quot;$selinux_lib$semanage_lib&quot; = &quot;yesyes&quot; ; then<br>
&gt; -                       AC_DEFINE(WITH_SELINUX, 1,<br>
&gt; -                                 [Build shadow with SELinux support])<br>
&gt; -                       LIBSELINUX=&quot;-lselinux&quot;<br>
&gt; ---<br>
&gt; -2.7.4<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0001-useradd.c-create-parent-directories-when-necessary.patch b/meta/recipes-extended/shadow/files/0001-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt; deleted file mode 100644<br>
&gt; index faa6f68ebe2..00000000000<br>
&gt; --- a/meta/recipes-extended/shadow/files/0001-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt; +++ /dev/null<br>
&gt; @@ -1,116 +0,0 @@<br>
&gt; -Subject: [PATCH] useradd.c: create parent directories when necessary<br>
&gt; -<br>
&gt; -Upstream-Status: Inappropriate [OE specific]<br>
&gt; -<br>
&gt; -Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; ----<br>
&gt; - src/useradd.c | 80 +++++++++++++++++++++++++++++++++++++++--------------------<br>
&gt; - 1 file changed, 53 insertions(+), 27 deletions(-)<br>
&gt; -<br>
&gt; -diff --git a/src/useradd.c b/src/useradd.c<br>
&gt; -index 00a3c30..9ecbb58 100644<br>
&gt; ---- a/src/useradd.c<br>
&gt; -+++ b/src/useradd.c<br>
&gt; -@@ -2021,6 +2021,35 @@ static void usr_update (void)<br>
&gt; - }<br>
&gt; -<br>
&gt; - /*<br>
&gt; -+ * mkdir_p - create directories, including parent directories when needed<br>
&gt; -+ *<br>
&gt; -+ * similar to `mkdir -p&#39;<br>
&gt; -+ */<br>
&gt; -+void mkdir_p(const char *path) {<br>
&gt; -+      int len = strlen(path);<br>
&gt; -+      char newdir[len + 1];<br>
&gt; -+      mode_t mode = 0755;<br>
&gt; -+      int i = 0;<br>
&gt; -+<br>
&gt; -+      if (path[i] == &#39;\0&#39;) {<br>
&gt; -+              return;<br>
&gt; -+      }<br>
&gt; -+<br>
&gt; -+      /* skip the leading &#39;/&#39; */<br>
&gt; -+      i++;<br>
&gt; -+<br>
&gt; -+      while(path[i] != &#39;\0&#39;) {<br>
&gt; -+              if (path[i] == &#39;/&#39;) {<br>
&gt; -+                      strncpy(newdir, path, i);<br>
&gt; -+                      newdir[i] = &#39;\0&#39;;<br>
&gt; -+                      mkdir(newdir, mode);<br>
&gt; -+              }<br>
&gt; -+              i++;<br>
&gt; -+      }<br>
&gt; -+      mkdir(path, mode);<br>
&gt; -+}<br>
&gt; -+<br>
&gt; -+/*<br>
&gt; -  * create_home - create the user&#39;s home directory<br>
&gt; -  *<br>
&gt; -  *    create_home() creates the user&#39;s home directory if it does not<br>
&gt; -@@ -2038,39 +2067,36 @@ static void create_home (void)<br>
&gt; -                       fail_exit (E_HOMEDIR);<br>
&gt; -               }<br>
&gt; - #endif<br>
&gt; --              /* XXX - create missing parent directories.  --marekm */<br>
&gt; --              if (mkdir (prefix_user_home, 0) != 0) {<br>
&gt; --                      fprintf (stderr,<br>
&gt; --                               _(&quot;%s: cannot create directory %s\n&quot;),<br>
&gt; --                               Prog, prefix_user_home);<br>
&gt; -+              mkdir_p(user_home);<br>
&gt; -+      }<br>
&gt; -+      if (access (prefix_user_home, F_OK) != 0) {<br>
&gt; - #ifdef WITH_AUDIT<br>
&gt; --                      audit_logger (AUDIT_ADD_USER, Prog,<br>
&gt; --                                    &quot;adding home directory&quot;,<br>
&gt; --                                    user_name, (unsigned int) user_id,<br>
&gt; --                                    SHADOW_AUDIT_FAILURE);<br>
&gt; -+              audit_logger (AUDIT_ADD_USER, Prog,<br>
&gt; -+                            &quot;adding home directory&quot;,<br>
&gt; -+                            user_name, (unsigned int) user_id,<br>
&gt; -+                            SHADOW_AUDIT_FAILURE);<br>
&gt; - #endif<br>
&gt; --                      fail_exit (E_HOMEDIR);<br>
&gt; --              }<br>
&gt; --              (void) chown (prefix_user_home, user_id, user_gid);<br>
&gt; --              chmod (prefix_user_home,<br>
&gt; --                     0777 &amp; ~getdef_num (&quot;UMASK&quot;, GETDEF_DEFAULT_UMASK));<br>
&gt; --              home_added = true;<br>
&gt; -+              fail_exit (E_HOMEDIR);<br>
&gt; -+      }<br>
&gt; -+      (void) chown (prefix_user_home, user_id, user_gid);<br>
&gt; -+      chmod (prefix_user_home,<br>
&gt; -+             0777 &amp; ~getdef_num (&quot;UMASK&quot;, GETDEF_DEFAULT_UMASK));<br>
&gt; -+      home_added = true;<br>
&gt; - #ifdef WITH_AUDIT<br>
&gt; --              audit_logger (AUDIT_ADD_USER, Prog,<br>
&gt; --                            &quot;adding home directory&quot;,<br>
&gt; --                            user_name, (unsigned int) user_id,<br>
&gt; --                            SHADOW_AUDIT_SUCCESS);<br>
&gt; -+      audit_logger (AUDIT_ADD_USER, Prog,<br>
&gt; -+                    &quot;adding home directory&quot;,<br>
&gt; -+                    user_name, (unsigned int) user_id,<br>
&gt; -+                    SHADOW_AUDIT_SUCCESS);<br>
&gt; - #endif<br>
&gt; - #ifdef WITH_SELINUX<br>
&gt; --              /* Reset SELinux to create files with default contexts */<br>
&gt; --              if (reset_selinux_file_context () != 0) {<br>
&gt; --                      fprintf (stderr,<br>
&gt; --                               _(&quot;%s: cannot reset SELinux file creation context\n&quot;),<br>
&gt; --                               Prog);<br>
&gt; --                      fail_exit (E_HOMEDIR);<br>
&gt; --              }<br>
&gt; --#endif<br>
&gt; -+      /* Reset SELinux to create files with default contexts */<br>
&gt; -+      if (reset_selinux_file_context () != 0) {<br>
&gt; -+              fprintf (stderr,<br>
&gt; -+                       _(&quot;%s: cannot reset SELinux file creation context\n&quot;),<br>
&gt; -+                       Prog);<br>
&gt; -+              fail_exit (E_HOMEDIR);<br>
&gt; -       }<br>
&gt; -+#endif<br>
&gt; - }<br>
&gt; -<br>
&gt; - /*<br>
&gt; ---<br>
&gt; -2.11.0<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/allow-for-setting-password-in-clear-text.patch b/meta/recipes-extended/shadow/files/0002-Allow-for-setting-password-in-clear-text.patch<br>
&gt; similarity index 81%<br>
&gt; rename from meta/recipes-extended/shadow/files/allow-for-setting-password-in-clear-text.patch<br>
&gt; rename to meta/recipes-extended/shadow/files/0002-Allow-for-setting-password-in-clear-text.patch<br>
&gt; index fa7eb07aa51..c6332e4f766 100644<br>
&gt; --- a/meta/recipes-extended/shadow/files/allow-for-setting-password-in-clear-text.patch<br>
&gt; +++ b/meta/recipes-extended/shadow/files/0002-Allow-for-setting-password-in-clear-text.patch<br>
&gt; @@ -1,8 +1,12 @@<br>
&gt; +From a7d995228491ad5255ad86c1f04ba071f6880897 Mon Sep 17 00:00:00 2001<br>
&gt; +From: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +Date: Sat, 16 Nov 2013 15:27:47 +0800<br>
&gt;  Subject: [PATCH] Allow for setting password in clear text<br>
&gt;<br>
&gt;  Upstream-Status: Inappropriate [OE specific]<br>
&gt;<br>
&gt;  Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +<br>
&gt;  ---<br>
&gt;   src/Makefile.am |  8 ++++----<br>
&gt;   src/groupadd.c  | 20 +++++++++++++++-----<br>
&gt; @@ -12,39 +16,39 @@ Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt;   5 files changed, 64 insertions(+), 25 deletions(-)<br>
&gt;<br>
&gt;  diff --git a/src/Makefile.am b/src/Makefile.am<br>
&gt; -index 3c98a8d..b8093d5 100644<br>
&gt; +index f31fd7a..4a317a3 100644<br>
&gt;  --- a/src/Makefile.am<br>
&gt;  +++ b/src/Makefile.am<br>
&gt; -@@ -93,10 +93,10 @@ chgpasswd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBSELINUX) $(LIBCRYPT)<br>
&gt; - chsh_LDADD     = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD)<br>
&gt; - chpasswd_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX) $(LIBCRYPT)<br>
&gt; - gpasswd_LDADD  = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT)<br>
&gt; --groupadd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX)<br>
&gt; -+groupadd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT)<br>
&gt; - groupdel_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX)<br>
&gt; - groupmems_LDADD = $(LDADD) $(LIBPAM) $(LIBSELINUX)<br>
&gt; --groupmod_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX)<br>
&gt; -+groupmod_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT)<br>
&gt; - grpck_LDADD    = $(LDADD) $(LIBSELINUX)<br>
&gt; - grpconv_LDADD  = $(LDADD) $(LIBSELINUX)<br>
&gt; - grpunconv_LDADD = $(LDADD) $(LIBSELINUX)<br>
&gt; -@@ -117,9 +117,9 @@ su_SOURCES     = \<br>
&gt; +@@ -103,10 +103,10 @@ chsh_LDADD     = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT_NOPAM)<br>
&gt; + chpasswd_LDADD = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT) $(LIBECONF)<br>
&gt; + expiry_LDADD = $(LDADD) $(LIBECONF)<br>
&gt; + gpasswd_LDADD  = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBCRYPT) $(LIBECONF)<br>
&gt; +-groupadd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; ++groupadd_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) $(LIBCRYPT)<br>
&gt; + groupdel_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; + groupmems_LDADD = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; +-groupmod_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; ++groupmod_LDADD = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF) $(LIBCRYPT)<br>
&gt; + grpck_LDADD    = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; + grpconv_LDADD  = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; + grpunconv_LDADD = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt; +@@ -127,9 +127,9 @@ su_SOURCES     = \<br>
&gt;         suauth.c<br>
&gt; - su_LDADD       = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD)<br>
&gt; - sulogin_LDADD  = $(LDADD) $(LIBCRYPT)<br>
&gt; --useradd_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR)<br>
&gt; -+useradd_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBCRYPT)<br>
&gt; - userdel_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE)<br>
&gt; --usermod_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR)<br>
&gt; -+usermod_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBCRYPT)<br>
&gt; - vipw_LDADD     = $(LDADD) $(LIBSELINUX)<br>
&gt; + su_LDADD       = $(LDADD) $(LIBPAM) $(LIBAUDIT) $(LIBCRYPT_NOPAM) $(LIBSKEY) $(LIBMD) $(LIBECONF)<br>
&gt; + sulogin_LDADD  = $(LDADD) $(LIBCRYPT) $(LIBECONF)<br>
&gt; +-useradd_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBECONF)<br>
&gt; ++useradd_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBECONF) $(LIBCRYPT)<br>
&gt; + userdel_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBECONF)<br>
&gt; +-usermod_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBECONF)<br>
&gt; ++usermod_LDADD  = $(LDADD) $(LIBPAM_SUID) $(LIBAUDIT) $(LIBSELINUX) $(LIBSEMANAGE) $(LIBACL) $(LIBATTR) $(LIBECONF) $(LIBCRYPT)<br>
&gt; + vipw_LDADD     = $(LDADD) $(LIBAUDIT) $(LIBSELINUX) $(LIBECONF)<br>
&gt;<br>
&gt;   install-am: all-am<br>
&gt;  diff --git a/src/groupadd.c b/src/groupadd.c<br>
&gt; -index b57006c..63e1c48 100644<br>
&gt; +index e9c4bb7..d572c00 100644<br>
&gt;  --- a/src/groupadd.c<br>
&gt;  +++ b/src/groupadd.c<br>
&gt; -@@ -123,9 +123,10 @@ static /*@noreturn@*/void usage (int status)<br>
&gt; +@@ -127,9 +127,10 @@ static /*@noreturn@*/void usage (int status)<br>
&gt;         (void) fputs (_(&quot;  -o, --non-unique              allow to create groups with duplicate\n&quot;<br>
&gt;                         &quot;                                (non-unique) GID\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -p, --password PASSWORD       use this encrypted password for the new group\n&quot;), usageout);<br>
&gt; @@ -56,7 +60,7 @@ index b57006c..63e1c48 100644<br>
&gt;         (void) fputs (&quot;\n&quot;, usageout);<br>
&gt;         exit (status);<br>
&gt;   }<br>
&gt; -@@ -387,13 +388,14 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -391,13 +392,14 @@ static void process_flags (int argc, char **argv)<br>
&gt;                 {&quot;key&quot;,        required_argument, NULL, &#39;K&#39;},<br>
&gt;                 {&quot;non-unique&quot;, no_argument,       NULL, &#39;o&#39;},<br>
&gt;                 {&quot;password&quot;,   required_argument, NULL, &#39;p&#39;},<br>
&gt; @@ -73,7 +77,7 @@ index b57006c..63e1c48 100644<br>
&gt;                                  long_options, NULL)) != -1) {<br>
&gt;                 switch (c) {<br>
&gt;                 case &#39;f&#39;:<br>
&gt; -@@ -445,12 +447,20 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -449,12 +451,20 @@ static void process_flags (int argc, char **argv)<br>
&gt;                         pflg = true;<br>
&gt;                         group_passwd = optarg;<br>
&gt;                         break;<br>
&gt; @@ -95,7 +99,7 @@ index b57006c..63e1c48 100644<br>
&gt;                         break;<br>
&gt;                 default:<br>
&gt;                         usage (E_USAGE);<br>
&gt; -@@ -584,7 +594,7 @@ int main (int argc, char **argv)<br>
&gt; +@@ -588,7 +598,7 @@ int main (int argc, char **argv)<br>
&gt;         (void) textdomain (PACKAGE);<br>
&gt;<br>
&gt;         process_root_flag (&quot;-R&quot;, argc, argv);<br>
&gt; @@ -105,10 +109,10 @@ index b57006c..63e1c48 100644<br>
&gt;         OPENLOG (&quot;groupadd&quot;);<br>
&gt;   #ifdef WITH_AUDIT<br>
&gt;  diff --git a/src/groupmod.c b/src/groupmod.c<br>
&gt; -index b293b98..72daf2c 100644<br>
&gt; +index bc14438..25ccb44 100644<br>
&gt;  --- a/src/groupmod.c<br>
&gt;  +++ b/src/groupmod.c<br>
&gt; -@@ -134,8 +134,9 @@ static void usage (int status)<br>
&gt; +@@ -138,8 +138,9 @@ static void usage (int status)<br>
&gt;         (void) fputs (_(&quot;  -o, --non-unique              allow to use a duplicate (non-unique) GID\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -p, --password PASSWORD       change the password to this (encrypted)\n&quot;<br>
&gt;                         &quot;                                PASSWORD\n&quot;), usageout);<br>
&gt; @@ -119,7 +123,7 @@ index b293b98..72daf2c 100644<br>
&gt;         (void) fputs (&quot;\n&quot;, usageout);<br>
&gt;         exit (status);<br>
&gt;   }<br>
&gt; -@@ -383,11 +384,12 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -387,11 +388,12 @@ static void process_flags (int argc, char **argv)<br>
&gt;                 {&quot;new-name&quot;,   required_argument, NULL, &#39;n&#39;},<br>
&gt;                 {&quot;non-unique&quot;, no_argument,       NULL, &#39;o&#39;},<br>
&gt;                 {&quot;password&quot;,   required_argument, NULL, &#39;p&#39;},<br>
&gt; @@ -134,7 +138,7 @@ index b293b98..72daf2c 100644<br>
&gt;                                  long_options, NULL)) != -1) {<br>
&gt;                 switch (c) {<br>
&gt;                 case &#39;g&#39;:<br>
&gt; -@@ -414,9 +416,17 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -418,9 +420,17 @@ static void process_flags (int argc, char **argv)<br>
&gt;                         group_passwd = optarg;<br>
&gt;                         pflg = true;<br>
&gt;                         break;<br>
&gt; @@ -153,7 +157,7 @@ index b293b98..72daf2c 100644<br>
&gt;                         break;<br>
&gt;                 default:<br>
&gt;                         usage (E_USAGE);<br>
&gt; -@@ -757,7 +767,7 @@ int main (int argc, char **argv)<br>
&gt; +@@ -761,7 +771,7 @@ int main (int argc, char **argv)<br>
&gt;         (void) textdomain (PACKAGE);<br>
&gt;<br>
&gt;         process_root_flag (&quot;-R&quot;, argc, argv);<br>
&gt; @@ -163,10 +167,10 @@ index b293b98..72daf2c 100644<br>
&gt;         OPENLOG (&quot;groupmod&quot;);<br>
&gt;   #ifdef WITH_AUDIT<br>
&gt;  diff --git a/src/useradd.c b/src/useradd.c<br>
&gt; -index c74e491..7214e72 100644<br>
&gt; +index 1b7bf06..44f09e2 100644<br>
&gt;  --- a/src/useradd.c<br>
&gt;  +++ b/src/useradd.c<br>
&gt; -@@ -829,9 +829,10 @@ static void usage (int status)<br>
&gt; +@@ -853,9 +853,10 @@ static void usage (int status)<br>
&gt;         (void) fputs (_(&quot;  -o, --non-unique              allow to create users with duplicate\n&quot;<br>
&gt;                         &quot;                                (non-unique) UID\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -p, --password PASSWORD       encrypted password of the new account\n&quot;), usageout);<br>
&gt; @@ -178,7 +182,7 @@ index c74e491..7214e72 100644<br>
&gt;         (void) fputs (_(&quot;  -s, --shell SHELL             login shell of the new account\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -u, --uid UID                 user ID of the new account\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -U, --user-group              create a group with the same name as the user\n&quot;), usageout);<br>
&gt; -@@ -1104,9 +1105,10 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1133,9 +1134,10 @@ static void process_flags (int argc, char **argv)<br>
&gt;                         {&quot;no-user-group&quot;,  no_argument,       NULL, &#39;N&#39;},<br>
&gt;                         {&quot;non-unique&quot;,     no_argument,       NULL, &#39;o&#39;},<br>
&gt;                         {&quot;password&quot;,       required_argument, NULL, &#39;p&#39;},<br>
&gt; @@ -190,7 +194,7 @@ index c74e491..7214e72 100644<br>
&gt;                         {&quot;shell&quot;,          required_argument, NULL, &#39;s&#39;},<br>
&gt;                         {&quot;uid&quot;,            required_argument, NULL, &#39;u&#39;},<br>
&gt;                         {&quot;user-group&quot;,     no_argument,       NULL, &#39;U&#39;},<br>
&gt; -@@ -1117,9 +1119,9 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1146,9 +1148,9 @@ static void process_flags (int argc, char **argv)<br>
&gt;                 };<br>
&gt;                 while ((c = getopt_long (argc, argv,<br>
&gt;   #ifdef WITH_SELINUX<br>
&gt; @@ -202,7 +206,7 @@ index c74e491..7214e72 100644<br>
&gt;   #endif                                /* !WITH_SELINUX */<br>
&gt;                                          long_options, NULL)) != -1) {<br>
&gt;                         switch (c) {<br>
&gt; -@@ -1285,12 +1287,19 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1320,12 +1322,19 @@ static void process_flags (int argc, char **argv)<br>
&gt;                                 }<br>
&gt;                                 user_pass = optarg;<br>
&gt;                                 break;<br>
&gt; @@ -223,7 +227,7 @@ index c74e491..7214e72 100644<br>
&gt;                                 break;<br>
&gt;                         case &#39;s&#39;:<br>
&gt;                                 if (   ( !VALID (optarg) )<br>
&gt; -@@ -2148,7 +2157,7 @@ int main (int argc, char **argv)<br>
&gt; +@@ -2257,7 +2266,7 @@ int main (int argc, char **argv)<br>
&gt;<br>
&gt;         process_root_flag (&quot;-R&quot;, argc, argv);<br>
&gt;<br>
&gt; @@ -233,10 +237,10 @@ index c74e491..7214e72 100644<br>
&gt;         OPENLOG (&quot;useradd&quot;);<br>
&gt;   #ifdef WITH_AUDIT<br>
&gt;  diff --git a/src/usermod.c b/src/usermod.c<br>
&gt; -index e571426..ccfbb99 100644<br>
&gt; +index 21c6da9..cffdb3e 100644<br>
&gt;  --- a/src/usermod.c<br>
&gt;  +++ b/src/usermod.c<br>
&gt; -@@ -424,8 +424,9 @@ static /*@noreturn@*/void usage (int status)<br>
&gt; +@@ -431,8 +431,9 @@ static /*@noreturn@*/void usage (int status)<br>
&gt;                         &quot;                                new location (use only with -d)\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -o, --non-unique              allow using duplicate (non-unique) UID\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -p, --password PASSWORD       use encrypted password for the new password\n&quot;), usageout);<br>
&gt; @@ -247,7 +251,7 @@ index e571426..ccfbb99 100644<br>
&gt;         (void) fputs (_(&quot;  -s, --shell SHELL             new login shell for the user account\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -u, --uid UID                 new UID for the user account\n&quot;), usageout);<br>
&gt;         (void) fputs (_(&quot;  -U, --unlock                  unlock the user account\n&quot;), usageout);<br>
&gt; -@@ -1002,8 +1003,9 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1010,8 +1011,9 @@ static void process_flags (int argc, char **argv)<br>
&gt;                         {&quot;move-home&quot;,    no_argument,       NULL, &#39;m&#39;},<br>
&gt;                         {&quot;non-unique&quot;,   no_argument,       NULL, &#39;o&#39;},<br>
&gt;                         {&quot;password&quot;,     required_argument, NULL, &#39;p&#39;},<br>
&gt; @@ -258,16 +262,16 @@ index e571426..ccfbb99 100644<br>
&gt;                         {&quot;shell&quot;,        required_argument, NULL, &#39;s&#39;},<br>
&gt;                         {&quot;uid&quot;,          required_argument, NULL, &#39;u&#39;},<br>
&gt;                         {&quot;unlock&quot;,       no_argument,       NULL, &#39;U&#39;},<br>
&gt; -@@ -1019,7 +1021,7 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1027,7 +1029,7 @@ static void process_flags (int argc, char **argv)<br>
&gt;                         {NULL, 0, NULL, &#39;\0&#39;}<br>
&gt;                 };<br>
&gt;                 while ((c = getopt_long (argc, argv,<br>
&gt; --                                       &quot;ac:d:e:f:g:G:hl:Lmop:R:s:u:UP:&quot;<br>
&gt; -+                                       &quot;ac:d:e:f:g:G:hl:Lmop:P:R:s:u:UA:&quot;<br>
&gt; +-                                       &quot;abc:d:e:f:g:G:hl:Lmop:R:s:u:UP:&quot;<br>
&gt; ++                                       &quot;abc:d:e:f:g:G:hl:Lmop:P:R:s:u:UA:&quot;<br>
&gt;   #ifdef ENABLE_SUBIDS<br>
&gt;                                          &quot;v:w:V:W:&quot;<br>
&gt;   #endif                                /* ENABLE_SUBIDS */<br>
&gt; -@@ -1119,9 +1121,17 @@ static void process_flags (int argc, char **argv)<br>
&gt; +@@ -1130,9 +1132,17 @@ static void process_flags (int argc, char **argv)<br>
&gt;                                 user_pass = optarg;<br>
&gt;                                 pflg = true;<br>
&gt;                                 break;<br>
&gt; @@ -286,7 +290,7 @@ index e571426..ccfbb99 100644<br>
&gt;                                 break;<br>
&gt;                         case &#39;s&#39;:<br>
&gt;                                 if (!VALID (optarg)) {<br>
&gt; -@@ -2098,7 +2108,7 @@ int main (int argc, char **argv)<br>
&gt; +@@ -2127,7 +2137,7 @@ int main (int argc, char **argv)<br>
&gt;         (void) textdomain (PACKAGE);<br>
&gt;<br>
&gt;         process_root_flag (&quot;-R&quot;, argc, argv);<br>
&gt; @@ -295,6 +299,3 @@ index e571426..ccfbb99 100644<br>
&gt;<br>
&gt;         OPENLOG (&quot;usermod&quot;);<br>
&gt;   #ifdef WITH_AUDIT<br>
&gt; ---<br>
&gt; -2.11.0<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/0004-useradd.c-create-parent-directories-when-necessary.patch b/meta/recipes-extended/shadow/files/0004-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt; new file mode 100644<br>
&gt; index 00000000000..77357027764<br>
&gt; --- /dev/null<br>
&gt; +++ b/meta/recipes-extended/shadow/files/0004-useradd.c-create-parent-directories-when-necessary.patch<br>
&gt; @@ -0,0 +1,63 @@<br>
&gt; +From b406a7f4c3d6472885b75320ea63f140e021ff03 Mon Sep 17 00:00:00 2001<br>
&gt; +From: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +Date: Thu, 17 Jul 2014 15:53:34 +0800<br>
&gt; +Subject: [PATCH] useradd.c: create parent directories when necessary<br>
&gt; +<br>
&gt; +Upstream-Status: Inappropriate [OE specific]<br>
&gt; +<br>
&gt; +Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +<br>
&gt; +---<br>
&gt; + src/useradd.c | 32 +++++++++++++++++++++++++++++++-<br>
&gt; + 1 file changed, 31 insertions(+), 1 deletion(-)<br>
&gt; +<br>
&gt; +diff --git a/src/useradd.c b/src/useradd.c<br>
&gt; +index 44f09e2..fec0986 100644<br>
&gt; +--- a/src/useradd.c<br>
&gt; ++++ b/src/useradd.c<br>
&gt; +@@ -2065,6 +2065,36 @@ static void usr_update (void)<br>
&gt; +       }<br>
&gt; + }<br>
&gt; +<br>
&gt; ++/*<br>
&gt; ++ * mkdir_p - create directories, including parent directories when needed<br>
&gt; ++ *<br>
&gt; ++ * similar to `mkdir -p&#39;<br>
&gt; ++ */<br>
&gt; ++int mkdir_p(const char *path) {<br>
&gt; ++      int len = strlen(path);<br>
&gt; ++      char newdir[len + 1];<br>
&gt; ++      mode_t mode = 0755;<br>
&gt; ++      int i = 0;<br>
&gt; ++<br>
&gt; ++      if (path[i] == &#39;\0&#39;) {<br>
&gt; ++              return 0;<br>
&gt; ++      }<br>
&gt; ++<br>
&gt; ++      /* skip the leading &#39;/&#39; */<br>
&gt; ++      i++;<br>
&gt; ++<br>
&gt; ++      while(path[i] != &#39;\0&#39;) {<br>
&gt; ++              if (path[i] == &#39;/&#39;) {<br>
&gt; ++                      strncpy(newdir, path, i);<br>
&gt; ++                      newdir[i] = &#39;\0&#39;;<br>
&gt; ++                      mkdir(newdir, mode);<br>
&gt; ++              }<br>
&gt; ++              i++;<br>
&gt; ++      }<br>
&gt; ++      mkdir(path, mode);<br>
&gt; ++        return 0;<br>
&gt; ++}<br>
&gt; ++<br>
&gt; + /*<br>
&gt; +  * create_home - create the user&#39;s home directory<br>
&gt; +  *<br>
&gt; +@@ -2137,7 +2167,7 @@ static void create_home (void)<br>
&gt; +                               }<br>
&gt; +                               else<br>
&gt; + #endif<br>
&gt; +-                              if (mkdir (path, 0) != 0) {<br>
&gt; ++                              if ((mkdir_p (path) == 0) &amp;&amp; (access (prefix_user_home, F_OK) != 0)) {<br>
&gt; +                       fprintf (stderr,<br>
&gt; +                                                       _(&quot;%s: cannot create directory %s\n&quot;),<br>
&gt; +                                                       Prog, path);<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/commonio.c-fix-unexpected-open-failure-in-chroot-env.patch b/meta/recipes-extended/shadow/files/commonio.c-fix-unexpected-open-failure-in-chroot-env.patch<br>
&gt; index 4fa3d184edf..98252163692 100644<br>
&gt; --- a/meta/recipes-extended/shadow/files/commonio.c-fix-unexpected-open-failure-in-chroot-env.patch<br>
&gt; +++ b/meta/recipes-extended/shadow/files/commonio.c-fix-unexpected-open-failure-in-chroot-env.patch<br>
&gt; @@ -1,3 +1,8 @@<br>
&gt; +From 66533c7c6f347d257020675a1ed6e0c59cbbc3f0 Mon Sep 17 00:00:00 2001<br>
&gt; +From: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +Date: Thu, 17 Jul 2014 15:53:34 +0800<br>
&gt; +Subject: [PATCH] commonio.c-fix-unexpected-open-failure-in-chroot-env<br>
&gt; +<br>
&gt;  Upstream-Status: Inappropriate [OE specific]<br>
&gt;<br>
&gt;  commonio.c: fix unexpected open failure in chroot environment<br>
&gt; @@ -10,15 +15,16 @@ Note that this patch doesn&#39;t change the logic in the code, it just expands<br>
&gt;  the codes.<br>
&gt;<br>
&gt;  Signed-off-by: Chen Qi &lt;<a href="mailto:Qi.Chen@windriver.com" target="_blank">Qi.Chen@windriver.com</a>&gt;<br>
&gt; +<br>
&gt;  ---<br>
&gt; - lib/commonio.c |   16 ++++++++++++----<br>
&gt; + lib/commonio.c | 16 ++++++++++++----<br>
&gt;   1 file changed, 12 insertions(+), 4 deletions(-)<br>
&gt;<br>
&gt;  diff --git a/lib/commonio.c b/lib/commonio.c<br>
&gt; -index cc536bf..51cafd9 100644<br>
&gt; +index 16fa7e7..d6bc297 100644<br>
&gt;  --- a/lib/commonio.c<br>
&gt;  +++ b/lib/commonio.c<br>
&gt; -@@ -613,10 +613,18 @@ int commonio_open (struct commonio_db *db, int mode)<br>
&gt; +@@ -632,10 +632,18 @@ int commonio_open (struct commonio_db *db, int mode)<br>
&gt;         db-&gt;cursor = NULL;<br>
&gt;         db-&gt;changed = false;<br>
&gt;<br>
&gt; @@ -41,6 +47,3 @@ index cc536bf..51cafd9 100644<br>
&gt;         db-&gt;fp = NULL;<br>
&gt;         if (fd &gt;= 0) {<br>
&gt;   #ifdef WITH_TCB<br>
&gt; ---<br>
&gt; -1.7.9.5<br>
&gt; -<br>
&gt; diff --git a/meta/recipes-extended/shadow/files/shadow-relaxed-usernames.patch b/meta/recipes-extended/shadow/files/shadow-relaxed-usernames.patch<br>
&gt; index 1af04d5fe89..cc833362e9a 100644<br>
&gt; --- a/meta/recipes-extended/shadow/files/shadow-relaxed-usernames.patch<br>
&gt; +++ b/meta/recipes-extended/shadow/files/shadow-relaxed-usernames.patch<br>
&gt; @@ -1,26 +1,37 @@<br>
&gt; +From ca472d6866e545aaa70a70020e3226f236a8aafc Mon Sep 17 00:00:00 2001<br>
&gt; +From: Shan Hai &lt;<a href="mailto:shan.hai@windriver.com" target="_blank">shan.hai@windriver.com</a>&gt;<br>
&gt; +Date: Tue, 13 Sep 2016 13:45:46 +0800<br>
&gt; +Subject: [PATCH] shadow: use relaxed usernames<br>
&gt;<br>
&gt;  The groupadd from shadow does not allow upper case group names, the<br>
&gt;  same is true for the upstream shadow. But distributions like<br>
&gt;  Debian/Ubuntu/CentOS has their own way to cope with this problem,<br>
&gt;  this patch is picked up from CentOS release 7.0 to relax the usernames<br>
&gt;  restrictions to allow the upper case group names, and the relaxation is<br>
&gt; -POSIX compliant because POSIX indicate that usernames are composed of<br>
&gt; +POSIX compliant because POSIX indicate that usernames are composed of<br>
&gt;  characters from the portable filename character set [A-Za-z0-9._-].<br>
&gt;<br>
&gt;  Upstream-Status: Pending<br>
&gt;<br>
&gt; -Signed-off-by: Shan Hai &lt;<a href="mailto:shan.hai@windriver.com" target="_blank">shan.hai@windriver.com</a>&gt;<br>
&gt; +Signed-off-by: Shan Hai &lt;<a href="mailto:shan.hai@windriver.com" target="_blank">shan.hai@windriver.com</a>&gt;<br>
&gt;<br>
&gt; -diff -urpN a/libmisc/chkname.c b/libmisc/chkname.c<br>
&gt; -index 5089112..f40a0da 100644<br>
&gt; +---<br>
&gt; + libmisc/chkname.c  | 30 ++++++++++++++++++------------<br>
&gt; + man/groupadd.8.xml |  6 ------<br>
&gt; + man/useradd.8.xml  |  8 +-------<br>
&gt; + 3 files changed, 19 insertions(+), 25 deletions(-)<br>
&gt; +<br>
&gt; +diff --git a/libmisc/chkname.c b/libmisc/chkname.c<br>
&gt; +index 90f185c..65762b4 100644<br>
&gt;  --- a/libmisc/chkname.c<br>
&gt;  +++ b/libmisc/chkname.c<br>
&gt; -@@ -49,21 +49,28 @@<br>
&gt; - static bool is_valid_name (const char *name)<br>
&gt; - {<br>
&gt; +@@ -55,22 +55,28 @@ static bool is_valid_name (const char *name)<br>
&gt; +       }<br>
&gt; +<br>
&gt;         /*<br>
&gt;  -       * User/group names must match [a-z_][a-z0-9_-]*[$]<br>
&gt;  -       */<br>
&gt; +-<br>
&gt;  -      if ((&#39;\0&#39; == *name) ||<br>
&gt;  -          !(((&#39;a&#39; &lt;= *name) &amp;&amp; (&#39;z&#39; &gt;= *name)) || (&#39;_&#39; == *name))) {<br>
&gt;  +         * User/group names must match gnu e-regex:<br>
&gt; @@ -55,28 +66,28 @@ index 5089112..f40a0da 100644<br>
&gt;                         return false;<br>
&gt;                 }<br>
&gt;         }<br>
&gt; -diff -urpN a/man/groupadd.8.xml b/man/groupadd.8.xml<br>
&gt; -index 230fd0c..94f7807 100644<br>
&gt; +diff --git a/man/groupadd.8.xml b/man/groupadd.8.xml<br>
&gt; +index 1e58f09..d804b61 100644<br>
&gt;  --- a/man/groupadd.8.xml<br>
&gt;  +++ b/man/groupadd.8.xml<br>
&gt; -@@ -222,12 +222,6 @@<br>
&gt; +@@ -272,12 +272,6 @@<br>
&gt; +<br>
&gt;      &lt;refsect1 id=&#39;caveats&#39;&gt;<br>
&gt;        &lt;title&gt;CAVEATS&lt;/title&gt;<br>
&gt; -      &lt;para&gt;<br>
&gt; +-     &lt;para&gt;<br>
&gt;  -       Groupnames must start with a lower case letter or an underscore,<br>
&gt;  -       followed by lower case letters, digits, underscores, or dashes.<br>
&gt;  -       They can end with a dollar sign.<br>
&gt;  -       In regular expression terms: [a-z_][a-z0-9_-]*[$]?<br>
&gt;  -     &lt;/para&gt;<br>
&gt; --     &lt;para&gt;<br>
&gt; +      &lt;para&gt;<br>
&gt;          Groupnames may only be up to &amp;GROUP_NAME_MAX_LENGTH; characters long.<br>
&gt;        &lt;/para&gt;<br>
&gt; -      &lt;para&gt;<br>
&gt; -diff -urpN a/man/useradd.8.xml b/man/useradd.8.xml<br>
&gt; -index 5dec989..fe623b9 100644<br>
&gt; +diff --git a/man/useradd.8.xml b/man/useradd.8.xml<br>
&gt; +index a16d730..c0bd777 100644<br>
&gt;  --- a/man/useradd.8.xml<br>
&gt;  +++ b/man/useradd.8.xml<br>
&gt; -@@ -336,7 +336,7 @@<br>
&gt; +@@ -366,7 +366,7 @@<br>
&gt;         &lt;/term&gt;<br>
&gt;         &lt;listitem&gt;<br>
&gt;           &lt;para&gt;<br>
&gt; @@ -85,16 +96,16 @@ index 5dec989..fe623b9 100644<br>
&gt;             wide setting from &lt;filename&gt;/etc/login.defs&lt;/filename&gt;<br>
&gt;             (&lt;option&gt;CREATE_HOME&lt;/option&gt;) is set to<br>
&gt;             &lt;replaceable&gt;yes&lt;/replaceable&gt;.<br>
&gt; -@@ -607,12 +607,6 @@<br>
&gt; +@@ -660,12 +660,6 @@<br>
&gt; +       the user account creation request.<br>
&gt;       &lt;/para&gt;<br>
&gt;<br>
&gt; -     &lt;para&gt;<br>
&gt; +-    &lt;para&gt;<br>
&gt;  -      Usernames must start with a lower case letter or an underscore,<br>
&gt;  -      followed by lower case letters, digits, underscores, or dashes.<br>
&gt;  -      They can end with a dollar sign.<br>
&gt;  -      In regular expression terms: [a-z_][a-z0-9_-]*[$]?<br>
&gt;  -    &lt;/para&gt;<br>
&gt; --    &lt;para&gt;<br>
&gt; +     &lt;para&gt;<br>
&gt;         Usernames may only be up to 32 characters long.<br>
&gt;       &lt;/para&gt;<br>
&gt; -   &lt;/refsect1&gt;<br>
&gt; diff --git a/meta/recipes-extended/shadow/shadow.inc b/meta/recipes-extended/shadow/shadow.inc<br>
&gt; index 770c239e96d..d07b507532f 100644<br>
&gt; --- a/meta/recipes-extended/shadow/shadow.inc<br>
&gt; +++ b/meta/recipes-extended/shadow/shadow.inc<br>
&gt; @@ -11,8 +11,6 @@ DEPENDS = &quot;virtual/crypt&quot;<br>
&gt;  UPSTREAM_CHECK_URI = &quot;<a href="https://github.com/shadow-maint/shadow/releases" rel="noreferrer" target="_blank">https://github.com/shadow-maint/shadow/releases</a>&quot;<br>
&gt;  SRC_URI = &quot;<a href="https://github.com/shadow-maint/shadow/releases/download/$%7BPV%7D/$%7BBP%7D.tar.gz" rel="noreferrer" target="_blank">https://github.com/shadow-maint/shadow/releases/download/${PV}/${BP}.tar.gz</a> \<br>
&gt;             file://shadow-4.1.3-dots-in-usernames.patch \<br>
&gt; -           file://0001-Make-the-sp_lstchg-shadow-field-reproducible-re.-71.patch  \<br>
&gt; -           file://0001-configure.ac-fix-configure-error-with-dash.patch \<br>
&gt;             ${@bb.utils.contains(&#39;PACKAGECONFIG&#39;, &#39;pam&#39;, &#39;${PAM_SRC_URI}&#39;, &#39;&#39;, d)} \<br>
&gt;             file://shadow-relaxed-usernames.patch \<br>
&gt;             &quot;<br>
&gt; @@ -24,16 +22,17 @@ SRC_URI_append_class-target = &quot; \<br>
&gt;<br>
&gt;  SRC_URI_append_class-native = &quot; \<br>
&gt;             file://0001-Disable-use-of-syslog-for-sysroot.patch \<br>
&gt; -           file://allow-for-setting-password-in-clear-text.patch \<br>
&gt; +           file://0002-Allow-for-setting-password-in-clear-text.patch \<br>
&gt;             file://commonio.c-fix-unexpected-open-failure-in-chroot-env.patch \<br>
&gt; -           file://0001-useradd.c-create-parent-directories-when-necessary.patch \<br>
&gt; +           file://0004-useradd.c-create-parent-directories-when-necessary.patch \<br>
&gt; +           file://0001-Do-not-check-for-validity-of-shell-executable.patch \<br>
&gt;             &quot;<br>
&gt;  SRC_URI_append_class-nativesdk = &quot; \<br>
&gt;             file://0001-Disable-use-of-syslog-for-sysroot.patch \<br>
&gt;             &quot;<br>
&gt;<br>
&gt; -SRC_URI[md5sum] = &quot;36feb15665338ae3de414f2a88e434db&quot;<br>
&gt; -SRC_URI[sha256sum] = &quot;4668f99bd087399c4a586084dc3b046b75f560720d83e92fd23bf7a89dda4d31&quot;<br>
&gt; +SRC_URI[md5sum] = &quot;017ac773ba370bc28e157cee30dad71a&quot;<br>
&gt; +SRC_URI[sha256sum] = &quot;82016d65317555fc8ce9e669eb187984d8d4b1f8ecda0769f4bc5412aed326e4&quot;<br>
&gt;<br>
&gt;  # Additional Policy files for PAM<br>
&gt;  PAM_SRC_URI = &quot;file://pam.d/chfn \<br>
&gt; diff --git a/meta/recipes-extended/shadow/<a href="http://shadow_4.6.bb" rel="noreferrer" target="_blank">shadow_4.6.bb</a> b/meta/recipes-extended/shadow/<a href="http://shadow_4.8.bb" rel="noreferrer" target="_blank">shadow_4.8.bb</a><br>
&gt; similarity index 100%<br>
&gt; rename from meta/recipes-extended/shadow/<a href="http://shadow_4.6.bb" rel="noreferrer" target="_blank">shadow_4.6.bb</a><br>
&gt; rename to meta/recipes-extended/shadow/<a href="http://shadow_4.8.bb" rel="noreferrer" target="_blank">shadow_4.8.bb</a><br>
&gt; --<br>
&gt; 2.17.1<br>
&gt;<br>
&gt; --<br>
&gt; _______________________________________________<br>
&gt; Openembedded-core mailing list<br>
&gt; <a href="mailto:Openembedded-core@lists.openembedded.org" target="_blank">Openembedded-core@lists.openembedded.org</a><br>
&gt; <a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/mailman/listinfo/openembedded-core</a><br>
<br>
<br>
<br>
-- <br>
Alex Kiernan<br>
</blockquote></div>