- hacks to recognize architecture under parisc
- RPM_INSTALL_PREFIX wasn't being set properly (this should be
fixed now)
+ - replaced temporary file creation to be race-condition safe
2.4.4 -> 2.4.5:
- call getpwnam()/endpwent() once before a chroot(), forcing name
struct Script *script = malloc(sizeof(struct Script));
struct PackageRec *main_package = spec->packages;
char *s, * arch, * os;
+ int fd;
int_32 foo;
rpmGetArchInfo(&arch, NULL);
exit(RPMERR_INTERNAL);
}
- script->name = tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmbuild");
- script->file = fopen(script->name, "w");
+ if (makeTempFile(NULL, &script->name, &fd))
+ exit(1);
+ script->file = fdopen(fd, "w");
/* Prepare the script */
fprintf(script->file,
&archiveSize, 1);
/* Write the header */
- sigtarget = tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmbuild");
- if ((fd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
- fprintf(stderr, "Could not open %s\n", sigtarget);
+ if (makeTempFile(NULL, &sigtarget, &fd))
return 1;
- }
+
headerWrite(fd, header, HEADER_MAGIC_YES);
/* Write the archive and get the size */
if (cpio_gzip(fd, stempdir, fileList, &archiveSize, prefix)) {
close(fd);
unlink(sigtarget);
+ free(sigtarget);
return 1;
}
if ((fd = open(filename, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) {
fprintf(stderr, "Could not open %s\n", filename);
unlink(sigtarget);
+ free(sigtarget);
unlink(filename);
return 1;
}
if (writeMagic(fd, name, type)) {
close(fd);
unlink(sigtarget);
+ free(sigtarget);
unlink(filename);
return 1;
}
if (rpmWriteSignature(fd, sig)) {
close(fd);
unlink(sigtarget);
+ free(sigtarget);
unlink(filename);
rpmFreeSignature(sig);
return 1;
close(ifd);
close(fd);
unlink(sigtarget);
+ free(sigtarget);
unlink(filename);
return 1;
}
close(ifd);
close(fd);
unlink(sigtarget);
+ free(sigtarget);
unlink(filename);
return 1;
}
close(ifd);
close(fd);
unlink(sigtarget);
+ free(sigtarget);
rpmMessage(RPMMESS_VERBOSE, "Wrote: %s\n", filename);
#include "rpmlead.h"
#include "signature.h"
#include "messages.h"
+#include "lib/misc.h"
int doReSign(int add, char *passPhrase, char **argv)
{
int fd, ofd, count;
struct rpmlead lead;
unsigned short sigtype;
- char *rpm, sigtarget[1024];
+ char *rpm, *sigtarget;
char tmprpm[1024];
unsigned char buffer[8192];
Header sig;
}
/* Write the rest to a temp file */
- strcpy(sigtarget, tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmsigtarget"));
- ofd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (makeTempFile(NULL, &sigtarget, &ofd))
+ exit(1);
+
while ((count = read(fd, buffer, sizeof(buffer))) > 0) {
if (count == -1) {
perror(_("Couldn't read the header/archive"));
close(ofd);
unlink(sigtarget);
+ free(sigtarget);
exit(1);
}
if (write(ofd, buffer, count) < 0) {
perror(_("Couldn't write header/archive to temp file"));
close(ofd);
unlink(sigtarget);
+ free(sigtarget);
exit(1);
}
}
close(ofd);
unlink(sigtarget);
unlink(tmprpm);
+ free(sigtarget);
exit(1);
}
close(ofd);
unlink(sigtarget);
unlink(tmprpm);
+ free(sigtarget);
rpmFreeSignature(sig);
exit(1);
}
close(fd);
unlink(sigtarget);
unlink(tmprpm);
+ free(sigtarget);
exit(1);
}
if (write(ofd, buffer, count) < 0) {
close(fd);
unlink(sigtarget);
unlink(tmprpm);
+ free(sigtarget);
exit(1);
}
}
close(fd);
close(ofd);
unlink(sigtarget);
+ free(sigtarget);
/* Move it in to place */
unlink(rpm);
int fd, ofd, res, res2, res3, missingKeys;
struct rpmlead lead;
char *rpm;
- char result[1024], sigtarget[1024];
+ char result[1024], * sigtarget;
unsigned char buffer[8192];
Header sig;
HeaderIterator sigIter;
continue;
}
/* Write the rest to a temp file */
- strcpy(sigtarget, tempnam(rpmGetVar(RPMVAR_TMPPATH), "rpmsigtarget"));
- ofd = open(sigtarget, O_WRONLY|O_CREAT|O_TRUNC, 0644);
+ if (makeTempFile(NULL, &sigtarget, &ofd))
+ exit(1);
while ((count = read(fd, buffer, sizeof(buffer))) > 0) {
if (count == -1) {
perror(_("Couldn't read the header/archive"));
close(ofd);
unlink(sigtarget);
+ free(sigtarget);
exit(1);
}
if (write(ofd, buffer, count) < 0) {
perror("");
close(ofd);
unlink(sigtarget);
+ free(sigtarget);
exit(1);
}
}
headerFreeIterator(sigIter);
res += res2;
unlink(sigtarget);
+ free(sigtarget);
if (res2) {
if (rpmIsVerbose()) {
#include <errno.h>
#include <ctype.h>
+#include <fcntl.h>
#include <grp.h>
#include <pwd.h>
#include <stdlib.h>
+#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <string.h>
+#include <unistd.h>
+#include "intl.h"
#include "misc.h"
#include "rpmlib.h"
#include "messages.h"
return lastGname;
}
}
+
+int makeTempFile(char * prefix, char ** fnptr, int * fdptr) {
+ char * fn;
+ int fd;
+ int ran;
+ char * tmpdir = rpmGetVar(RPMVAR_TMPPATH);
+ struct stat sb;
+
+ if (!prefix) prefix = "";
+
+ fn = malloc(strlen(prefix) + 25 + strlen(tmpdir));
+
+ srandom(time(NULL));
+ ran = random() % 100000;
+ do {
+ sprintf(fn, "%s%s/rpm-tmp.%d", prefix, tmpdir, ran++);
+ } while (!access(fn, X_OK));
+
+ fd = open(fn, O_CREAT | O_RDWR | O_EXCL, 0700);
+
+ if (fd < 0) {
+ rpmError(RPMERR_SCRIPT, _("error creating temporary file %s"), fn);
+ return 1;
+ }
+
+ if (!stat(fn, &sb) && S_ISLNK(sb.st_mode)) {
+ rpmError(RPMERR_SCRIPT, _("error creating temporary file %s"), fn);
+ return 1;
+ }
+
+ if (fnptr) *fnptr = fn;
+ *fdptr = fd;
+
+ return 0;
+}
char * uidToUname(uid_t uid);
char * gidToGname(gid_t gid);
+int makeTempFile(char * prefix, char ** fnptr, int * fdptr);
+
#endif
int isdebug = rpmIsDebug();
int child;
int status;
- int ran;
- struct stat sb;
char upgradeArg[20];
char * installPrefix = NULL;
char * installPrefixEnv = NULL;
rpmMessage(RPMMESS_DEBUG, "running inst helper %s\n", program);
if (script) {
- if (prefix) {
- fn = alloca(strlen(prefix) + 15);
- strcpy(fn, prefix);
- strcat(fn, "/");
- } else {
- fn = alloca(15);
- *fn = '\0';
- }
-
- srandom(time(NULL));
- strcat(fn, "/tmp/rpm123456");
- ran = random() % 100000;
- do {
- fn[strlen(fn) - 6] = '\0';
- sprintf(upgradeArg, "%06d", ran++);
- strcat(fn, upgradeArg);
- } while (!access(fn, X_OK));
-
- rpmMessage(RPMMESS_DEBUG, "script found - running from file %s\n", fn);
- fd = open(fn, O_CREAT | O_RDWR | O_EXCL, 0700);
-
- if (fd < 0) {
- rpmError(RPMERR_SCRIPT,
- _("error creating file %s for (un)install script"), fn);
+ if (makeTempFile(prefix, &fn, &fd))
return 1;
- }
-
- if (!stat(fn, &sb) && S_ISLNK(sb.st_mode)) {
- rpmError(RPMERR_SCRIPT,
- _("error creating file %s for (un)install script"), fn);
- return 1;
- }
-
write(fd, "#!", 2);
write(fd, program, strlen(program));
*argvPtr++ = NULL;
if (!(child = fork())) {
- if (installPrefixEnv) {
- doputenv(installPrefixEnv);
- }
-
/* make stdin inaccessible */
pipe(pipes);
close(pipes[1]);
waitpid(child, &status, 0);
if (script && !isdebug) unlink(fn);
+ free(fn);
if (!WIFEXITED(status) || WEXITSTATUS(status)) {
rpmError(RPMERR_SCRIPT, _("execution of script failed"));