diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-02-26 23:10:17 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2017-02-26 23:10:17 +0100 |
commit | 394af5a2162c44a4e2f16897b611f622f8dbbfac (patch) | |
tree | 1fa924e14db33e1a2c600adf59abac033ee91f4b /sys/src | |
parent | 6de804b578e54fb2e7d24e56c3032def4d24547e (diff) |
authsrv: handle short reads in initkeyseed()
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/auth/authsrv.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/src/cmd/auth/authsrv.c b/sys/src/cmd/auth/authsrv.c index 051c08ff1..23a6a38a2 100644 --- a/sys/src/cmd/auth/authsrv.c +++ b/sys/src/cmd/auth/authsrv.c @@ -1008,14 +1008,20 @@ initkeyseed(void) int fd; genrandom(keyseed, sizeof(keyseed)); - if((fd = create("/adm/keyseed", OWRITE|OEXCL, 0600)) >= 0){ - write(fd, keyseed, sizeof(keyseed)); - } else if((fd = open("/adm/keyseed", OREAD)) >= 0){ - read(fd, keyseed, sizeof(keyseed)); - } else{ - syslog(0, AUTHLOG, "initkeyseed: no seed file: %r"); + if((fd = open("/adm/keyseed", OREAD)) >= 0){ + werrstr("file truncated"); + if(read(fd, keyseed, sizeof(keyseed)) == sizeof(keyseed)){ + close(fd); + return; + } + close(fd); + } + syslog(0, AUTHLOG, "initkeyseed: no keyseed: %r"); + if((fd = create("/adm/keyseed", OWRITE, 0600)) < 0){ + syslog(0, AUTHLOG, "initkeyseed: can't create: %r"); return; } + write(fd, keyseed, sizeof(keyseed)); close(fd); } |