From: Dmitriy Evgenevich Gonzha Date: Tue, 17 Oct 2017 17:58:56 +0000 (+0300) Subject: Fix intersection with linux system call personality() X-Git-Tag: accepted/tizen/base/20171110.163218^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d2cf125ecf05a531f26a992c8ec02118b1739aff;p=platform%2Fupstream%2Fprocps-ng.git Fix intersection with linux system call personality() 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 --- diff --git a/ps/common.h b/ps/common.h index 157e6df..3874f98 100644 --- a/ps/common.h +++ b/ps/common.h @@ -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; diff --git a/ps/global.c b/ps/global.c index b75f728..68f1f46 100644 --- a/ps/global.c +++ b/ps/global.c @@ -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) ); diff --git a/ps/parser.c b/ps/parser.c index 6e6df51..fcfceeb 100644 --- a/ps/parser.c +++ b/ps/parser.c @@ -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); } diff --git a/ps/select.c b/ps/select.c index 619d895..c58a778 100644 --- a/ps/select.c +++ b/ps/select.c @@ -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; diff --git a/ps/sortformat.c b/ps/sortformat.c index eeec7e9..00faabd 100644 --- a/ps/sortformat.c +++ b/ps/sortformat.c @@ -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"); }