]> git.pld-linux.org Git - packages/deltarpm.git/blame - deltarpm-3.4-prelink-bugfix.patch
- release 5
[packages/deltarpm.git] / deltarpm-3.4-prelink-bugfix.patch
CommitLineData
1bcd303b
JS
1diff -ur deltarpm-3.4a/applydeltarpm.c deltarpm-3.4b/applydeltarpm.c
2--- deltarpm-3.4a/applydeltarpm.c 2007-03-06 15:35:16.000000000 +0200
3+++ deltarpm-3.4b/applydeltarpm.c 2007-07-11 17:36:59.000000000 +0300
4@@ -394,10 +394,7 @@
5 {
6 if (fd != -1)
7 {
8- if (isp)
9- prelinked_close(fd);
10- else
11- close(fd);
12+ close(fd);
13 fd = -1;
14 }
15 sd++;
16@@ -486,10 +483,7 @@
17 {
18 if (fd)
19 {
20- if (isp)
21- prelinked_close(fd);
22- else
23- close(fd);
24+ close(fd);
25 fd = -1;
26 }
27 l2 = l > sd->datalen - o ? sd->datalen - o : l;
28@@ -996,7 +990,7 @@
29 rpmMD5Update(&ctx, buf, l);
30 size -= l;
31 }
32- prelinked_close(fd);
33+ close(fd);
34 rpmMD5Final(md5, &ctx);
35 if (memcmp(md5, hmd5, 16))
36 {
37diff -ur deltarpm-3.4a/prelink.c deltarpm-3.4b/prelink.c
38--- deltarpm-3.4a/prelink.c 2005-06-06 15:41:07.000000000 +0300
39+++ deltarpm-3.4b/prelink.c 2007-07-11 17:42:49.000000000 +0300
40@@ -7,6 +7,7 @@
41 #include <sys/types.h>
42 #include <sys/stat.h>
43 #include <sys/wait.h>
44+#include <fcntl.h>
45
46 static inline int
47 elf16(unsigned char *buf, int le)
48@@ -122,9 +123,10 @@
49 prelinked_open(char *name)
50 {
51 pid_t pid;
52- int status;
53+ int fd, status;
54 int p[2];
55 struct stat stb;
56+ char template[21];
57
58 if (stat("/usr/sbin/prelink", &stb))
59 {
60@@ -132,49 +134,33 @@
61 fprintf(stderr, "prelink not installed, cannot undo prelinking");
62 exit(1);
63 }
64- if (prelink_pid != (pid_t)-1)
65+ strcpy(template, "/tmp/deltarpm.XXXXXX");
66+ if ((fd = mkstemp(template)) == -1)
67 {
68- waitpid(prelink_pid, &status, WNOHANG);
69- prelink_pid = (pid_t)-1;
70- }
71- if (pipe(p))
72- {
73- perror("pipe");
74+ perror("mkstemp");
75 exit(1);
76 }
77+ close(fd); /* prelink renames another tmpfile over our file */
78 pid = fork();
79 if (pid == (pid_t)(-1))
80 {
81 perror("fork");
82 exit(1);
83 }
84- if (pid)
85+ if (!pid)
86 {
87- prelink_pid = pid;
88- close(p[1]);
89- return p[0];
90+ execl("/usr/sbin/prelink", "prelink", "-o", template, "-u", name, (char *)0);
91+ perror("/usr/sbin/prelink");
92+ _exit(1);
93 }
94- close(p[0]);
95- if (p[1] != 1)
96+ while (waitpid(pid, &status, 0) == (pid_t)-1)
97+ ;
98+ if ((fd = open(template, O_RDONLY)) == -1)
99 {
100- dup2(p[1], 1);
101- close(p[1]);
102+ perror(template);
103+ exit(1);
104 }
105- execl("/usr/sbin/prelink", "prelink", "-y", name, (char *)0);
106- perror("/usr/sbin/prelink");
107- _exit(1);
108+ unlink(template);
109+ return fd;
110 }
111
112-void
113-prelinked_close(int fd)
114-{
115- int status;
116-
117- close(fd);
118- if (prelink_pid != (pid_t)-1)
119- {
120- kill(prelink_pid, SIGPIPE);
121- if (waitpid(prelink_pid, &status, 0) == prelink_pid)
122- prelink_pid = (pid_t)-1;
123- }
124-}
125diff -ur deltarpm-3.4a/prelink.h deltarpm-3.4b/prelink.h
126--- deltarpm-3.4a/prelink.h 2005-06-02 20:01:07.000000000 +0300
127+++ deltarpm-3.4b/prelink.h 2007-07-11 17:36:59.000000000 +0300
128@@ -1,3 +1,2 @@
129 extern int is_prelinked(int fd, unsigned char *buf, int l);
130 extern int prelinked_open(char *name);
131-extern void prelinked_close(int fd);
This page took 0.07013 seconds and 4 git commands to generate.