diff -ur deltarpm-3.4a/applydeltarpm.c deltarpm-3.4b/applydeltarpm.c
--- deltarpm-3.4a/applydeltarpm.c 2007-03-06 15:35:16.000000000 +0200
+++ deltarpm-3.4b/applydeltarpm.c 2007-07-11 17:36:59.000000000 +0300
@@ -394,10 +394,7 @@
{
if (fd != -1)
{
- if (isp)
- prelinked_close(fd);
- else
- close(fd);
+ close(fd);
fd = -1;
}
sd++;
@@ -486,10 +483,7 @@
{
if (fd)
{
- if (isp)
- prelinked_close(fd);
- else
- close(fd);
+ close(fd);
fd = -1;
}
l2 = l > sd->datalen - o ? sd->datalen - o : l;
@@ -996,7 +990,7 @@
rpmMD5Update(&ctx, buf, l);
size -= l;
}
- prelinked_close(fd);
+ close(fd);
rpmMD5Final(md5, &ctx);
if (memcmp(md5, hmd5, 16))
{
diff -ur deltarpm-3.4a/prelink.c deltarpm-3.4b/prelink.c
--- deltarpm-3.4a/prelink.c 2005-06-06 15:41:07.000000000 +0300
+++ deltarpm-3.4b/prelink.c 2007-07-11 17:42:49.000000000 +0300
@@ -7,6 +7,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
+#include <fcntl.h>
static inline int
elf16(unsigned char *buf, int le)
@@ -122,9 +123,10 @@
prelinked_open(char *name)
{
pid_t pid;
- int status;
+ int fd, status;
int p[2];
struct stat stb;
+ char template[21];
if (stat("/usr/sbin/prelink", &stb))
{
@@ -132,49 +134,33 @@
fprintf(stderr, "prelink not installed, cannot undo prelinking");
exit(1);
}
- if (prelink_pid != (pid_t)-1)
+ strcpy(template, "/tmp/deltarpm.XXXXXX");
+ if ((fd = mkstemp(template)) == -1)
{
- waitpid(prelink_pid, &status, WNOHANG);
- prelink_pid = (pid_t)-1;
- }
- if (pipe(p))
- {
- perror("pipe");
+ perror("mkstemp");
exit(1);
}
+ close(fd); /* prelink renames another tmpfile over our file */
pid = fork();
if (pid == (pid_t)(-1))
{
perror("fork");
exit(1);
}
- if (pid)
+ if (!pid)
{
- prelink_pid = pid;
- close(p[1]);
- return p[0];
+ execl("/usr/sbin/prelink", "prelink", "-o", template, "-u", name, (char *)0);
+ perror("/usr/sbin/prelink");
+ _exit(1);
}
- close(p[0]);
- if (p[1] != 1)
+ while (waitpid(pid, &status, 0) == (pid_t)-1)
+ ;
+ if ((fd = open(template, O_RDONLY)) == -1)
{
- dup2(p[1], 1);
- close(p[1]);
+ perror(template);
+ exit(1);
}
- execl("/usr/sbin/prelink", "prelink", "-y", name, (char *)0);
- perror("/usr/sbin/prelink");
- _exit(1);
+ unlink(template);
+ return fd;
}
-void
-prelinked_close(int fd)
-{
- int status;
-
- close(fd);
- if (prelink_pid != (pid_t)-1)
- {
- kill(prelink_pid, SIGPIPE);
- if (waitpid(prelink_pid, &status, 0) == prelink_pid)
- prelink_pid = (pid_t)-1;
- }
-}
diff -ur deltarpm-3.4a/prelink.h deltarpm-3.4b/prelink.h
--- deltarpm-3.4a/prelink.h 2005-06-02 20:01:07.000000000 +0300
+++ deltarpm-3.4b/prelink.h 2007-07-11 17:36:59.000000000 +0300
@@ -1,3 +1,2 @@
extern int is_prelinked(int fd, unsigned char *buf, int l);
extern int prelinked_open(char *name);
-extern void prelinked_close(int fd);