On Sat, Aug 20, 2005 at 07:51:17PM -0500, Mike Hokenson wrote:
> I'm not sure what your patch looks like, but just testing for a NULL 
> u->scontext didn't work, I had to do this:

Aggg.. you are right, I don't think clearly this late, the problem is that
u->scontext is undefined, that's why free() segfaults.
How about this patch? It should also fix other segfaults which were fixed
on a Fedora patch.

Javier
diff -Nru cron-3.0pl1-88/do_command.c cron-3.0pl1-91/do_command.c
--- cron-3.0pl1-88/do_command.c 2005-08-21 03:17:04.000000000 +0200
+++ cron-3.0pl1-91/do_command.c 2005-08-21 03:13:58.000000000 +0200
@@ -331,7 +331,7 @@
                        fprintf(stdout,"error");
 #endif
 #ifdef WITH_SELINUX
-                       if (is_selinux_enabled() > 0) {
+                       if ((is_selinux_enabled() > 0) && (u->scontext != 0L)) {
                             security_context_t scontext;
                             if (setexeccon(u->scontext) < 0) {
                                 if (security_getenforce() > 0) {
diff -Nru cron-3.0pl1-88/user.c cron-3.0pl1-91/user.c
--- cron-3.0pl1-88/user.c       2005-08-21 03:17:04.000000000 +0200
+++ cron-3.0pl1-91/user.c       2005-08-21 03:15:37.000000000 +0200
@@ -36,7 +36,7 @@
 
 static int get_security_context(char *name, int crontab_fd, security_context_t
                                 *rcontext, char *tabname) {
-    security_context_t scontext;
+    security_context_t scontext=NULL;
     security_context_t  file_context=NULL;
     struct av_decision avd;
     int retval=0;
@@ -50,6 +50,7 @@
             log_it(name, getpid(),
                    "No security context but SELinux in permissive mode,"
                    " continuing", tabname);
+           return 0;
         }
     }
 
@@ -133,7 +134,8 @@
                free_entry(e);
        }
 #ifdef WITH_SELINUX
-        freecon(u->scontext);
+       if (u->scontext)
+               freecon(u->scontext);
 #endif
        free(u);
 }
@@ -175,6 +177,7 @@
        u->crontab = NULL;
 
 #ifdef WITH_SELINUX
+       u->scontext = NULL;
         if (is_selinux_enabled() > 0) {
             char *sname=uname;
             if (pw==NULL) {

Attachment: signature.asc
Description: Digital signature

Reply via email to