From: Todd C. Miller Date: Wed, 29 Aug 2012 14:32:49 +0000 (-0400) Subject: Use fseeko() for legacy utmp handling if available. X-Git-Tag: SUDO_1_8_6^2~8 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=71e2d8290b80aa661ec07e34eb3d0a875db624a2;p=sudo Use fseeko() for legacy utmp handling if available. --- diff --git a/config.h.in b/config.h.in index 9f7990dad..eb5e593d9 100644 --- a/config.h.in +++ b/config.h.in @@ -149,6 +149,9 @@ /* Define to 1 if you have the `freeifaddrs' function. */ #undef HAVE_FREEIFADDRS +/* Define to 1 if you have the `fseeko' function. */ +#undef HAVE_FSEEKO + /* Define to 1 if you have the `futime' function. */ #undef HAVE_FUTIME diff --git a/configure b/configure index 7a2748a25..a46f43472 100755 --- a/configure +++ b/configure @@ -16710,6 +16710,17 @@ if eval test \"x\$"$as_ac_var"\" = x"yes"; then : #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF break +fi +done + + for ac_func in fseeko +do : + ac_fn_c_check_func "$LINENO" "fseeko" "ac_cv_func_fseeko" +if test "x$ac_cv_func_fseeko" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_FSEEKO 1 +_ACEOF + fi done diff --git a/configure.in b/configure.in index ce27db9b8..f3b4f5d5b 100644 --- a/configure.in +++ b/configure.in @@ -2213,6 +2213,7 @@ utmp_style=LEGACY AC_CHECK_FUNCS(getutxid getutid, [utmp_style=POSIX; break]) if test "$utmp_style" = "LEGACY"; then AC_CHECK_FUNCS(getttyent ttyslot, [break]) + AC_CHECK_FUNCS(fseeko) fi AC_CHECK_FUNCS(sysctl, [AC_CHECK_MEMBERS([struct kinfo_proc.ki_tdev], [], diff --git a/src/utmp.c b/src/utmp.c index 91ff144dd..97a1ea659 100644 --- a/src/utmp.c +++ b/src/utmp.c @@ -328,7 +328,11 @@ utmp_login(const char *from_line, const char *to_line, int ttyfd, } } utmp_fill(to_line, user, ut_old, &utbuf); +#ifdef HAVE_FSEEKO + if (fseeko(fp, slot * (off_t)sizeof(utbuf), SEEK_SET) == 0) { +#else if (fseek(fp, slot * (long)sizeof(utbuf), SEEK_SET) == 0) { +#endif if (fwrite(&utbuf, sizeof(utbuf), 1, fp) == 1) rval = true; } @@ -361,7 +365,11 @@ utmp_logout(const char *line, int status) # endif utmp_settime(&utbuf); /* Back up and overwrite record. */ +#ifdef HAVE_FSEEKO + if (fseeko(fp, (off_t)0 - (off_t)sizeof(utbuf), SEEK_CUR) == 0) { +#else if (fseek(fp, 0L - (long)sizeof(utbuf), SEEK_CUR) == 0) { +#endif if (fwrite(&utbuf, sizeof(utbuf), 1, fp) == 1) rval = true; }