OBS-URL: https://build.opensuse.org/package/show/security/physlock?expand=0&rev=11
114 lines
3.2 KiB
Diff
114 lines
3.2 KiB
Diff
From e688b425399d12ba5e58138ade9956d0f586f3c4 Mon Sep 17 00:00:00 2001
|
|
From: ninad <ninadhuilgol@gmail.com>
|
|
Date: Tue, 9 Jun 2020 18:52:55 +0530
|
|
Subject: [PATCH] Fix issue #97 with very basic signal handling
|
|
|
|
---
|
|
main.c | 16 +++++++++++++++-
|
|
options.c | 8 ++++++--
|
|
physlock.1 | 8 ++++++++
|
|
physlock.h | 1 +
|
|
4 files changed, 30 insertions(+), 3 deletions(-)
|
|
|
|
--- main.c
|
|
+++ main.c 2024-09-11 11:29:08.248580547 +0000
|
|
@@ -137,6 +137,8 @@ int main(int argc, char **argv) {
|
|
int try = 0, root_user = 1;
|
|
uid_t owner;
|
|
userinfo_t *u = &user;
|
|
+ int sigusr1recieved = 0;
|
|
+ sigset_t sigusr1;
|
|
|
|
oldvt = oldsysrq = oldprintk = vt.nr = vt.fd = -1;
|
|
cmdpid = -1;
|
|
@@ -152,9 +154,14 @@ int main(int argc, char **argv) {
|
|
setup_signal(SIGQUIT, sa_handler_exit);
|
|
setup_signal(SIGHUP, SIG_IGN);
|
|
setup_signal(SIGINT, SIG_IGN);
|
|
- setup_signal(SIGUSR1, SIG_IGN);
|
|
+ if (options->staggered != 1) {
|
|
+ setup_signal(SIGUSR1, SIG_IGN);
|
|
+ }
|
|
setup_signal(SIGUSR2, SIG_IGN);
|
|
|
|
+ sigemptyset(&sigusr1);
|
|
+ sigaddset(&sigusr1, SIGUSR1);
|
|
+
|
|
vt_init();
|
|
vt_get_current(&oldvt, &owner);
|
|
|
|
@@ -221,6 +228,13 @@ int main(int argc, char **argv) {
|
|
|
|
locked = !options->no_auth;
|
|
|
|
+ if (options->staggered == 1) {
|
|
+ sigprocmask(SIG_BLOCK,&sigusr1,NULL);
|
|
+ sigwait(&sigusr1, &sigusr1recieved);
|
|
+ sigprocmask(SIG_UNBLOCK,&sigusr1,NULL);
|
|
+ fflush(vt.ios);
|
|
+ }
|
|
+
|
|
while (locked) {
|
|
if (!root_user && try >= (u == &root ? 1 : 3)) {
|
|
u = u == &root ? &user : &root;
|
|
--- options.c
|
|
+++ options.c 2024-09-11 11:32:08.333282851 +0000
|
|
@@ -28,7 +28,7 @@ static options_t _options;
|
|
const options_t *options = (const options_t*) &_options;
|
|
|
|
void print_usage() {
|
|
- printf("usage: physlock [-dhLlmsbanv] [-p MSG]\n");
|
|
+ printf("usage: physlock [-dhLlmsbanvw] [-p MSG]\n");
|
|
}
|
|
|
|
void print_version() {
|
|
@@ -45,9 +45,10 @@ void parse_options(int argc, char **argv
|
|
_options.disable_sysrq = 0;
|
|
_options.lock_switch = -1;
|
|
_options.mute_kernel_messages = 0;
|
|
+ _options.staggered = 0;
|
|
_options.no_auth = 0;
|
|
|
|
- while ((opt = getopt(argc, argv, "dhLlmnp:svb:a:")) != -1) {
|
|
+ while ((opt = getopt(argc, argv, "dhLlmnp:svb:a:w")) != -1) {
|
|
switch (opt) {
|
|
case '?':
|
|
print_usage();
|
|
@@ -85,6 +86,9 @@ void parse_options(int argc, char **argv
|
|
case 'v':
|
|
print_version();
|
|
exit(0);
|
|
+ case 'w':
|
|
+ _options.staggered = 1;
|
|
+ break;
|
|
}
|
|
}
|
|
}
|
|
--- physlock.1
|
|
+++ physlock.1 2024-09-11 11:29:08.248580547 +0000
|
|
@@ -62,6 +62,14 @@ Disable SysRq mechanism while physlock i
|
|
.TP
|
|
.B \-v
|
|
Print version information to standard output and exit.
|
|
+.TP
|
|
+.B \-w
|
|
+Wait until a SIGUSR1 signal is received to prompt for authentication.
|
|
+Useful if the first authentication attempt always fails
|
|
+due to bad input buffering in the virtual terminal.
|
|
+.BI WARNING:
|
|
+When using this option, ensure that some external program sends a SIGUSR1
|
|
+signal to physlock. Otherwise, you will be locked out of your session.
|
|
.SH AUTHORS
|
|
.TP
|
|
Bert Muennich <ber.t at gmx.com>
|
|
--- physlock.h
|
|
+++ physlock.h 2024-09-11 11:30:24.051192128 +0000
|
|
@@ -55,6 +55,7 @@ typedef struct options_s {
|
|
int lock_switch;
|
|
int mute_kernel_messages;
|
|
int no_auth;
|
|
+ int staggered;
|
|
const char *prompt;
|
|
const char *command_before;
|
|
const char *command_after;
|