]> git.pld-linux.org Git - packages/deltarpm.git/blob - deltarpm-3.4-prelink-bugfix.patch
- Patch for delta rpm
[packages/deltarpm.git] / deltarpm-3.4-prelink-bugfix.patch
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);
This page took 0.035441 seconds and 3 git commands to generate.