From 394af5a2162c44a4e2f16897b611f622f8dbbfac Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Sun, 26 Feb 2017 23:10:17 +0100 Subject: [PATCH] authsrv: handle short reads in initkeyseed() --- sys/src/cmd/auth/authsrv.c | 18 ++++++++++++------ 1 file 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); }