Fix intersection with linux system call personality() 04/158704/2 accepted/tizen/base/20171110.163218 submit/tizen_base/20171108.010253 submit/tizen_base/20171113.061209
authorDmitriy Evgenevich Gonzha <d.gonzha@samsung.com>
Tue, 17 Oct 2017 17:58:56 +0000 (20:58 +0300)
committerDongkyun Son <dongkyun.s@samsung.com>
Thu, 2 Nov 2017 22:17:52 +0000 (22:17 +0000)
On ASan sanitized firmware testing we got segmentation fault
error in ps application.
Its source is in system call personality() and global variable
"personality" names intersection: It leaded to system call
pointer change and error after Its call.

This patch fixes the error by changeng intersected global
variable name to "_personality"

Change-Id: I8b3faee8db91457a1d1cc1c5e0fa9cc64e3e6d6f
Signed-off-by: Dmitriy Evgenevich Gonzha <d.gonzha@samsung.com>
ps/common.h
ps/global.c
ps/parser.c
ps/select.c
ps/sortformat.c

index 157e6df..3874f98 100644 (file)
@@ -296,7 +296,7 @@ extern int             max_line_width;
 extern const char     *namelist_file;
 extern int             negate_selection;
 extern int             page_size;  // "int" for math reasons?
-extern unsigned        personality;
+extern unsigned        _personality;
 extern int             prefer_bsd_defaults;
 extern int             running_only;
 extern int             screen_cols;
index b75f728..68f1f46 100644 (file)
@@ -74,7 +74,7 @@ const char     *namelist_file = (const char *)0xdeadbeef;
 int             negate_selection = -1;
 int             running_only = -1;
 int             page_size = -1;  // "int" for math reasons?
-unsigned        personality = 0xffffffff;
+unsigned        _personality = 0xffffffff;
 int             prefer_bsd_defaults = -1;
 int             screen_cols = -1;
 int             screen_rows = -1;
@@ -220,7 +220,7 @@ static const char *set_personality(void){
   };
   const int personality_table_count = sizeof(personality_table)/sizeof(personality_table_struct);
 
-  personality = 0;
+  _personality = 0;
   prefer_bsd_defaults = 0;
 
   bsd_j_format = "OL_j";
@@ -257,7 +257,7 @@ static const char *set_personality(void){
   goto *(found->jump);    /* See gcc extension info.  :-)   */
 
   case_bsd:
-    personality = PER_FORCE_BSD | PER_BSD_h | PER_BSD_m;
+    _personality = PER_FORCE_BSD | PER_BSD_h | PER_BSD_m;
     prefer_bsd_defaults = 1;
     bsd_j_format = "FB_j";
     bsd_l_format = "FB_l";
@@ -267,13 +267,13 @@ static const char *set_personality(void){
     return NULL;
 
   case_old:
-    personality = PER_FORCE_BSD | PER_OLD_m;
+    _personality = PER_FORCE_BSD | PER_OLD_m;
     prefer_bsd_defaults = 1;
     return NULL;
 
   case_debian:  /* Toss this? They don't seem to care much. */
   case_gnu:
-    personality = PER_GOOD_o | PER_OLD_m;
+    _personality = PER_GOOD_o | PER_OLD_m;
     prefer_bsd_defaults = 1;
     sysv_f_format  = "RD_f";
     /* sysv_fl_format = "RD_fl"; */   /* old Debian ps can't do this! */
@@ -282,7 +282,7 @@ static const char *set_personality(void){
     return NULL;
 
   case_linux:
-    personality = PER_GOOD_o | PER_ZAP_ADDR | PER_SANE_USER;
+    _personality = PER_GOOD_o | PER_ZAP_ADDR | PER_SANE_USER;
     return NULL;
 
   case_default: /* use defaults for ps, ignoring other environment variables */
@@ -293,7 +293,7 @@ static const char *set_personality(void){
       getenv("UNIX95")     /* Irix */
       || getenv("POSIXLY_CORRECT")  /* most gnu stuff */
       || (getenv("POSIX2") && !strcmp(getenv("POSIX2"), "on")) /* Unixware 7 */
-    ) personality = PER_BROKEN_o;
+    ) _personality = PER_BROKEN_o;
     return NULL;
 
   case_aix:
@@ -309,7 +309,7 @@ static const char *set_personality(void){
   case_digital:
     // no PER_NO_DEFAULT_g even though man page claims it
     // Reality: the g is a NOP
-    personality = PER_GOOD_o | PER_BSD_h;
+    _personality = PER_GOOD_o | PER_BSD_h;
     prefer_bsd_defaults = 1;
     sysv_f_format  = "F5FMT";
     sysv_fl_format = "FL5FMT";
@@ -323,7 +323,7 @@ static const char *set_personality(void){
     return NULL;
 
   case_sunos4:
-    personality = PER_NO_DEFAULT_g;
+    _personality = PER_NO_DEFAULT_g;
     prefer_bsd_defaults = 1;
     bsd_j_format = "FB_j";
     bsd_l_format = "FB_l";
@@ -335,8 +335,8 @@ static const char *set_personality(void){
   case_irix:
   case_sgi:
     s = getenv("_XPG");
-    if(s && s[0]>'0' && s[0]<='9') personality = PER_BROKEN_o;
-    else personality = PER_IRIX_l;
+    if(s && s[0]>'0' && s[0]<='9') _personality = PER_BROKEN_o;
+    else _personality = PER_IRIX_l;
     return NULL;
 
   case_os390:  /* IBM's OS/390 OpenEdition on the S/390 mainframe */
@@ -347,13 +347,13 @@ static const char *set_personality(void){
 
   case_hp:
   case_hpux:
-    personality = PER_BROKEN_o | PER_HPUX_x;
+    _personality = PER_BROKEN_o | PER_HPUX_x;
     return NULL;
 
   case_svr4:
   case_sysv:
   case_sco:
-    personality = PER_BROKEN_o | PER_SVR4_x;
+    _personality = PER_BROKEN_o | PER_SVR4_x;
     return NULL;
 
   case_posix:
@@ -361,7 +361,7 @@ static const char *set_personality(void){
   case_unix95:
   case_unix98:
   case_unix:
-    personality = PER_BROKEN_o;
+    _personality = PER_BROKEN_o;
     return NULL;
 }
 
@@ -501,7 +501,7 @@ void self_info(void){
   fprintf(stderr,
     "personality=0x%08x (from \"%s\")\n"
     "EUID=%d TTY=%d,%d Hertz=%lld page_size=%d\n",
-    personality, saved_personality_text,
+    _personality, saved_personality_text,
     cached_euid, (int)major(cached_tty), (int)minor(cached_tty), Hertz,
     (int)(page_size)
   );
index 6e6df51..fcfceeb 100644 (file)
@@ -462,13 +462,13 @@ static const char *parse_sysv_option(void){
       w_count++;
       break;
     case 'x':  /* behind personality until "ps -ax" habit is uncommon */
-      if(personality & PER_SVR4_x){
+      if(_personality & PER_SVR4_x){
         // Same as -y, but for System V Release 4 MP
         trace("-x works like Sun Solaris & SCO Unixware -y option\n");
         format_modifiers |= FM_y;
         break;
       }
-      if(personality & PER_HPUX_x){
+      if(_personality & PER_HPUX_x){
         trace("-x extends the command line\n");
         w_count += 2;
         unix_f_option = 1;
@@ -518,7 +518,7 @@ static const char *parse_bsd_option(void){
     if(!force_bsd) return _("cannot happen - problem #1");
   }else{
     flagptr--; /* off beginning, will increment before use */
-    if(personality & PER_FORCE_BSD){
+    if(_personality & PER_FORCE_BSD){
       if(!force_bsd) return _("cannot happen - problem #2");
     }else{
       if(force_bsd) return _("second chance parse failed, not BSD or SysV");
@@ -643,7 +643,7 @@ static const char *parse_bsd_option(void){
     case 'h':
       trace("h repeat header\n");
       if(header_type) return _("only one heading option may be specified");
-      if(personality & PER_BSD_h) header_type = HEAD_MULTI;
+      if(_personality & PER_BSD_h) header_type = HEAD_MULTI;
       else                        header_type = HEAD_NONE;
       break;
     case 'j':
@@ -666,11 +666,11 @@ static const char *parse_bsd_option(void){
       break;
     case 'm':
       trace("m all threads, sort on mem use, show mem info\n");
-      if(personality & PER_OLD_m){
+      if(_personality & PER_OLD_m){
         format_flags |= FF_Lm;
         break;
       }
-      if(personality & PER_BSD_m){
+      if(_personality & PER_BSD_m){
         defer_sf_option("pmem", SF_B_m);
         break;
       }
@@ -1113,7 +1113,7 @@ static const char *parse_all_options(void){
         err = parse_sysv_option();
         break;
     case ARG_BSD:
-        if(force_bsd && !(personality & PER_FORCE_BSD)) return _("way bad");
+        if(force_bsd && !(_personality & PER_FORCE_BSD)) return _("way bad");
       }
       prefer_bsd_defaults = 1;
       err = parse_bsd_option();
@@ -1188,7 +1188,7 @@ int arg_parse(int argc, char *argv[]){
   ps_argv = argv;
   thisarg = 0;
 
-  if(personality & PER_FORCE_BSD) goto try_bsd;
+  if(_personality & PER_FORCE_BSD) goto try_bsd;
 
   err = parse_all_options();
   if(err) goto try_bsd;
@@ -1216,8 +1216,8 @@ try_bsd:
   not_pure_unix=1;
   force_bsd=1;
   prefer_bsd_defaults=1;
-  if(!( (PER_OLD_m|PER_BSD_m) & personality )) /* if default m setting... */
-    personality |= PER_OLD_m; /* Prefer old Linux over true BSD. */
+  if(!( (PER_OLD_m|PER_BSD_m) & _personality )) /* if default m setting... */
+    _personality |= PER_OLD_m; /* Prefer old Linux over true BSD. */
   /* Do not set PER_FORCE_BSD! It is tested below. */
 
   err2 = parse_all_options();
@@ -1234,7 +1234,7 @@ try_bsd:
 
 total_failure:
   reset_parser();
-  if(personality & PER_FORCE_BSD) fprintf(stderr, _("error: %s\n"), err2);
+  if(_personality & PER_FORCE_BSD) fprintf(stderr, _("error: %s\n"), err2);
   else fprintf(stderr, _("error: %s\n"), err);
   do_help(NULL, EXIT_FAILURE);
 }
index 619d895..c58a778 100644 (file)
@@ -45,7 +45,7 @@ const char *select_bits_setup(void){
     return NULL;
   }
   /* For every BSD but SunOS, the 'g' option is a NOP. (enabled by default) */
-  if( !(personality & PER_NO_DEFAULT_g) && !(simple_select&(SS_U_a|SS_U_d)) )
+  if( !(_personality & PER_NO_DEFAULT_g) && !(simple_select&(SS_U_a|SS_U_d)) )
     switch_val = simple_select|SS_B_g;
   else
     switch_val = simple_select;
index eeec7e9..00faabd 100644 (file)
@@ -684,7 +684,7 @@ static const char *generate_sysv_list(void){
   }
   /* since FM_y adds RSS anyway, don't do this hack when that is true */
   if( (format_flags & FF_Ul) && !(format_modifiers & FM_y) ){
-    if(personality & PER_IRIX_l){ /* add "rss" then ':' here */
+    if(_personality & PER_IRIX_l){ /* add "rss" then ':' here */
       PUSH("sgi_rss");
       fn = malloc(sizeof(format_node));
       fn->width = 1;
@@ -702,14 +702,14 @@ static const char *generate_sysv_list(void){
   }
   if(format_flags & FF_Ul){
     if(format_modifiers & FM_y) PUSH("rss");
-    else if(personality & (PER_ZAP_ADDR|PER_IRIX_l)) PUSH("sgi_p");
+    else if(_personality & (PER_ZAP_ADDR|PER_IRIX_l)) PUSH("sgi_p");
     else PUSH("addr_1");
   }
   if(format_modifiers & FM_c){
     PUSH("pri"); PUSH("class");
   }else if(format_flags & FF_Ul){
     PUSH("ni");
-    if(personality & PER_IRIX_l) PUSH("priority");
+    if(_personality & PER_IRIX_l) PUSH("priority");
     else /* is this good? */ PUSH("opri");
   }
 
@@ -729,7 +729,7 @@ static const char *generate_sysv_list(void){
   if(thread_flags & TF_U_T) PUSH("spid");
   PUSH("pid");
   if(format_flags & FF_Uf){
-    if(personality & PER_SANE_USER) PUSH("user");
+    if(_personality & PER_SANE_USER) PUSH("user");
     else PUSH("uid_hack");
   }else if(format_flags & FF_Ul){
     PUSH("uid");
@@ -753,8 +753,8 @@ static const char *generate_sysv_list(void){
 const char *process_sf_options(int localbroken){
   sf_node *sf_walk;
 
-  if(personality & PER_BROKEN_o) localbroken = 1;
-  if(personality & PER_GOOD_o)   localbroken = 0;
+  if(_personality & PER_BROKEN_o) localbroken = 1;
+  if(_personality & PER_GOOD_o)   localbroken = 0;
   broken = localbroken;
   if(sf_list){
     const char *err;
@@ -940,11 +940,11 @@ did_lwp:
      * Generally, these only get hit when personality overrides unix output.
      * That (mostly?) means the Digital and Debian personalities.
      */
-    if((personality & PER_ZAP_ADDR) && (format_flags & FF_Ul)){
+    if((_personality & PER_ZAP_ADDR) && (format_flags & FF_Ul)){
       fn = do_one_spec("sgi_p", NULL);
       if(fmt_add_after("ADDR", fn)) fmt_delete("ADDR");
     }
-    if((personality & PER_SANE_USER) && (format_flags & FF_Uf)){
+    if((_personality & PER_SANE_USER) && (format_flags & FF_Uf)){
       fn = do_one_spec("user", NULL);
       if(fmt_add_after("UID", fn)) fmt_delete("UID");
     }