mirror of
https://github.com/sheumann/hush.git
synced 2024-09-12 00:55:11 +00:00
login: re-enable Ctrl-^C before execing shell.
This commit is contained in:
parent
3b8ff68ec8
commit
6ae8079e2d
@ -28,14 +28,6 @@
|
|||||||
* SUCH DAMAGE.
|
* SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
#include "libbb.h"
|
#include "libbb.h"
|
||||||
|
|
||||||
|
|
||||||
@ -44,8 +36,7 @@ const char *change_identity_e2str(const struct passwd *pw)
|
|||||||
{
|
{
|
||||||
if (initgroups(pw->pw_name, pw->pw_gid) == -1)
|
if (initgroups(pw->pw_name, pw->pw_gid) == -1)
|
||||||
return "cannot set groups";
|
return "cannot set groups";
|
||||||
endgrent();
|
endgrent(); /* ?? */
|
||||||
|
|
||||||
xsetgid(pw->pw_gid);
|
xsetgid(pw->pw_gid);
|
||||||
xsetuid(pw->pw_uid);
|
xsetuid(pw->pw_uid);
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -55,6 +46,6 @@ void change_identity(const struct passwd *pw)
|
|||||||
{
|
{
|
||||||
const char *err_msg = change_identity_e2str(pw);
|
const char *err_msg = change_identity_e2str(pw);
|
||||||
|
|
||||||
if(err_msg)
|
if (err_msg)
|
||||||
bb_perror_msg_and_die("%s", err_msg);
|
bb_perror_msg_and_die("%s", err_msg);
|
||||||
}
|
}
|
||||||
|
121
libbb/login.c
121
libbb/login.c
@ -36,83 +36,70 @@ void print_login_issue(const char *issue_file, const char *tty)
|
|||||||
|
|
||||||
puts("\r"); /* start a new line */
|
puts("\r"); /* start a new line */
|
||||||
|
|
||||||
if ((fd = fopen(issue_file, "r"))) {
|
fd = fopen(issue_file, "r");
|
||||||
while ((c = fgetc(fd)) != EOF) {
|
if (!fd)
|
||||||
outbuf = buf;
|
return;
|
||||||
buf[0] = c;
|
while ((c = fgetc(fd)) != EOF) {
|
||||||
if(c == '\n') {
|
outbuf = buf;
|
||||||
buf[1] = '\r';
|
buf[0] = c;
|
||||||
buf[2] = 0;
|
buf[1] = '\0';
|
||||||
} else {
|
if(c == '\n') {
|
||||||
buf[1] = 0;
|
buf[1] = '\r';
|
||||||
}
|
buf[2] = '\0';
|
||||||
if (c == '\\' || c == '%') {
|
|
||||||
c = fgetc(fd);
|
|
||||||
switch (c) {
|
|
||||||
case 's':
|
|
||||||
outbuf = uts.sysname;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'n':
|
|
||||||
outbuf = uts.nodename;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'r':
|
|
||||||
outbuf = uts.release;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'v':
|
|
||||||
outbuf = uts.version;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'm':
|
|
||||||
outbuf = uts.machine;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'D':
|
|
||||||
case 'o':
|
|
||||||
c = getdomainname(buf, sizeof(buf) - 1);
|
|
||||||
buf[c >= 0 ? c : 0] = '\0';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'd':
|
|
||||||
strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 't':
|
|
||||||
strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'h':
|
|
||||||
gethostname(buf, sizeof(buf) - 1);
|
|
||||||
buf[sizeof(buf) - 1] = '\0';
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'l':
|
|
||||||
outbuf = tty;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
buf[0] = c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fputs(outbuf, stdout);
|
|
||||||
}
|
}
|
||||||
|
if (c == '\\' || c == '%') {
|
||||||
fclose(fd);
|
c = fgetc(fd);
|
||||||
|
switch (c) {
|
||||||
fflush(stdout);
|
case 's':
|
||||||
|
outbuf = uts.sysname;
|
||||||
|
break;
|
||||||
|
case 'n':
|
||||||
|
outbuf = uts.nodename;
|
||||||
|
break;
|
||||||
|
case 'r':
|
||||||
|
outbuf = uts.release;
|
||||||
|
break;
|
||||||
|
case 'v':
|
||||||
|
outbuf = uts.version;
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
outbuf = uts.machine;
|
||||||
|
break;
|
||||||
|
case 'D':
|
||||||
|
case 'o':
|
||||||
|
c = getdomainname(buf, sizeof(buf) - 1);
|
||||||
|
buf[c >= 0 ? c : 0] = '\0';
|
||||||
|
break;
|
||||||
|
case 'd':
|
||||||
|
strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
|
||||||
|
break;
|
||||||
|
case 't':
|
||||||
|
strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
|
||||||
|
break;
|
||||||
|
case 'h':
|
||||||
|
gethostname(buf, sizeof(buf) - 1);
|
||||||
|
buf[sizeof(buf) - 1] = '\0';
|
||||||
|
break;
|
||||||
|
case 'l':
|
||||||
|
outbuf = tty;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buf[0] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fputs(outbuf, stdout);
|
||||||
}
|
}
|
||||||
|
fclose(fd);
|
||||||
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_login_prompt(void)
|
void print_login_prompt(void)
|
||||||
{
|
{
|
||||||
char buf[MAXHOSTNAMELEN+1];
|
char buf[MAXHOSTNAMELEN+1];
|
||||||
|
|
||||||
if(gethostname(buf, MAXHOSTNAMELEN) == 0)
|
if (gethostname(buf, MAXHOSTNAMELEN) == 0)
|
||||||
fputs(buf, stdout);
|
fputs(buf, stdout);
|
||||||
|
|
||||||
fputs(LOGIN, stdout);
|
fputs(LOGIN, stdout);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,6 +342,7 @@ auth_failed:
|
|||||||
fchown(0, pw->pw_uid, pw->pw_gid);
|
fchown(0, pw->pw_uid, pw->pw_gid);
|
||||||
fchmod(0, 0600);
|
fchmod(0, 0600);
|
||||||
|
|
||||||
|
/* TODO: be nommu-friendly, use spawn? */
|
||||||
if (ENABLE_LOGIN_SCRIPTS) {
|
if (ENABLE_LOGIN_SCRIPTS) {
|
||||||
char *script = getenv("LOGIN_PRE_SUID_SCRIPT");
|
char *script = getenv("LOGIN_PRE_SUID_SCRIPT");
|
||||||
if (script) {
|
if (script) {
|
||||||
@ -370,7 +371,6 @@ auth_failed:
|
|||||||
setup_environment(tmp, 1, !(opt & LOGIN_OPT_p), pw);
|
setup_environment(tmp, 1, !(opt & LOGIN_OPT_p), pw);
|
||||||
|
|
||||||
motd();
|
motd();
|
||||||
signal(SIGALRM, SIG_DFL); /* default alarm signal */
|
|
||||||
|
|
||||||
if (pw->pw_uid == 0)
|
if (pw->pw_uid == 0)
|
||||||
syslog(LOG_INFO, "root login%s", fromhost);
|
syslog(LOG_INFO, "root login%s", fromhost);
|
||||||
@ -379,7 +379,17 @@ auth_failed:
|
|||||||
* but let's play the game for now */
|
* but let's play the game for now */
|
||||||
set_current_security_context(user_sid);
|
set_current_security_context(user_sid);
|
||||||
#endif
|
#endif
|
||||||
run_shell(tmp, 1, 0, 0); /* exec the shell finally. */
|
|
||||||
|
// util-linux login also does:
|
||||||
|
// /* start new session */
|
||||||
|
// setsid();
|
||||||
|
// /* TIOCSCTTY: steal tty from other process group */
|
||||||
|
// if (ioctl(0, TIOCSCTTY, 1)) error_msg...
|
||||||
|
|
||||||
|
signal(SIGALRM, SIG_DFL); /* set signals to defaults */
|
||||||
|
signal(SIGINT, SIG_DFL);
|
||||||
|
|
||||||
|
run_shell(tmp, 1, 0, 0); /* exec the shell finally */
|
||||||
|
|
||||||
return EXIT_FAILURE;
|
return EXIT_FAILURE;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user