svn commit: trunk/uClibc/librt

vapier at uclibc.org vapier at uclibc.org
Fri Feb 9 22:23:35 UTC 2007


Author: vapier
Date: 2007-02-09 14:23:35 -0800 (Fri, 09 Feb 2007)
New Revision: 17847

Log:
Kay McCormick reports: when evp is NULL, it is reset too late and so can cause a crash when it is dereferenced

Modified:
   trunk/uClibc/librt/timer_create.c


Changeset:
Modified: trunk/uClibc/librt/timer_create.c
===================================================================
--- trunk/uClibc/librt/timer_create.c	2007-02-09 22:14:34 UTC (rev 17846)
+++ trunk/uClibc/librt/timer_create.c	2007-02-09 22:23:35 UTC (rev 17847)
@@ -26,9 +26,19 @@
 {
 	int retval;
 	kernel_timer_t ktimerid;
-	struct sigevent local_evp;
+	struct sigevent default_evp;
 	struct timer *newp;
 
+	if (evp == NULL) {
+		/*
+		 * The kernel has to pass up the timer ID which is a userlevel object.
+		 * Therefore we cannot leave it up to the kernel to determine it.
+		 */
+		default_evp.sigev_notify = SIGEV_SIGNAL;
+		default_evp.sigev_signo = SIGALRM;
+		evp = &default_evp;
+	}
+
 	/* Notification via a thread is not supported yet */
 	if (__builtin_expect(evp->sigev_notify == SIGEV_THREAD, 1))
 		return -1;
@@ -38,25 +48,14 @@
 	 * struct timer as a derived class with the first two elements
 	 * being in the superclass. We only need these two elements here.
 	 */
-	newp = (struct timer *)malloc(offsetof(struct timer, thrfunc));
+	newp = malloc(offsetof(struct timer, thrfunc));
 	if (newp == NULL)
 		return -1;	/* No memory */
+	default_evp.sigev_value.sival_ptr = newp;
 
-	if (evp == NULL) {
-		/*
-		 * The kernel has to pass up the timer ID which is a userlevel object.
-		 * Therefore we cannot leave it up to the kernel to determine it.
-		 */
-		local_evp.sigev_notify = SIGEV_SIGNAL;
-		local_evp.sigev_signo = SIGALRM;
-		local_evp.sigev_value.sival_ptr = newp;
-
-		evp = &local_evp;
-	}
-
 	retval = __syscall_timer_create(clock_id, evp, &ktimerid);
 	if (retval != -1) {
-		newp->sigev_notify = (evp != NULL ? evp->sigev_notify : SIGEV_SIGNAL);
+		newp->sigev_notify = evp->sigev_notify;
 		newp->ktimerid = ktimerid;
 
 		*timerid = (timer_t) newp;




More information about the uClibc-cvs mailing list