diff options
-rw-r--r-- | applets/applets.c | 130 |
1 files changed, 65 insertions, 65 deletions
diff --git a/applets/applets.c b/applets/applets.c index a6e6598..8171a30 100644 --- a/applets/applets.c +++ b/applets/applets.c @@ -59,22 +59,22 @@ static int config_ok; #define CONFIG_FILE "/etc/busybox.conf" -// applets [] is const, so we have to define this "override" structure +/* applets [] is const, so we have to define this "override" structure */ struct BB_suid_config { struct BB_applet *m_applet; uid_t m_uid; gid_t m_gid; mode_t m_mode; - + struct BB_suid_config *m_next; }; static struct BB_suid_config *suid_config; -#endif // CONFIG_FEATURE_SUID_CONFIG +#endif /* CONFIG_FEATURE_SUID_CONFIG */ -#endif // CONFIG_FEATURE_SUID +#endif /* CONFIG_FEATURE_SUID */ @@ -142,7 +142,7 @@ void run_applet_by_name(const char *name, int argc, char **argv) #ifdef CONFIG_FEATURE_SUID check_suid ( applet_using ); #endif - + exit((*(applet_using->main)) (argc, argv)); } /* Just in case they have renamed busybox - Check argv[1] */ @@ -157,17 +157,17 @@ void run_applet_by_name(const char *name, int argc, char **argv) #ifdef CONFIG_FEATURE_SUID_CONFIG -// check if u is member of group g +/* check if u is member of group g */ static int ingroup ( uid_t u, gid_t g ) { struct group *grp = getgrgid ( g ); - + if ( grp ) { char **mem; - + for ( mem = grp-> gr_mem; *mem; mem++ ) { struct passwd *pwd = getpwnam ( *mem ); - + if ( pwd && ( pwd-> pw_uid == u )) return 1; } @@ -180,43 +180,43 @@ static int ingroup ( uid_t u, gid_t g ) void check_suid ( struct BB_applet *applet ) { - uid_t ruid = getuid ( ); // real [ug]id + uid_t ruid = getuid ( ); /* real [ug]id */ uid_t rgid = getgid ( ); - + #ifdef CONFIG_FEATURE_SUID_CONFIG if ( config_ok ) { struct BB_suid_config *sct; - + for ( sct = suid_config; sct; sct = sct-> m_next ) { if ( sct-> m_applet == applet ) break; } if ( sct ) { mode_t m = sct-> m_mode; - - if ( sct-> m_uid == ruid ) // same uid + + if ( sct-> m_uid == ruid ) /* same uid */ m >>= 6; - else if (( sct-> m_gid == rgid ) || ingroup ( ruid, sct-> m_gid )) // same group / in group + else if (( sct-> m_gid == rgid ) || ingroup ( ruid, sct-> m_gid )) /* same group / in group */ m >>= 3; - if (!( m & S_IXOTH )) // is x bit not set ? + if (!( m & S_IXOTH )) /* is x bit not set ? */ error_msg_and_die ( "You have no permission to run this applet!" ); - - if (( sct-> m_mode & ( S_ISGID | S_IXGRP )) == ( S_ISGID | S_IXGRP )) { // *both* have to be set for sgid + + if (( sct-> m_mode & ( S_ISGID | S_IXGRP )) == ( S_ISGID | S_IXGRP )) { /* *both* have to be set for sgid */ if ( setegid ( sct-> m_gid )) error_msg_and_die ( "BusyBox binary has insufficient rights to set proper GID for applet!" ); } else - setgid ( rgid ); // no sgid -> drop - + setgid ( rgid ); /* no sgid -> drop */ + if ( sct-> m_mode & S_ISUID ) { if ( seteuid ( sct-> m_uid )) error_msg_and_die ( "BusyBox binary has insufficient rights to set proper UID for applet!" ); } else - setuid ( ruid ); // no suid -> drop + setuid ( ruid ); /* no suid -> drop */ } - else { // default: drop all priviledges + else { /* default: drop all priviledges */ setgid ( rgid ); setuid ( ruid ); } @@ -225,7 +225,7 @@ void check_suid ( struct BB_applet *applet ) else { #ifndef CONFIG_FEATURE_SUID_CONFIG_QUIET static int onetime = 0; - + if ( !onetime ) { onetime = 1; fprintf ( stderr, "Using fallback suid method\n" ); @@ -239,7 +239,7 @@ void check_suid ( struct BB_applet *applet ) error_msg_and_die ( "This applet requires root priviledges!" ); } else if ( applet-> need_suid == _BB_SUID_NEVER ) { - setgid ( rgid ); // drop all priviledges + setgid ( rgid ); /* drop all priviledges */ setuid ( ruid ); } } @@ -258,90 +258,90 @@ int parse_config_file ( void ) int lc = 0; suid_config = 0; - - // is there a config file ? + + /* is there a config file ? */ if ( stat ( CONFIG_FILE, &st ) == 0 ) { - // is it owned by root with no write perm. for group and others ? + /* is it owned by root with no write perm. for group and others ? */ if ( S_ISREG( st. st_mode ) && ( st. st_uid == 0 ) && (!( st. st_mode & ( S_IWGRP | S_IWOTH )))) { - // that's ok .. then try to open it + /* that's ok .. then try to open it */ f = fopen ( CONFIG_FILE, "r" ); if ( f ) { char buffer [256]; int section = 0; - + while ( fgets ( buffer, sizeof( buffer ) - 1, f )) { char c = buffer [0]; char *p; - + lc++; - + p = strchr ( buffer, '#' ); if ( p ) *p = 0; p = buffer + xstrlen ( buffer ); while (( p > buffer ) && isspace ( *--p )) *p = 0; - + if ( p == buffer ) continue; - + if ( c == '[' ) { p = strchr ( buffer, ']' ); - - if ( !p || ( p == ( buffer + 1 ))) // no matching ] or empty [] + + if ( !p || ( p == ( buffer + 1 ))) /* no matching ] or empty [] */ parse_error ( "malformed section header" ); *p = 0; - + if ( strcasecmp ( buffer + 1, "SUID" ) == 0 ) section = 1; else - section = -1; // unknown section - just skip + section = -1; /* unknown section - just skip */ } else if ( section ) { switch ( section ) { - case 1: { // SUID + case 1: { /* SUID */ int l; struct BB_applet *applet; - p = strchr ( buffer, '=' ); // <key>[::space::]*=[::space::]*<value> - - if ( !p || ( p == ( buffer + 1 ))) // no = or key is empty + p = strchr ( buffer, '=' ); /* <key>[::space::]*=[::space::]*<value> */ + + if ( !p || ( p == ( buffer + 1 ))) /* no = or key is empty */ parse_error ( "malformed keyword" ); - + l = p - buffer; - while ( isspace ( buffer [--l] )) { } // skip whitespace - + while ( isspace ( buffer [--l] )) { } /* skip whitespace */ + buffer [l+1] = 0; - + if (( applet = find_applet_by_name ( buffer ))) { struct BB_suid_config *sct = xmalloc ( sizeof( struct BB_suid_config )); - + sct-> m_applet = applet; sct-> m_next = suid_config; suid_config = sct; - - while ( isspace ( *++p )) { } // skip whitespace - + + while ( isspace ( *++p )) { } /* skip whitespace */ + sct-> m_mode = 0; - + switch ( *p++ ) { case 'S': sct-> m_mode |= S_ISUID; break; - case 's': sct-> m_mode |= S_ISUID; // no break + case 's': sct-> m_mode |= S_ISUID; /* no break */ case 'x': sct-> m_mode |= S_IXUSR; break; case '-': break; default : parse_error ( "invalid user mode" ); } - + switch ( *p++ ) { - case 's': sct-> m_mode |= S_ISGID; // no break + case 's': sct-> m_mode |= S_ISGID; /* no break */ case 'x': sct-> m_mode |= S_IXGRP; break; case 'S': break; case '-': break; default : parse_error ( "invalid group mode" ); } - + switch ( *p ) { case 't': case 'x': sct-> m_mode |= S_IXOTH; break; @@ -349,9 +349,9 @@ int parse_config_file ( void ) case '-': break; default : parse_error ( "invalid other mode" ); } - - while ( isspace ( *++p )) { } // skip whitespace - + + while ( isspace ( *++p )) { } /* skip whitespace */ + if ( isdigit ( *p )) { sct-> m_uid = strtol ( p, &p, 10 ); if ( *p++ != '.' ) @@ -363,13 +363,13 @@ int parse_config_file ( void ) if ( !p2 ) parse_error ( "parsing <uid>.<gid>" ); - + *p2 = 0; pwd = getpwnam ( p ); - + if ( !pwd ) parse_error ( "invalid user name" ); - + sct-> m_uid = pwd-> pw_uid; p = p2 + 1; } @@ -377,16 +377,16 @@ int parse_config_file ( void ) sct-> m_gid = strtol ( p, &p, 10 ); else { struct group *grp = getgrnam ( p ); - + if ( !grp ) parse_error ( "invalid group name" ); - + sct-> m_gid = grp-> gr_gid; } } break; } - default: // unknown - skip + default: /* unknown - skip */ break; } } @@ -398,8 +398,8 @@ int parse_config_file ( void ) } } } - return 0; // no config file or not readable (not an error) - + return 0; /* no config file or not readable (not an error) */ + pe_label: fprintf ( stderr, "Parse error in %s, line %d: %s\n", CONFIG_FILE, lc, err ); |