- add new ignore chown/chgrp flag

- bump strings space to 8K someone has 4K paths now.
- use snprintf where possible and detect long lines.
This commit is contained in:
christos 2013-04-09 16:39:19 +00:00
parent 6bb059914d
commit e77d8145f4
6 changed files with 76 additions and 45 deletions

View File

@ -1,4 +1,4 @@
.\" $NetBSD: sup.1,v 1.21 2011/09/22 07:30:04 mrg Exp $
.\" $NetBSD: sup.1,v 1.22 2013/04/09 16:39:19 christos Exp $
.\"
.\" Copyright (c) 1992 Carnegie Mellon University
.\" All Rights Reserved.
@ -45,7 +45,7 @@
.\" 04-Apr-85 Steven Shafer (sas) at Carnegie-Mellon University
.\" Created.
.\"
.TH SUP 1 10/01/08
.TH SUP 1 2013/03/13
.CM 4
.SH "NAME"
sup \- software upgrade protocol
@ -266,6 +266,12 @@ upgrade will be performed.
Messages will be printed that indicate what would happen if
an actual upgrade were done.
.TP
.B i
Ignore errors from
.IR chown(2)
or
.IR chgrp(2) .
.TP
.B -k
.I Sup
will check the modification times of

View File

@ -1,4 +1,4 @@
/* $NetBSD: sup.h,v 1.11 2007/12/20 20:14:24 christos Exp $ */
/* $NetBSD: sup.h,v 1.12 2013/04/09 16:39:20 christos Exp $ */
/*
* Copyright (c) 1992 Carnegie Mellon University
@ -169,7 +169,7 @@ extern char scmversion[]; /* string version of scm */
#endif
/* String length */
#define STRINGLENGTH 2000
#define STRINGLENGTH 8192
/* Password transmission encryption key */
#define PSWDCRYPT "SuperMan"

View File

@ -1,4 +1,4 @@
/* $NetBSD: supcdefs.h,v 1.14 2011/09/21 19:34:54 christos Exp $ */
/* $NetBSD: supcdefs.h,v 1.15 2013/04/09 16:39:20 christos Exp $ */
/*
* Copyright (c) 1992 Carnegie Mellon University
@ -117,6 +117,7 @@ typedef struct collstruct COLLECTION;
#define CFCOMPRESS 04000
#define CFSILENT 10000
#define CFCANONICALIZE 20000
#define CFIGNCHERR 40000
/*************************
*** M A C R O S ***

View File

@ -1,4 +1,4 @@
/* $NetBSD: supcmain.c,v 1.32 2011/09/21 19:34:54 christos Exp $ */
/* $NetBSD: supcmain.c,v 1.33 2013/04/09 16:39:20 christos Exp $ */
/*
* Copyright (c) 1992 Carnegie Mellon University
@ -470,7 +470,7 @@ doswitch(int *argc, char ***argv, TREE ** collTp, int *oflagsp, int *aflagsp,
int oflags, aflags;
int c;
#define SUPOPTIONS "abBCdDeEfkKlmM:NoOPRsStuvXzZ=:"
#define SUPOPTIONS "abBCdDeEifkKlmM:NoOPRsStuvXzZ=:"
oflags = aflags = 0;
while ((c = getopt(*argc, *argv, SUPOPTIONS)) != -1)
@ -524,6 +524,10 @@ doswitch(int *argc, char ***argv, TREE ** collTp, int *oflagsp, int *aflagsp,
case 'f':
oflags |= CFLIST;
break;
case 'i':
oflags |= CFIGNCHERR;
aflags &= ~CFIGNCHERR;
break;
case 'k':
oflags |= CFKEEP;
aflags &= ~CFKEEP;

View File

@ -1,4 +1,4 @@
/* $NetBSD: supcmeat.c,v 1.41 2013/03/08 20:56:44 christos Exp $ */
/* $NetBSD: supcmeat.c,v 1.42 2013/04/09 16:39:20 christos Exp $ */
/*
* Copyright (c) 1992 Carnegie Mellon University
@ -334,7 +334,8 @@ setup(TREE * t)
/* read time of last upgrade from when file */
if ((thisC->Cflags & CFURELSUF) && thisC->Crelease)
(void) sprintf(relsufix, ".%s", thisC->Crelease);
(void) snprintf(relsufix, sizeof(relsufix), ".%s",
thisC->Crelease);
else
relsufix[0] = '\0';
lasttime = getwhen(collname, relsufix);
@ -404,7 +405,7 @@ suplogin(void)
int f, x;
/* lock collection if desired */
(void) sprintf(buf, FILELOCK, collname);
(void) snprintf(buf, sizeof(buf), FILELOCK, collname);
f = open(buf, O_RDONLY, 0);
if (f >= 0) {
@ -495,15 +496,19 @@ listfiles(void)
if ((thisC->Cflags & CFURELSUF) && release)
(void) sprintf(relsufix, ".%s", release);
(void) snprintf(relsufix, sizeof(relsufix), ".%s", release);
else
relsufix[0] = '\0';
(void) sprintf(buf, FILELAST, collname, relsufix);
(void) snprintf(buf, sizeof(buf), FILELAST, collname, relsufix);
f = fopen(buf, "r");
if (f) {
while ((p = fgets(buf, STRINGLENGTH, f))) {
if ((q = strchr(p, '\n')))
*q = '\0';
else {
p[512] = '\0';
goaway("Line too long in LAST: %s", p);
}
if (strchr("#;:", *p))
continue;
if (canonicalize(p) != 0)
@ -513,12 +518,16 @@ listfiles(void)
(void) fclose(f);
}
refuseT = NULL;
(void) sprintf(buf, FILEREFUSE, collname);
(void) snprintf(buf, sizeof(buf), FILEREFUSE, collname);
f = fopen(buf, "r");
if (f) {
while ((p = fgets(buf, STRINGLENGTH, f))) {
if ((q = strchr(p, '\n')))
*q = '\0';
else {
p[512] = '\0';
goaway("Line too long in REFUSE: %s", p);
}
if (strchr("#;:", *p))
continue;
(void) Tinsert(&refuseT, p, FALSE);
@ -670,11 +679,9 @@ deleteone(TREE * t, void *v __unused)
}
if (rmdir(name) < 0) {
(void) chmod(name, sbuf.st_mode | S_IRWXU);
if (strlen(name) < MAXPATHLEN - 3) {
sprintf(pname, "%s/..", name);
if (stat(pname, &pbuf) == 0)
(void) chmod(pname, pbuf.st_mode | S_IRWXU);
}
snprintf(pname, sizeof(pname), "%s/..", name);
if (stat(pname, &pbuf) == 0)
(void) chmod(pname, pbuf.st_mode | S_IRWXU);
runp("rm", "rm", "-rf", name, 0);
}
if (rmdir(name) < 0 && errno != ENOENT) {
@ -797,11 +804,9 @@ prepare(char *name, int mode, int *newp, struct stat * statp)
if (S_ISDIR(statp->st_mode)) {
if (rmdir(name) < 0) {
(void) chmod(name, statp->st_mode | S_IRWXU);
if (strlen(name) < MAXPATHLEN - 3) {
sprintf(pname, "%s/..", name);
if (stat(pname, &pbuf) == 0)
(void) chmod(pname, pbuf.st_mode | S_IRWXU);
}
snprintf(pname, sizeof(pname), "%s/..", name);
if (stat(pname, &pbuf) == 0)
(void) chmod(pname, pbuf.st_mode | S_IRWXU);
runp("rm", "rm", "-rf", name, 0);
}
if (rmdir(name) < 0)
@ -905,10 +910,12 @@ recvdir(TREE * t, int new, struct stat * statp)
return (FALSE);
}
if ((t->Tflags & FNOACCT) == 0) {
if (chown(t->Tname, t->Tuid, t->Tgid) < 0)
if (chown(t->Tname, t->Tuid, t->Tgid) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chown %s (%s)", t->Tname,
strerror(errno));
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0)
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chmod %s (%s)", t->Tname,
strerror(errno));
}
@ -1000,10 +1007,12 @@ recvreg(TREE * t, int new, struct stat * statp)
}
vnotify(0, "Updating file %s", t->Tname);
if ((t->Tflags & FNOACCT) == 0) {
if (chown(t->Tname, t->Tuid, t->Tgid) < 0)
if (chown(t->Tname, t->Tuid, t->Tgid) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chown %s (%s)", t->Tname,
strerror(errno));
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0)
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chmod %s (%s)", t->Tname,
strerror(errno));
}
@ -1040,10 +1049,11 @@ recvreg(TREE * t, int new, struct stat * statp)
return (TRUE); /* mark upgrade as nogood */
}
path(t->Tname, dirpart, filepart);
(void) sprintf(filename, FILEBACKUP, dirpart, filepart);
(void) snprintf(filename, sizeof(filename), FILEBACKUP,
dirpart, filepart);
fout = fopen(filename, "w");
if (fout == NULL) {
(void) sprintf(buf, FILEBKDIR, dirpart);
(void) snprintf(buf, sizeof(buf), FILEBKDIR, dirpart);
(void) mkdir(buf, 0755);
fout = fopen(filename, "w");
}
@ -1066,10 +1076,12 @@ recvreg(TREE * t, int new, struct stat * statp)
if ((t->Tflags & FNOACCT) == 0) {
/* convert user and group names to local ids */
ugconvert(t->Tuser, t->Tgroup, &t->Tuid, &t->Tgid, &t->Tmode);
if (chown(t->Tname, t->Tuid, t->Tgid) < 0)
if (chown(t->Tname, t->Tuid, t->Tgid) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chown %s (%s)", t->Tname,
strerror(errno));
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0)
if (chmod(t->Tname, t->Tmode & S_IMODE) < 0 &&
(thisC->Cflags & CFIGNCHERR) == 0)
goaway("Can't chmod %s (%s)", t->Tname,
strerror(errno));
}
@ -1242,7 +1254,8 @@ copyfile(char *to, char *from)
for (;;) {
/* try destination directory */
path(to, dpart, fpart);
(void) sprintf(tname, "%s/#%d.sup", dpart, thispid);
(void) snprintf(tname, sizeof(tname), "%s/#%d.sup", dpart,
thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (tof >= 0)
break;
@ -1251,7 +1264,7 @@ copyfile(char *to, char *from)
if (chdir(thisC->Cbase) < 0)
goaway("Can't chdir to %s (%s)", thisC->Cbase,
strerror(errno));
(void) sprintf(tname, "sup/#%d.sup", thispid);
(void) snprintf(tname, sizeof(tname), "sup/#%d.sup", thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (tof >= 0) {
if (thisC->Cprefix)
@ -1261,7 +1274,7 @@ copyfile(char *to, char *from)
break;
}
/* try base directory */
(void) sprintf(tname, "#%d.sup", thispid);
(void) snprintf(tname, sizeof(tname), "#%d.sup", thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (thisC->Cprefix)
if (chdir(thisC->Cprefix) < 0)
@ -1271,19 +1284,21 @@ copyfile(char *to, char *from)
break;
#ifdef VAR_TMP
/* try /var/tmp */
(void) sprintf(tname, "/var/tmp/#%d.sup", thispid);
(void) snprintf(tname, sizeof(tname), "/var/tmp/#%d.sup",
thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (tof >= 0)
break;
#else
/* try /usr/tmp */
(void) sprintf(tname, "/usr/tmp/#%d.sup", thispid);
(void) snprintf(tname, sizeof(tname), "/usr/tmp/#%d.sup",
thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (tof >= 0)
break;
#endif
/* try /tmp */
(void) sprintf(tname, "/tmp/#%d.sup", thispid);
(void) snprintf(tname, sizeof(tname), "/tmp/#%d.sup", thispid);
tof = open(tname, (O_WRONLY | O_CREAT | O_TRUNC | O_EXCL), 0600);
if (tof >= 0)
break;
@ -1460,8 +1475,9 @@ finishup(int x)
FILE *finishfile; /* record of all filenames */
if ((thisC->Cflags & CFURELSUF) && release) {
(void) sprintf(relsufix, ".%s", release);
(void) sprintf(collrelname, "%s-%s", collname, release);
(void) snprintf(relsufix, sizeof(relsufix), ".%s", release);
(void) snprintf(collrelname, sizeof(collrelname), "%s-%s",
collname, release);
} else {
relsufix[0] = '\0';
(void) strcpy(collrelname, collname);
@ -1512,7 +1528,7 @@ finishup(int x)
(void) requestend();
return;
}
(void) sprintf(fname, FILEWHEN, collname, relsufix);
(void) snprintf(fname, sizeof(fname), FILEWHEN, collname, relsufix);
if (establishdir(fname)) {
int oerrno = errno;
Tfree(&lastT);
@ -1541,7 +1557,7 @@ finishup(int x)
done(FDONESUCCESS, "Success");
(void) requestend();
}
(void) sprintf(tname, FILELASTTEMP, collname, relsufix);
(void) snprintf(tname, sizeof(tname), FILELASTTEMP, collname, relsufix);
finishfile = fopen(tname, "w");
if (finishfile == NULL) {
notify(1, "Can't record list of all files in %s", tname);
@ -1550,7 +1566,7 @@ finishup(int x)
}
(void) Tprocess(lastT, finishone, finishfile);
(void) fclose(finishfile);
(void) sprintf(fname, FILELAST, collname, relsufix);
(void) snprintf(fname, sizeof(fname), FILELAST, collname, relsufix);
if (rename(tname, fname) < 0)
notify(1, "Can't change %s to %s (%s)", tname, fname,
strerror(errno));
@ -1563,7 +1579,7 @@ finishone(TREE * t, void *fv)
{
FILE *finishfile = fv;
if ((thisC->Cflags & CFDELETE) == 0 || (t->Tflags & FUPDATE))
fprintf(finishfile, "%s", t->Tname);
fprintf(finishfile, "%s\n", t->Tname);
return (SCMOK);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: supcparse.c,v 1.15 2011/09/21 19:34:54 christos Exp $ */
/* $NetBSD: supcparse.c,v 1.16 2013/04/09 16:39:20 christos Exp $ */
/*
* Copyright (c) 1992 Carnegie Mellon University
@ -69,7 +69,7 @@ typedef enum { /* supfile options */
OHOST, OBASE, OHOSTBASE, OPREFIX, ORELEASE,
ONOTIFY, OLOGIN, OPASSWORD, OCRYPT,
OBACKUP, ODELETE, OEXECUTE, OOLD, OTIMEOUT, OKEEP, OURELSUF,
OCOMPRESS, OCANONICALIZE
OCOMPRESS, OCANONICALIZE, OIGNCHERR,
} OPTION;
struct option {
@ -94,6 +94,7 @@ struct option {
{ "use-rel-suffix", OURELSUF },
{ "compress", OCOMPRESS },
{ "canonicalize", OCANONICALIZE },
{ "igncherr", OIGNCHERR },
};
static void passdelim(char **, char);
@ -224,6 +225,9 @@ parsecoll(COLLECTION * c, char *collname, char *args)
arg = nxtarg(&args, " \t");
c->Ctimeout = atoi(arg);
break;
case OIGNCHERR:
c->Cflags |= CFIGNCHERR;
break;
}
}
return (0);