The settimeofday problem is that the timeval and timespec structures are not
the same size. In particular, the fractional part is an int in timeval, and
a long in timespec. The stime problem is that the argument is not an int,
but a time_t, which is long on at least some 64-bit systems.
The following patch appears to fix this on my sparc64.
===================================================================
--- ./kernel/time.c.orig 2003-06-16 22:36:04.000000000 -0700
+++ ./kernel/time.c 2003-06-18 00:00:43.000000000 -0700
@@ -66,7 +66,7 @@
* architectures that need it).
*/
-asmlinkage long sys_stime(int * tptr)
+asmlinkage long sys_stime(time_t * tptr)
{
struct timespec tv;
@@ -162,13 +162,15 @@
asmlinkage long sys_settimeofday(struct timeval __user *tv, struct timezone __user *tz)
{
+ struct timeval user_tv;
struct timespec new_tv;
struct timezone new_tz;
if (tv) {
- if (copy_from_user(&new_tv, tv, sizeof(*tv)))
+ if (copy_from_user(&user_tv, tv, sizeof(*tv)))
return -EFAULT;
- new_tv.tv_nsec *= NSEC_PER_USEC;
+ new_tv.tv_sec = user_tv.tv_sec;
+ new_tv.tv_nsec = user_tv.tv_usec * NSEC_PER_USEC;
}
if (tz) {
if (copy_from_user(&new_tz, tz, sizeof(*tz)))
===================================================================
-- B. D. Elliott bde@nwlink.com - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/