]> The Tcpdump Group git mirrors - libpcap/commitdiff
Don't check for NULL in cleanup routines, and don't pass NULL to them.
authorGuy Harris <[email protected]>
Fri, 15 Apr 2016 23:36:59 +0000 (16:36 -0700)
committerGuy Harris <[email protected]>
Fri, 15 Apr 2016 23:36:59 +0000 (16:36 -0700)
pcap_close() won't pass a null pointer - it'll crash long before that
when handed a null pointer, as the platforms on which we run map out
page 0.

Remove the null pointer checks, and, in cases where the cleanup routines
are called internally, make sure we don't pass them a null pointer.

pcap-dag.c
pcap-dos.c
pcap-snf.c

index 6a53ed86e2a837469747c43e4901bd7a4cfa9a8c..77c03b363423920af8f714e80406ef6d6af96ff1 100644 (file)
@@ -144,28 +144,25 @@ delete_pcap_dag(pcap_t *p)
 static void
 dag_platform_cleanup(pcap_t *p)
 {
-       struct pcap_dag *pd;
+       struct pcap_dag *pd = p->pr;
 
-       if (p != NULL) {
-               pd = p->priv;
 #ifdef HAVE_DAG_STREAMS_API
-               if(dag_stop_stream(p->fd, pd->dag_stream) < 0)
-                       fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
+       if(dag_stop_stream(p->fd, pd->dag_stream) < 0)
+               fprintf(stderr,"dag_stop_stream: %s\n", strerror(errno));
 
-               if(dag_detach_stream(p->fd, pd->dag_stream) < 0)
-                       fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
+       if(dag_detach_stream(p->fd, pd->dag_stream) < 0)
+               fprintf(stderr,"dag_detach_stream: %s\n", strerror(errno));
 #else
-               if(dag_stop(p->fd) < 0)
-                       fprintf(stderr,"dag_stop: %s\n", strerror(errno));
+       if(dag_stop(p->fd) < 0)
+               fprintf(stderr,"dag_stop: %s\n", strerror(errno));
 #endif /* HAVE_DAG_STREAMS_API */
-               if(p->fd != -1) {
-                       if(dag_close(p->fd) < 0)
-                               fprintf(stderr,"dag_close: %s\n", strerror(errno));
-                       p->fd = -1;
-               }
-               delete_pcap_dag(p);
-               pcap_cleanup_live_common(p);
+       if(p->fd != -1) {
+               if(dag_close(p->fd) < 0)
+                       fprintf(stderr,"dag_close: %s\n", strerror(errno));
+               p->fd = -1;
        }
+       delete_pcap_dag(p);
+       pcap_cleanup_live_common(p);
        /* Note: don't need to call close(p->fd) here as dag_close(p->fd) does this. */
 }
 
@@ -174,7 +171,8 @@ atexit_handler(void)
 {
        while (pcap_dags != NULL) {
                if (pcap_dags->pid == getpid()) {
-                       dag_platform_cleanup(pcap_dags->p);
+                       if (pcap_dags->p != NULL)
+                               dag_platform_cleanup(pcap_dags->p);
                } else {
                        delete_pcap_dag(pcap_dags->p);
                }
index bf4777da332ab5c66cfb9b690c5a454c1946241c..c9a6a7c7c97a53456f660240ef2a87c5299f280d 100644 (file)
@@ -451,7 +451,7 @@ static void pcap_cleanup_dos (pcap_t *p)
 {
   struct pcap_dos *pd;
 
-  if (p && !exc_occured)
+  if (!exc_occured)
   {
     pd = p->priv;
     if (pcap_stats(p,NULL) < 0)
@@ -783,7 +783,7 @@ static void exc_handler (int sig)
          fprintf (stderr, "Catching signal %d.\n", sig);
   }
   exc_occured = 1;
-  pcap_cleanup_dos (NULL);
+  close_driver();
 }
 #endif  /* __DJGPP__ */
 
index 2271fd668b9139c29e3f68295b80a36be1286ab2..a453b11cd9b5fdcb01a1806687385016e20292aa 100644 (file)
@@ -66,9 +66,6 @@ snf_platform_cleanup(pcap_t *p)
 {
        struct pcap_snf *ps = p->priv;
 
-       if (p == NULL)
-               return;
-
 #ifdef SNF_HAVE_INJECT_API
         if (ps->snf_inj)
                 snf_inject_close(ps->snf_inj);