screen-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [screen-devel] screen cannot reattach to previous session


From: Petr Hracek
Subject: Re: [screen-devel] screen cannot reattach to previous session
Date: Thu, 15 Oct 2015 13:17:50 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0

On 10/14/2015 06:50 PM, Amadeusz Sławiński wrote:
On Wed, 14 Oct 2015 13:45:04 +0200
Petr Hracek <address@hidden> wrote:

Hi Amadeusz,

based on our last discussion, I tried to use it
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=644788;msg=265;att=0

And I guess, that If I already updated screen with different message 
structure.
then now I am not able to reconnect as you mentioned.
Althought WriteOldMessage(&m)  is used.
Hey,

Yes struct old_msg may need adjusting along with WriteOldMessage
function, so passing new values to old_msg works.

Although now that I look at this patch again, it seems very hacky.
It copies values from attaching (new) client, into old_msg struct of
server and attaches to it with new client. It's wonder that it doesn't
crash, as even with copied values, struct between client and server are
different.

Amadeusz
Thanks.
I have created the patch an year ago.

~~~
diff --git a/screen-fix-term.patch b/screen-fix-term.patch new file mode 100644 index 0000000..aaef501 --- /dev/null +++ b/screen-fix-term.patch
@@ -0,0 +1,163 @@
+diff --git a/src/acls.c b/src/acls.c
+index 3f40541..e5a32a4 100644
+--- a/src/acls.c
++++ b/src/acls.c
+@@ -182,7 +182,7 @@ struct acluser **up;
+ #endif
+ (*up)->u_Esc = DefaultEsc;
+ (*up)->u_MetaEsc = DefaultMetaEsc;
+- strncpy((*up)->u_name, name, 20);
++ strncpy((*up)->u_name, name, MAXLOGINLEN);
+ (*up)->u_password = NULL;
+ if (pass)
+ (*up)->u_password = SaveStr(pass);
+@@ -318,8 +318,8 @@ struct acluser **up;
+ return UserAdd(name, pass, up);
+ if (!strcmp(name, "nobody")) /* he remains without password */
+ return -1;
+- strncpy((*up)->u_password, pass ? pass : "", 20);
+- (*up)->u_password[20] = '\0';
++ strncpy((*up)->u_password, pass ? pass : "", MAXLOGINLEN);
++ (*up)->u_password[MAXLOGINLEN] = '\0';
+ return 0;
+ }
+ #endif
+diff --git a/src/acls.h b/src/acls.h
+index 907e953..42c7c18 100644
+--- a/src/acls.h
++++ b/src/acls.h
+@@ -78,7 +78,7 @@ struct plop
+ typedef struct acluser
+ {
+ struct acluser *u_next; /* continue the main user list */
+- char u_name[20+1]; /* login name how he showed up */
++ char u_name[MAXLOGINLEN + 1]; /* login name how he showed up */
+ char *u_password; /* his password (may be NullStr). */
+ int u_checkpassword; /* nonzero if this u_password is valid */
+ int u_detachwin; /* the window where he last detached */
+diff --git a/src/comm.c b/src/comm.c
+index 5f4af8a..7705fcb 100644
+--- a/src/comm.c
++++ b/src/comm.c
+@@ -36,6 +36,7 @@
+ */
+
+ #include "config.h"
++#include "os.h"
+ #include "acls.h"
+ #include "comm.h"
+
+diff --git a/src/display.h b/src/display.h
+index b1ab748..a433e6d 100644
+--- a/src/display.h
++++ b/src/display.h
+@@ -73,7 +73,7 @@ struct display
+ struct win *d_other; /* pointer to other window */
+ int d_nonblock; /* -1 don't block if obufmax reached */
+ /* >0: block after nonblock secs */
+- char d_termname[40 + 1]; /* $TERM */
++ char d_termname[MAXTERMLEN + 1]; /* $TERM */
+ char *d_tentry; /* buffer for tgetstr */
+ char d_tcinited; /* termcap inited flag */
+ int d_width, d_height; /* width/height of the screen */
+diff --git a/src/os.h b/src/os.h
+index 5c17c83..bc71c97 100644
+--- a/src/os.h
++++ b/src/os.h
+@@ -521,3 +521,8 @@ typedef struct fd_set { int fds_bits[1]; } fd_set;
+ */
+ #define IOSIZE 4096
+
++/* Changing those you won't be able to attach to your old sessions
++ * when changing those values in official tree don't forget to bump
++ * MSG_VERSION */
++#define MAXTERMLEN 50
++#define MAXLOGINLEN 256
+diff --git a/src/process.c b/src/process.c
+index 7817ac8..a3c2e3d 100644
+--- a/src/process.c
++++ b/src/process.c
+@@ -2649,9 +2649,9 @@ int key;
+ s = NULL;
+ if (ParseSaveStr(act, &s))
+ break;
+- if (strlen(s) >= 20)
++ if (strlen(s) >= MAXTERMLEN)
+ {
+- OutputMsg(0, "%s: term: argument too long ( < 20)", rc_name);
++ OutputMsg(0, "%s: term: argument too long ( < %d)", rc_name, MAXTERMLEN);
+ free(s);
+ break;
+ }
+diff --git a/src/screen.c b/src/screen.c
+index cd0c71b..7a21762 100644
+--- a/src/screen.c
++++ b/src/screen.c
+@@ -995,10 +995,10 @@ char **av;
+
+ if (home == 0 || *home == '\0')
+ home = ppp->pw_dir;
+- if (strlen(LoginName) > 20)
++ if (strlen(LoginName) > MAXLOGINLEN)
+ Panic(0, "LoginName too long - sorry.");
+ #ifdef MULTIUSER
+- if (multi && strlen(multi) > 20)
++ if (multi && strlen(multi) > MAXLOGINLEN)
+ Panic(0, "Screen owner name too long - sorry.");
+ #endif
+ if (strlen(home) > MAXPATHLEN - 25)
+diff --git a/src/screen.h b/src/screen.h
+index 1a388e3..30ecefb 100644
+--- a/src/screen.h
++++ b/src/screen.h
+@@ -202,32 +202,32 @@ struct msg
+ int nargs;
+ char line[MAXPATHLEN];
+ char dir[MAXPATHLEN];
+- char screenterm[20]; /* is screen really "screen" ? */
++ char screenterm[MAXTERMLEN]; /* is screen really "screen" ? */
+ }
+ create;
+ struct
+ {
+- char auser[20 + 1]; /* username */
++ char auser[MAXLOGINLEN + 1]; /* username */
+ int apid; /* pid of frontend */
+ int adaptflag; /* adapt window size? */
+ int lines, columns; /* display size */
+ char preselect[20];
+ int esc; /* his new escape character unless -1 */
+ int meta_esc; /* his new meta esc character unless -1 */
+- char envterm[40 + 1]; /* terminal type */
++ char envterm[MAXTERMLEN + 1]; /* terminal type */
+ int encoding; /* encoding of display */
+ int detachfirst; /* whether to detach remote sessions first */
+ }
+ attach;
+ struct
+ {
+- char duser[20 + 1]; /* username */
++ char duser[MAXLOGINLEN + 1]; /* username */
+ int dpid; /* pid of frontend */
+ }
+ detach;
+ struct
+ {
+- char auser[20 + 1]; /* username */
++ char auser[MAXLOGINLEN + 1]; /* username */
+ int nargs;
+ char cmd[MAXPATHLEN]; /* command */
+ int apid; /* pid of frontend */
+diff --git a/src/socket.c b/src/socket.c
+index 1f04284..32c5047 100644
+--- a/src/socket.c
++++ b/src/socket.c
+@@ -1528,7 +1528,7 @@ static void PasswordProcessInput __P((char *, int));
+
+ struct pwdata {
+ int l;
+- char buf[20 + 1];
++ char buf[MAXLOGINLEN + 1];
+ struct msg m;
+ };
+

The patch is about 'LoginName too long' like you mentioned before. This should remain I guess.
It seems that the best way will be like this say to user 'hey your session is old and screen is not able to connect to it'. I am fine with that.

Reproducer is:
1) $screen -S foo  without patch 'LoginName' and session is created
2) appling patch mentioned above
3) What patch shall I use for inform user that session is old and screen doesn't hang.

This debian patch doesn't work https://anonscm.debian.org/cgit/collab-maint/screen.git/tree/debian/patches/60-644788-screen-4.1.0-4.0.3-interoperability.patch?h=wheezy
screen still hangs.

What shall I do? Or How shall I patch screen so that screen will not hang and properly inform user or at least doesn't hang?

I have found this debian patch.
https://anonscm.debian.org/cgit/collab-maint/screen.git/tree/debian/patches/60-screen-4.2.1-debian4.1.0-compatibility.patch?h=jessie
but the patch doesn't work and screen still hangs.

Greetings and thanks for support.

I will be ping you on freenode if you don't mind.

-- 
Petr Hracek
Software Engineer
Developer Experience
Red Hat, Inc
Mob: +420777056169
email: address@hidden

reply via email to

[Prev in Thread] Current Thread [Next in Thread]