X-Git-Url: http://www.average.org/gitweb/?p=pam_pcsc_cr.git;a=blobdiff_plain;f=authfile.c;h=6937a665dddd68b66d85c22ef1394846530ab6ce;hp=abf31fb8f91ff665823e67395fe9eb26043a078c;hb=3bbb37e0ef1e77e9a93b7be7fb506bbbdd6a0400;hpb=54f191d82623f7bc8468322a0aa044002584827d diff --git a/authfile.c b/authfile.c index abf31fb..6937a66 100644 --- a/authfile.c +++ b/authfile.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -109,7 +110,7 @@ struct _auth_obj authfile(const char *tokenid, struct _auth_obj ret = {0}; mode_t oldmask; FILE *fp = NULL; - char *fn; + char *fn, *nfn; int fnl; char *buf = NULL; struct { @@ -130,6 +131,8 @@ struct _auth_obj authfile(const char *tokenid, } fn = alloca(fnl); make_path(fn, tokenid, userid); + nfn = alloca(fnl+32); + snprintf(nfn, fnl+32, "%s.%d.%ld", fn, (int)getpid(), (long)time(NULL)); fp = fopen(fn, "r"); if (fp) { struct stat st; @@ -187,7 +190,7 @@ struct _auth_obj authfile(const char *tokenid, } oldmask = umask(077); - if ((fp = fopen(fn, "w"))) { + if ((fp = fopen(nfn, "w"))) { int i; if (fprintf(fp, "%s:%s:%s:", tokenid?tokenid:w.tokenid, @@ -205,9 +208,14 @@ struct _auth_obj authfile(const char *tokenid, ret.err = strerror(errno); } (void)umask(oldmask); + if (ret.err) { + unlink(nfn); /* may not exist but no matter */ + } else if (rename(nfn, fn)) { + ret.err = strerror(errno); + } if (!ret.err) { - int bufsize = (w.userid?strlen(w.userid)+1:0) + ao.paylsize; + int bufsize = (w.userid?strlen(w.userid)+1:0) + ao.paylsize + 1; if (bufsize) { if ((ret.buffer = malloc(bufsize)) == NULL) { ret.err = "authfile malloc failed"; @@ -221,8 +229,9 @@ struct _auth_obj authfile(const char *tokenid, } if (ao.payload) { memcpy(p, ao.payload, ao.paylsize); + p[ao.paylsize] = '\0'; ret.payload = p; - ret.paylsize = ao.paylsize; + ret.paylsize = ao.paylsize+1; } } }