From 638a40acb140689fd8a828eba6584a8a30e489fa Mon Sep 17 00:00:00 2001 From: Tim Waugh Date: Thu, 12 Jun 2008 10:14:43 +0000 Subject: [PATCH] - Fix selinux patch and apply it. --- patch-selinux.patch | 183 ++++++++++++++++++++++---------------------- patch.spec | 7 +- 2 files changed, 98 insertions(+), 92 deletions(-) diff --git a/patch-selinux.patch b/patch-selinux.patch index b7e781a..86538af 100644 --- a/patch-selinux.patch +++ b/patch-selinux.patch @@ -1,6 +1,6 @@ diff -up patch-2.5.4/patch.c.selinux patch-2.5.4/patch.c ---- patch-2.5.4/patch.c.selinux 2007-10-04 16:58:38.000000000 +0100 -+++ patch-2.5.4/patch.c 2007-10-04 16:58:38.000000000 +0100 +--- patch-2.5.4/patch.c.selinux 2008-06-12 11:09:17.000000000 +0100 ++++ patch-2.5.4/patch.c 2008-06-12 11:09:17.000000000 +0100 @@ -414,6 +414,13 @@ main (int argc, char **argv) if (! inerrno && chmod (outname, instat.st_mode) != 0) pfatal ("Can't set permissions on file %s", @@ -15,77 +15,10 @@ diff -up patch-2.5.4/patch.c.selinux patch-2.5.4/patch.c } } } -diff -up patch-2.5.4/common.h.selinux patch-2.5.4/common.h ---- patch-2.5.4/common.h.selinux 1999-08-30 07:20:08.000000000 +0100 -+++ patch-2.5.4/common.h 2007-10-04 16:58:38.000000000 +0100 -@@ -39,6 +39,8 @@ - #include - #include - -+#include -+ - #include - #if ! defined S_ISDIR && defined S_IFDIR - # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) -@@ -168,6 +170,7 @@ XTERN char *outfile; - XTERN int inerrno; - XTERN int invc; - XTERN struct stat instat; -+XTERN security_context_t incontext; - XTERN bool dry_run; - XTERN bool posixly_correct; - -diff -up patch-2.5.4/inp.c.selinux patch-2.5.4/inp.c ---- patch-2.5.4/inp.c.selinux 2007-10-04 16:58:38.000000000 +0100 -+++ patch-2.5.4/inp.c 2007-10-04 16:58:38.000000000 +0100 -@@ -154,7 +154,15 @@ get_input_file (char const *filename, ch - char *getbuf; - - if (inerrno == -1) -- inerrno = stat (inname, &instat) == 0 ? 0 : errno; -+ { -+ inerrno = stat (inname, &instat) == 0 ? 0 : errno; -+ inerrno = getfilecon (inname, &incontext) == 0 ? 0 : errno; -+ if (inerrno == ENODATA || inerrno == ENOTSUP) -+ { -+ inerrno = 0; -+ incontext = NULL; -+ } -+ } - - /* Perhaps look for RCS or SCCS versions. */ - if (patch_get -@@ -196,7 +204,7 @@ get_input_file (char const *filename, ch - } - - if (cs && version_get (filename, cs, ! inerrno, elsewhere, getbuf, -- &instat)) -+ &instat, &incontext)) - inerrno = 0; - - free (getbuf); -@@ -213,6 +221,7 @@ get_input_file (char const *filename, ch - { - instat.st_mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; - instat.st_size = 0; -+ incontext = NULL; - } - else if (! S_ISREG (instat.st_mode)) - fatal ("File %s is not a regular file -- can't patch", diff -up patch-2.5.4/util.c.selinux patch-2.5.4/util.c ---- patch-2.5.4/util.c.selinux 2007-10-04 16:58:38.000000000 +0100 -+++ patch-2.5.4/util.c 2007-10-04 16:58:38.000000000 +0100 -@@ -266,7 +266,8 @@ static char const CLEARTOOL_CO[] = "clea - *GETBUF and *DIFFBUF must be freed by the caller. */ - char const * - version_controller (char const *filename, int readonly, -- struct stat const *filestat, char **getbuf, char **diffbuf) -+ struct stat const *filestat, -+ char **getbuf, char **diffbuf) - { - struct stat cstat; - char const *filebase = base_name (filename); -@@ -375,7 +376,8 @@ version_controller (char const *filename +--- patch-2.5.4/util.c.selinux 2008-06-12 11:09:17.000000000 +0100 ++++ patch-2.5.4/util.c 2008-06-12 11:12:01.000000000 +0100 +@@ -375,7 +375,8 @@ version_controller (char const *filename Return nonzero if successful. */ int version_get (char const *filename, char const *cs, int exists, int readonly, @@ -95,11 +28,11 @@ diff -up patch-2.5.4/util.c.selinux patch-2.5.4/util.c { if (patch_get < 0) { -@@ -400,6 +402,13 @@ version_get (char const *filename, char +@@ -400,6 +401,13 @@ version_get (char const *filename, char fatal ("Can't get file %s from %s", quotearg (filename), cs); if (stat (filename, filestat) != 0) pfatal ("%s", quotearg (filename)); -+ if (filecontext && getfilecon (filename, filecontext) != 0) ++ if (filecontext && getfilecon (filename, filecontext) == -1) + { + if (errno == ENODATA || errno == ENOTSUP) + *filecontext = NULL; @@ -111,7 +44,7 @@ diff -up patch-2.5.4/util.c.selinux patch-2.5.4/util.c return 1; diff -up patch-2.5.4/util.h.selinux patch-2.5.4/util.h --- patch-2.5.4/util.h.selinux 1999-08-30 07:20:08.000000000 +0100 -+++ patch-2.5.4/util.h 2007-10-04 16:58:38.000000000 +0100 ++++ patch-2.5.4/util.h 2008-06-12 11:09:17.000000000 +0100 @@ -21,7 +21,7 @@ char *fetchname PARAMS ((char *, int, ti char *savebuf PARAMS ((char const *, size_t)); char *savestr PARAMS ((char const *)); @@ -121,15 +54,69 @@ diff -up patch-2.5.4/util.h.selinux patch-2.5.4/util.h int create_file PARAMS ((char const *, int, mode_t)); int systemic PARAMS ((char const *)); char *format_linenum PARAMS ((char[LINENUM_LENGTH_BOUND + 1], LINENUM)); +diff -up patch-2.5.4/Makefile.in.selinux patch-2.5.4/Makefile.in +--- patch-2.5.4/Makefile.in.selinux 1999-08-30 07:37:54.000000000 +0100 ++++ patch-2.5.4/Makefile.in 2008-06-12 11:09:17.000000000 +0100 +@@ -36,7 +36,7 @@ DEFS = @DEFS@ + EXEEXT = @EXEEXT@ + LDFLAGS = @LDFLAGS@ + LIBOBJS = @LIBOBJS@ +-LIBS = @LIBS@ ++LIBS = @LIBS@ -lselinux + PACKAGE = @PACKAGE@ + U = @U@ + VERSION = @VERSION@ +diff -up patch-2.5.4/inp.c.selinux patch-2.5.4/inp.c +--- patch-2.5.4/inp.c.selinux 2008-06-12 11:09:17.000000000 +0100 ++++ patch-2.5.4/inp.c 2008-06-12 11:11:08.000000000 +0100 +@@ -154,7 +154,20 @@ get_input_file (char const *filename, ch + char *getbuf; + + if (inerrno == -1) +- inerrno = stat (inname, &instat) == 0 ? 0 : errno; ++ { ++ inerrno = stat (inname, &instat) == 0 ? 0 : errno; ++ if (inerrno == 0) ++ { ++ inerrno = getfilecon (inname, &incontext) == -1 ? errno : 0; ++ if (inerrno == ENODATA || inerrno == ENOTSUP) ++ { ++ inerrno = 0; ++ incontext = NULL; ++ } ++ } ++ else ++ incontext = NULL; ++ } + + /* Perhaps look for RCS or SCCS versions. */ + if (patch_get +@@ -196,7 +209,7 @@ get_input_file (char const *filename, ch + } + + if (cs && version_get (filename, cs, ! inerrno, elsewhere, getbuf, +- &instat)) ++ &instat, &incontext)) + inerrno = 0; + + free (getbuf); +@@ -213,6 +226,7 @@ get_input_file (char const *filename, ch + { + instat.st_mode = S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; + instat.st_size = 0; ++ incontext = NULL; + } + else if (! S_ISREG (instat.st_mode)) + fatal ("File %s is not a regular file -- can't patch", diff -up patch-2.5.4/pch.c.selinux patch-2.5.4/pch.c ---- patch-2.5.4/pch.c.selinux 2007-10-04 16:58:38.000000000 +0100 -+++ patch-2.5.4/pch.c 2007-10-04 16:58:38.000000000 +0100 +--- patch-2.5.4/pch.c.selinux 2008-06-12 11:09:17.000000000 +0100 ++++ patch-2.5.4/pch.c 2008-06-12 11:11:48.000000000 +0100 @@ -258,7 +258,12 @@ there_is_another_patch (void) { if (stat (inname, &instat) == 0) { - inerrno = 0; -+ inerrno = getfilecon (inname, &incontext) == 0 ? 0 : errno; ++ inerrno = getfilecon (inname, &incontext) == -1 ? errno : 0; + if (inerrno == ENODATA || inerrno == ENOTSUP) + { + inerrno = 0; @@ -147,15 +134,31 @@ diff -up patch-2.5.4/pch.c.selinux patch-2.5.4/pch.c stat_errno[i] = 0; else version_controlled[i] = 0; -diff -up patch-2.5.4/Makefile.in.selinux patch-2.5.4/Makefile.in ---- patch-2.5.4/Makefile.in.selinux 2007-10-04 16:59:09.000000000 +0100 -+++ patch-2.5.4/Makefile.in 2007-10-04 17:00:59.000000000 +0100 -@@ -36,7 +36,7 @@ DEFS = @DEFS@ - EXEEXT = @EXEEXT@ - LDFLAGS = @LDFLAGS@ - LIBOBJS = @LIBOBJS@ --LIBS = @LIBS@ -+LIBS = @LIBS@ -lselinux - PACKAGE = @PACKAGE@ - U = @U@ - VERSION = @VERSION@ +@@ -641,6 +646,7 @@ intuit_diff_type (void) + inerrno = stat_errno[i]; + invc = version_controlled[i]; + instat = st[i]; ++ getfilecon (inname, &incontext); + } + + for (i = OLD; i <= INDEX; i++) +diff -up patch-2.5.4/common.h.selinux patch-2.5.4/common.h +--- patch-2.5.4/common.h.selinux 1999-08-30 07:20:08.000000000 +0100 ++++ patch-2.5.4/common.h 2008-06-12 11:09:17.000000000 +0100 +@@ -39,6 +39,8 @@ + #include + #include + ++#include ++ + #include + #if ! defined S_ISDIR && defined S_IFDIR + # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +@@ -168,6 +170,7 @@ XTERN char *outfile; + XTERN int inerrno; + XTERN int invc; + XTERN struct stat instat; ++XTERN security_context_t incontext; + XTERN bool dry_run; + XTERN bool posixly_correct; + diff --git a/patch.spec b/patch.spec index bfc7f66..df7df83 100644 --- a/patch.spec +++ b/patch.spec @@ -1,7 +1,7 @@ Summary: The GNU patch command, for modifying/upgrading files Name: patch Version: 2.5.4 -Release: 32%{?dist} +Release: 33%{?dist} License: GPLv2+ URL: http://www.gnu.org/software/patch/patch.html Group: Development/Tools @@ -37,7 +37,7 @@ applications. %patch6 -p1 -b .stripcr %patch7 -p1 -b .parse %patch8 -p1 -b .allow-spaces -#%patch9 -p1 -b .selinux +%patch9 -p1 -b .selinux %build CFLAGS="$RPM_OPT_FLAGS -D_GNU_SOURCE" @@ -64,6 +64,9 @@ rm -rf $RPM_BUILD_ROOT %{_mandir}/*/* %changelog +* Thu Jun 12 2008 Tim Waugh 2.5.4-33 +- Fix selinux patch and apply it. + * Fri Feb 8 2008 Tim Waugh 2.5.4-32 - Applied patch from 2.5.9 to allow spaces in filenames (bug #431887).