|
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:
Thanks.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 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 |
[Prev in Thread] | Current Thread | [Next in Thread] |