SCCS-vsn: usr.bin/rdist/server.c 4.22
-static char *sccsid = "@(#)server.c 4.21 (Berkeley) 84/12/06";
+static char *sccsid = "@(#)server.c 4.22 (Berkeley) 84/12/07";
- if (symlink(buf, new) < 0)
- goto badn;
+ if (symlink(buf, new) < 0) {
+ if (errno != ENOENT || chkparent(new) < 0 ||
+ symlink(buf, new) < 0)
+ goto badn;
+ }
mode &= 0777;
if (opts & COMPARE) {
char tbuf[BUFSIZ];
mode &= 0777;
if (opts & COMPARE) {
char tbuf[BUFSIZ];
- if ((i = readlink(target, tbuf, BUFSIZ)) < 0)
- goto badt;
- if (i == size && strncmp(buf, tbuf, size) == 0) {
+ if ((i = readlink(target, tbuf, BUFSIZ)) >= 0 &&
+ i == size && strncmp(buf, tbuf, size) == 0) {
(void) unlink(new);
ack();
return;
(void) unlink(new);
ack();
return;
if ((f = creat(new, mode)) < 0) {
if (errno != ENOENT || chkparent(new) < 0 ||
(f = creat(new, mode)) < 0)
if ((f = creat(new, mode)) < 0) {
if (errno != ENOENT || chkparent(new) < 0 ||
(f = creat(new, mode)) < 0)
(void) unlink(new);
return;
}
(void) unlink(new);
return;
}
if (chog(new, owner, group, mode) < 0) {
(void) unlink(new);
return;
}
if (chog(new, owner, group, mode) < 0) {
(void) unlink(new);
return;
}
if (rename(new, target) < 0) {
badt:
error("%s:%s: %s\n", host, target, sys_errlist[errno]);
if (rename(new, target) < 0) {
badt:
error("%s:%s: %s\n", host, target, sys_errlist[errno]);