]>
Commit | Line | Data |
---|---|---|
1bcd303b JS |
1 | diff -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 | { | |
37 | diff -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 | -} | |
125 | diff -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); |