File gpm-1.20.1-va_arg.patch of Package gpm

--- src/lib/report-lib.c
+++ src/lib/report-lib.c
@@ -41,5 +41,7 @@
    vfprintf(stderr,text,ap);
    fprintf(stderr,"\n");
 
+   va_end(ap);
+
    if(stat == GPM_STAT_OOPS) exit(1);  /* may a lib function call exit ???? */
 }
--- src/report.c
+++ src/report.c
@@ -71,9 +71,18 @@
 void gpm_report(int line, char *file, int stat, char *text, ... )
 {
    FILE *console = NULL;
-   va_list ap;
+   va_list ap,ap2;
+#ifdef HAVE_VSYSLOG
+   va_list ap_sys;
+#endif
+   int exit_request=0;  /* 0 -> return is requested
+			   1 -> exit(1) is requested
+			   2 -> _exit(1) is requested */
 
    va_start(ap,text);
+#ifdef HAVE_VSYSLOG
+   va_copy(ap_sys,ap);
+#endif
 
    switch(option.run_status) {
       /******************** STARTUP *****************/
@@ -82,7 +91,7 @@
             case GPM_STAT_INFO:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO);
-               vsyslog(LOG_INFO | LOG_USER, text, ap);
+               vsyslog(LOG_INFO | LOG_USER, text, ap_sys);
 #endif               
                fprintf(stderr,GPM_STRING_INFO);
                vfprintf(stderr,text,ap);
@@ -92,7 +101,7 @@
             case GPM_STAT_WARN:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN);
-               vsyslog(LOG_DAEMON | LOG_WARNING, text, ap);
+               vsyslog(LOG_DAEMON | LOG_WARNING, text, ap_sys);
 #endif               
                fprintf(stderr,GPM_STRING_WARN);
                vfprintf(stderr,text,ap);
@@ -102,7 +111,7 @@
             case GPM_STAT_ERR:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR);
-               vsyslog(LOG_DAEMON | LOG_ERR, text, ap);
+               vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys);
 #endif               
                fprintf(stderr,GPM_STRING_ERR);
                vfprintf(stderr,text,ap);
@@ -112,13 +121,13 @@
             case GPM_STAT_OOPS:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS);
-               vsyslog(LOG_DAEMON | LOG_ERR, text, ap);
+               vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys);
 #endif               
                fprintf(stderr,GPM_STRING_OOPS);
                vfprintf(stderr,text,ap);
                fprintf(stderr,"\n");
 
-               exit(1); /* we should have a oops()-function,but this works,too*/
+               exit_request=1; /* we should have a oops()-function,but this works,too*/
                break;
          }
          break; /* startup sequence */   
@@ -129,14 +138,14 @@
             case GPM_STAT_INFO:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_INFO | LOG_USER, GPM_STRING_INFO);
-               vsyslog(LOG_INFO | LOG_USER, text, ap);
+               vsyslog(LOG_INFO | LOG_USER, text, ap_sys);
 #endif
                break;
 
             case GPM_STAT_WARN:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_WARNING, GPM_STRING_WARN);
-               vsyslog(LOG_DAEMON | LOG_WARNING, text, ap);
+               vsyslog(LOG_DAEMON | LOG_WARNING, text, ap_sys);
 #endif               
                if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) {
                   fprintf(console,GPM_STRING_WARN);
@@ -149,8 +158,9 @@
             case GPM_STAT_ERR:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_ERR);
-               vsyslog(LOG_DAEMON | LOG_ERR, text, ap);
+               vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys);
 #endif               
+	       va_copy(ap2,ap);
                if((console = fopen(GPM_SYS_CONSOLE,"a")) != NULL) {
                   fprintf(console,GPM_STRING_ERR);
                   vfprintf(console,text,ap);
@@ -160,22 +170,24 @@
 
                if((console = fopen(option.consolename,"a")) != NULL) {
                   fprintf(console,GPM_STRING_ERR);
-                  vfprintf(console,text,ap);
+                  vfprintf(console,text,ap2);
                   fprintf(console,"\n");
                   fclose(console);
                }
+	       
+	       va_end(ap2);
                break;
 
             case GPM_STAT_OOPS:
 #ifdef HAVE_VSYSLOG
                syslog(LOG_DAEMON | LOG_ERR, GPM_STRING_OOPS);
-               vsyslog(LOG_DAEMON | LOG_ERR, text, ap);
+               vsyslog(LOG_DAEMON | LOG_ERR, text, ap_sys);
 #endif               
                fprintf(stderr,GPM_STRING_OOPS);
                vfprintf(stderr,text,ap);
                fprintf(stderr,"\n");
 
-               _exit(1); /* we are the fork()-child */
+               exit_request=2; /* we are the fork()-child */
                break;
          }
          break; /* running gpm */
@@ -203,10 +215,21 @@
          vfprintf(console,text,ap);
          fprintf(console,"\n");
          
-         if(stat == GPM_STAT_OOPS) exit(1);
-
+         if(stat == GPM_STAT_OOPS) exit_request=1;
+	    
          break;
    } /* switch for current modus */
+   
+   va_end(ap);
+#ifdef HAVE_VSYSLOG
+   va_end(ap_sys);
+#endif
+   
+   if (exit_request == 2)
+      _exit(1);
+   if (exit_request == 1)
+      exit(1);
+   return;     
 } /* gpm_report */   
 
 
openSUSE Build Service is sponsored by