From b0fe3bd3a744f550191331676b7df3a493008217 Mon Sep 17 00:00:00 2001 From: Nathan Wagner Date: Mon, 3 Dec 2018 10:56:29 +0000 Subject: [PATCH] fix chmod and chown ordering fix bug where metadata was not set for regular files --- zpm-syncfs.c | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/zpm-syncfs.c b/zpm-syncfs.c index 9a50be1..3c0eebb 100644 --- a/zpm-syncfs.c +++ b/zpm-syncfs.c @@ -721,6 +721,17 @@ static int set_md(struct config *conf, struct nitem *item) { return success; } + if (conf->setuser && conf->setgroup) { + rv = lchown(item->dest, item->uid, item->gid); + if (rv == -1) { + setsyserr(conf, "can't lchown %s", item->dest); + return conf->errabort; + } + } + + /* have to chmod after the chown, setuid bits may (and will) + * be cleared after a chown + */ /* can't chmod a symlink */ if (item->ftype != 'l') { rv = chmod(item->dest, item->mode); @@ -731,13 +742,6 @@ static int set_md(struct config *conf, struct nitem *item) { } } - if (conf->setuser && conf->setgroup) { - rv = lchown(item->dest, item->uid, item->gid); - if (rv == -1) { - setsyserr(conf, "can't lchown %s", item->dest); - return conf->errabort; - } - } rv = utimensat(AT_FDCWD, item->dest, item->times, AT_SYMLINK_NOFOLLOW); if (rv == -1) { @@ -814,16 +818,11 @@ static int install(struct config *conf, struct nitem *item, unsigned int flags) } } - if (item->ftype == 'r') { - rv = zpm_extract(source, item->hash, item->dest, item->mode); - if (rv == 0) { - seterror(conf, "can't extract %s", item->dest); - return failure; - } - return success; - } - + errno = 0; switch (item->ftype) { + case 'r': rv = zpm_extract(source, item->hash, item->dest, item->mode); + if (rv == 0) rv = -1; + break; case 'd': rv = mkdir(item->dest, item->mode); break; case 'l': rv = symlink(item->target, item->dest); @@ -833,6 +832,17 @@ static int install(struct config *conf, struct nitem *item, unsigned int flags) } if (rv == -1) { + switch (item->ftype) { + case 'r': + seterror(conf, "can't extract %s", item->dest); + break; + case 'd': + setsyserr(conf, "install mkdir(\"%s\") failed", item->dest); + break; + case 'l': + setsyserr(conf, "install symlink(\"%s\") failed", item->dest); + break; + } setsyserr(conf, "installing %s failed", item->dest); return failure; } -- 2.40.0