On Sat, Jul 17, 2010 at 15:24:52 +0200, Marek Kubica wrote: > tag +pending > thanks > > Hi, > > In the course of todays BSP in Munich, I created an NMU patch, you'll > find it attached. I applied David's patch unchanged. I hope we can > upload this at the end of the BSP. > > regards, > Marek
> reverted: > --- dash-0.5.5.1/debian/dash.preinst > +++ dash-0.5.5.1.orig/debian/dash.preinst > @@ -1,27 +0,0 @@ > -#!/bin/sh > -set -e > - > -divert() { > - dfile=$1 > - ltarget=$2 > - div=$(dpkg-divert --list $dfile) > - distrib=${3:-$dfile.distrib} > - if [ -z "$div" ]; then > - dpkg-divert --package dash --divert $distrib --add $dfile > - # This differs from dpkg-divert's --rename because we > - # first make a copy of $dfile (the file being diverted) > - # in $distrib. Then, a symlink to $ltarget is forcibly created > - # from $dfile. > - # dpkg-divert's --rename direct equivalent would be: > - # mv $dfile $distrib -- but we could end up without a symlink > - cp -dp $dfile $distrib > - ln -sf $ltarget $dfile > - fi > -} > - > -# Divert the following files if no diversion exists already > -# It is currently used to prevent the files collision between bash and > -# dash: they both provide the files in the package. > -divert /bin/sh dash > -divert /usr/share/man/man1/sh.1.gz dash.1.gz \ > - /usr/share/man/man1/sh.distrib.1.gz > diff -u dash-0.5.5.1/debian/changelog dash-0.5.5.1/debian/changelog > --- dash-0.5.5.1/debian/changelog > +++ dash-0.5.5.1/debian/changelog > @@ -1,3 +1,11 @@ > +dash (0.5.5.1-7.1) unstable; urgency=low > + > + * Non-maintainer upload. > + * Fix "dash's preinst shouldn't rely on /bin/sh" by applying the patch by > + David Riebenbauer (Closes: #546528) > + > + -- Marek Kubica <ma...@xivilization.net> Sat, 17 Jul 2010 15:10:54 +0200 > + > dash (0.5.5.1-7) unstable; urgency=low > > [ Raphael Geissert ] > diff -u dash-0.5.5.1/debian/rules dash-0.5.5.1/debian/rules > --- dash-0.5.5.1/debian/rules > +++ dash-0.5.5.1/debian/rules > @@ -36,7 +36,7 @@ > exec ../configure --host='$(DEB_HOST_GNU_TYPE)') > touch configure-stamp > > -build: deb-checkdir build-stamp > +build: preinst-build deb-checkdir build-stamp this should be a dependency of build-stamp, not build. Also why not use debian/dash.preinst directly instead of this indirection? > build-stamp: configure-stamp > -$(CC) -v > (cd build-tmp && exec $(MAKE) CFLAGS='$(CFLAGS)') || \ > @@ -55,6 +55,11 @@ > rm -f configure-stamp patch-stamp build-stamp po-templates-stamp > rm -rf '$(DIR)' '$(DIRA)' > rm -f debian/files debian/substvars debian/dash.templates changelog > + rm -f debian/dash.preinst > + > +preinst-build: debian/dash.preinst > +debian/dash.preinst: debian/dash.preinst.c > + $(CC) -O2 -s -o debian/dash.preinst debian/dash.preinst.c > -s? > install: install-indep install-arch > install-indep: deb-checkdir deb-checkuid > only in patch2: > unchanged: > --- dash-0.5.5.1.orig/debian/dash.preinst.c > +++ dash-0.5.5.1/debian/dash.preinst.c > @@ -0,0 +1,151 @@ > +/* Copyright (c) 2009 David Riebenbuaer <davr...@liegesta.at> > + * > + * You may freely use, distribute, and modify this program. > + */ > + > +#include <stdlib.h> > +#include <unistd.h> > +#include <fcntl.h> > +#include <stdio.h> > +#include <string.h> > +#include <sys/types.h> > +#include <sys/wait.h> > +#include <err.h> > +#include <errno.h> > +#include <error.h> > + > +#define DPKG_DIVERT "/usr/bin/dpkg-divert" > +#define LINE_LEN 1024 > + > +void run_op(const char *const op[]) > +{ > + pid_t child; > + > + switch (child = fork()) { > + case -1: > + // fork failed > + { > + err(EXIT_FAILURE, "fork failed"); > + } > + > + > + case 0: > + // child > + { > + execvp(op[0], (char *const *)(op)); > + > + err(EXIT_FAILURE, "failed to exec %s", op[0]); > + } > + > + > + default: > + // parent > + { > + int status; > + pid_t pid; > + > + pid = waitpid(child, &status, 0); > + > + if (pid != -1) { > + if (WIFEXITED(status)) { > + if (WEXITSTATUS(status) == 0) { > + return; > + } > + else { > + exit(WEXITSTATUS(status)); > + } > + } > + else { > + fprintf(stderr, "child didn't exit normally"); > + exit(EXIT_FAILURE); > + } > + } > + else { > + err(EXIT_FAILURE, "wait failed"); > + } > + > + break; > + } > + } > +} > + > +void divert(const char *target, const char *source, const char *distrib) > +{ > + pid_t child; > + int pipedes[2]; > + static char line[LINE_LEN]; > + > + memset(line, '\0', LINE_LEN); > + > + if (pipe(pipedes)) { > + err(EXIT_FAILURE, "pipe creation failed"); > + } > + > + switch(child = fork()) { > + case -1: > + // fork failed > + { > + int errnum = errno; > + > + close(pipedes[0]); > + close(pipedes[1]); > + error(EXIT_FAILURE, errnum, "fork failed"); > + } > + > + > + case 0: > + // child > + { > + if (dup2(pipedes[STDOUT_FILENO], STDOUT_FILENO) < 0) { > + err(EXIT_FAILURE, "replacing stdout with pipe failed"); > + } > + kind of weird to use STD{IN,OUT}_FILENO here, but 0 and 1 three lines earlier. > + close(pipedes[STDIN_FILENO]); > + close(pipedes[STDOUT_FILENO]); > + > + execlp(DPKG_DIVERT, DPKG_DIVERT, "--list", target, NULL); > + (void *)NULL instead of NULL. > + err(EXIT_FAILURE, "dpkg-divert exec failed"); > + } > + > + > + default: > + // parent > + { > + FILE *fd; > + > + close(pipedes[STDOUT_FILENO]); > + fcntl(pipedes[STDIN_FILENO], F_SETFD, FD_CLOEXEC); > + fd = fdopen(pipedes[STDIN_FILENO], "r"); > + > + while (fgets(line, LINE_LEN, fd) != NULL) { > + line[strlen(line)-1] = '\0'; > + break; > + } > + fclose(fd); > + missing waitpid() and handling of dpkg-divert --list failure? > + break; > + } > + } > + > + if (strlen(line) == 0) { > + const char *const dpkg_divert_op[] = {DPKG_DIVERT, "--package", "dash", > + "--divert", distrib, "--add", target, NULL}; > + const char *const cp_op[] = {"cp", "-pd", target, distrib, NULL}; > + const char *const ln_op[] = {"ln", "-fs", source, target, NULL}; > + > + run_op(dpkg_divert_op); > + run_op(cp_op); > + run_op(ln_op); > + } > +} > + > +int main(void) > +{ > + divert("/bin/sh", "dash", "/bin/sh.distrib"); > + divert("/usr/share/man/man1/sh.1.gz", "dash.1.gz", > + "/usr/share/man/man1/sh.distrib.1.gz"); > + > + return EXIT_SUCCESS; > +} > + Cheers, Julien
signature.asc
Description: Digital signature