mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-15 10:30:25 -08:00
Fix miscellaneous update-game-score bugs.
* configure.ac (difftime): Remove. * lib/update-game-score.c (difftime) [!HAVE_DIFFTIME]: Remove. (read_score) [HAVE_GETDELIM]: Don't access uninitialized storage. (read_scores, write_scores): Check for fclose failure. (write_scores): Use fchmod, not chmod, to avoid a race. (lock_file): Fix test for out-of-date lock file; it was reversed. Use ordinary subtraction rather than difftime; since we're already assuming POSIX we don't need to worry about the possibility of time_t being a magic cookie.
This commit is contained in:
parent
edace89f26
commit
dc217d0180
4 changed files with 25 additions and 13 deletions
|
|
@ -1,3 +1,8 @@
|
||||||
|
2014-01-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
Fix miscellaneous update-game-score bugs.
|
||||||
|
* configure.ac (difftime): Remove.
|
||||||
|
|
||||||
2014-01-20 Paul Eggert <eggert@cs.ucla.edu>
|
2014-01-20 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
Merge from gnulib, incorporating:
|
Merge from gnulib, incorporating:
|
||||||
|
|
|
||||||
|
|
@ -3468,7 +3468,6 @@ getrlimit setrlimit shutdown getaddrinfo \
|
||||||
strsignal setitimer \
|
strsignal setitimer \
|
||||||
sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \
|
sendto recvfrom getsockname getpeername getifaddrs freeifaddrs \
|
||||||
gai_strerror getline getdelim sync \
|
gai_strerror getline getdelim sync \
|
||||||
difftime \
|
|
||||||
getpwent endpwent getgrent endgrent \
|
getpwent endpwent getgrent endgrent \
|
||||||
touchlock \
|
touchlock \
|
||||||
cfmakeraw cfsetspeed copysign __executable_start log2)
|
cfmakeraw cfsetspeed copysign __executable_start log2)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,15 @@
|
||||||
|
2014-01-22 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
Fix miscellaneous update-game-score bugs.
|
||||||
|
* update-game-score.c (difftime) [!HAVE_DIFFTIME]: Remove.
|
||||||
|
(read_score) [HAVE_GETDELIM]: Don't access uninitialized storage.
|
||||||
|
(read_scores, write_scores): Check for fclose failure.
|
||||||
|
(write_scores): Use fchmod, not chmod, to avoid a race.
|
||||||
|
(lock_file): Fix test for out-of-date lock file; it was reversed.
|
||||||
|
Use ordinary subtraction rather than difftime; since we're already
|
||||||
|
assuming POSIX we don't need to worry about the possibility of
|
||||||
|
time_t being a magic cookie.
|
||||||
|
|
||||||
2014-01-19 Paul Eggert <eggert@cs.ucla.edu>
|
2014-01-19 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
update-game-score fixes for -m and integer overflow (Bug#16428)
|
update-game-score fixes for -m and integer overflow (Bug#16428)
|
||||||
|
|
|
||||||
|
|
@ -59,11 +59,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
#define MAX_ATTEMPTS 5
|
#define MAX_ATTEMPTS 5
|
||||||
#define MAX_DATA_LEN 1024
|
#define MAX_DATA_LEN 1024
|
||||||
|
|
||||||
#ifndef HAVE_DIFFTIME
|
|
||||||
/* OK on POSIX (time_t is arithmetic type) modulo overflow in subtraction. */
|
|
||||||
#define difftime(t1, t0) (double)((t1) - (t0))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static _Noreturn void
|
static _Noreturn void
|
||||||
usage (int err)
|
usage (int err)
|
||||||
{
|
{
|
||||||
|
|
@ -275,6 +270,7 @@ read_score (FILE *f, struct score_entry *score)
|
||||||
#ifdef HAVE_GETDELIM
|
#ifdef HAVE_GETDELIM
|
||||||
{
|
{
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
score->username = 0;
|
||||||
if (getdelim (&score->username, &count, ' ', f) < 1
|
if (getdelim (&score->username, &count, ' ', f) < 1
|
||||||
|| score->username == NULL)
|
|| score->username == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -371,14 +367,13 @@ read_scores (const char *filename, struct score_entry **scores,
|
||||||
while ((readval = read_score (f, &entry)) == 0)
|
while ((readval = read_score (f, &entry)) == 0)
|
||||||
if (push_score (&ret, &scorecount, &cursize, &entry) < 0)
|
if (push_score (&ret, &scorecount, &cursize, &entry) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (readval > 0)
|
if (readval > 0 && fclose (f) == 0)
|
||||||
{
|
{
|
||||||
*count = scorecount;
|
*count = scorecount;
|
||||||
*alloc = cursize;
|
*alloc = cursize;
|
||||||
*scores = ret;
|
*scores = ret;
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
}
|
||||||
fclose (f);
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -448,6 +443,8 @@ write_scores (const char *filename, const struct score_entry *scores,
|
||||||
fd = mkostemp (tempfile, 0);
|
fd = mkostemp (tempfile, 0);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
if (fchmod (fd, 0644) != 0)
|
||||||
|
return -1;
|
||||||
f = fdopen (fd, "w");
|
f = fdopen (fd, "w");
|
||||||
if (! f)
|
if (! f)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
@ -456,10 +453,9 @@ write_scores (const char *filename, const struct score_entry *scores,
|
||||||
scores[i].score, scores[i].username, scores[i].data)
|
scores[i].score, scores[i].username, scores[i].data)
|
||||||
< 0)
|
< 0)
|
||||||
return -1;
|
return -1;
|
||||||
fclose (f);
|
if (fclose (f) != 0)
|
||||||
if (rename (tempfile, filename) < 0)
|
|
||||||
return -1;
|
return -1;
|
||||||
if (chmod (filename, 0644) < 0)
|
if (rename (tempfile, filename) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -479,9 +475,9 @@ lock_file (const char *filename, void **state)
|
||||||
*state = lockpath;
|
*state = lockpath;
|
||||||
trylock:
|
trylock:
|
||||||
attempts++;
|
attempts++;
|
||||||
/* If the lock is over an hour old, delete it. */
|
/* If the lock is over an hour old, delete it. */
|
||||||
if (stat (lockpath, &buf) == 0
|
if (stat (lockpath, &buf) == 0
|
||||||
&& (difftime (buf.st_ctime, time (NULL) > 60*60)))
|
&& 60 * 60 < time (0) - buf.st_ctime)
|
||||||
unlink (lockpath);
|
unlink (lockpath);
|
||||||
fd = open (lockpath, O_CREAT | O_EXCL, 0600);
|
fd = open (lockpath, O_CREAT | O_EXCL, 0600);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue