glibc_post_upgrade: Remove process restart logic

The sshd restart looks potentially useful, but it has not run for a
long time because the file /etc/rc.d/init.d/sshd does not exit
anymore, so it appears unnecessary after all.
This commit is contained in:
Florian Weimer 2018-01-19 16:49:19 +01:00
parent cc5db6cdfd
commit a071c6801c

View File

@ -32,10 +32,10 @@ index 2a432d8beebcd207..368dcae477fff2ae 100644
-D'SLIBDIR="$(slibdir)"' -D'SLIBDIR="$(slibdir)"'
diff --git a/elf/glibc_post_upgrade.c b/elf/glibc_post_upgrade.c diff --git a/elf/glibc_post_upgrade.c b/elf/glibc_post_upgrade.c
new file mode 100644 new file mode 100644
index 0000000000000000..3c9839ae523d2cc7 index 0000000000000000..19b59f70e2308032
--- /dev/null --- /dev/null
+++ b/elf/glibc_post_upgrade.c +++ b/elf/glibc_post_upgrade.c
@@ -0,0 +1,322 @@ @@ -0,0 +1,229 @@
+#include <sys/types.h> +#include <sys/types.h>
+#include <sys/wait.h> +#include <sys/wait.h>
+#include <stdio.h> +#include <stdio.h>
@ -46,8 +46,6 @@ index 0000000000000000..3c9839ae523d2cc7
+#include <stddef.h> +#include <stddef.h>
+#include <fcntl.h> +#include <fcntl.h>
+#include <string.h> +#include <string.h>
+#include <sys/stat.h>
+#include <elf.h>
+ +
+#define LD_SO_CONF "/etc/ld.so.conf" +#define LD_SO_CONF "/etc/ld.so.conf"
+#define ICONVCONFIG "/usr/sbin/iconvconfig" +#define ICONVCONFIG "/usr/sbin/iconvconfig"
@ -63,12 +61,10 @@ index 0000000000000000..3c9839ae523d2cc7
+__attribute__((noinline)) static void says (const char *str); +__attribute__((noinline)) static void says (const char *str);
+__attribute__((noinline)) static void sayn (long num); +__attribute__((noinline)) static void sayn (long num);
+__attribute__((noinline)) static void message (char *const path[]); +__attribute__((noinline)) static void message (char *const path[]);
+__attribute__((noinline)) static int check_elf (const char *name);
+ +
+int +int
+main (void) +main (void)
+{ +{
+ struct stat statbuf;
+ char initpath[256]; + char initpath[256];
+ +
+ char buffer[4096]; + char buffer[4096];
@ -180,50 +176,6 @@ index 0000000000000000..3c9839ae523d2cc7
+ (char *) iconv_dir); + (char *) iconv_dir);
+ } + }
+ +
+ /* Check if telinit is available and either SysVInit fifo,
+ or upstart telinit. */
+ if (access ("/sbin/telinit", X_OK)
+ || ((!!access ("/dev/initctl", F_OK))
+ ^ !access ("/sbin/initctl", X_OK)))
+ _exit (0);
+
+ /* Check if we are not inside of some chroot, because we'd just
+ timeout and leave /etc/initrunlvl.
+
+ On more modern systems this test is not sufficient to detect
+ if we're in a chroot. */
+ if (readlink ("/proc/1/exe", initpath, 256) <= 0 ||
+ readlink ("/proc/1/root", initpath, 256) <= 0)
+ _exit (0);
+
+ /* Here's another well known way to detect chroot, at least on an
+ ext and xfs filesystems and assuming nothing mounted on the chroot's
+ root. */
+ if (stat ("/", &statbuf) != 0
+ || (statbuf.st_ino != 2
+ && statbuf.st_ino != 128))
+ _exit (0);
+
+ if (check_elf ("/proc/1/exe"))
+ verbose_exec (116,
+ (char *) "/sbin/telinit",
+ (char *) "/sbin/telinit",
+ (char *) "u");
+
+ /* Check if we can safely condrestart sshd. */
+ if (access ("/sbin/service", X_OK) == 0
+ && access ("/usr/sbin/sshd", X_OK) == 0
+ && access ("/etc/rc.d/init.d/sshd", X_OK) == 0
+ && access ("/bin/bash", X_OK) == 0)
+ {
+ if (check_elf ("/usr/sbin/sshd"))
+ verbose_exec (-121,
+ (char *) "/sbin/service",
+ (char *) "/sbin/service",
+ (char *) "sshd",
+ (char *) "condrestart");
+ }
+
+ _exit(0); + _exit(0);
+} +}
+ +
@ -313,48 +265,3 @@ index 0000000000000000..3c9839ae523d2cc7
+ says ("/usr/sbin/glibc_post_upgrade: While trying to execute "); + says ("/usr/sbin/glibc_post_upgrade: While trying to execute ");
+ says (path[0]); + says (path[0]);
+} +}
+
+static int
+check_elf (const char *name)
+{
+ /* Play safe, if we can't open or read, assume it might be
+ ELF for the current arch. */
+ int ret = 1;
+ int fd = open (name, O_RDONLY);
+ if (fd >= 0)
+ {
+ Elf32_Ehdr ehdr;
+ if (read (fd, &ehdr, offsetof (Elf32_Ehdr, e_version))
+ == offsetof (Elf32_Ehdr, e_version))
+ {
+ ret = 0;
+ if (ehdr.e_ident[EI_CLASS]
+ == (sizeof (long) == 8 ? ELFCLASS64 : ELFCLASS32))
+ {
+#if defined __i386__
+ ret = ehdr.e_machine == EM_386;
+#elif defined __x86_64__
+ ret = ehdr.e_machine == EM_X86_64;
+#elif defined __powerpc64__
+ ret = ehdr.e_machine == EM_PPC64;
+#elif defined __powerpc__
+ ret = ehdr.e_machine == EM_PPC;
+#elif defined __s390__ || defined __s390x__
+ ret = ehdr.e_machine == EM_S390;
+#elif defined __x86_64__
+ ret = ehdr.e_machine == EM_X86_64;
+#elif defined __sparc__
+ if (sizeof (long) == 8)
+ ret = ehdr.e_machine == EM_SPARCV9;
+ else
+ ret = (ehdr.e_machine == EM_SPARC
+ || ehdr.e_machine == EM_SPARC32PLUS);
+#else
+ ret = 1;
+#endif
+ }
+ }
+ close (fd);
+ }
+ return ret;
+}