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: Mon, 12 Oct 2015 12:24:56 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.3.0

On 09/08/2015 06:26 PM, Amadeusz Sławiński wrote:
On Tue, 8 Sep 2015 12:08:54 +0200
Petr Hracek <address@hidden> wrote:

On 08/31/2015 07:41 PM, Amadeusz Sławiński wrote:
I have received a bug
https://bugzilla.redhat.com/show_bug.cgi?id=1253697
which causes that screen indefinite hangs.

Strace is a part of the bug.
Did you ever discover this problem?

This bug was discovered in screen-4.1.0.
Hi,

I recall that someone on irc had similar problem, it seemed like
his /dev/pts was being mounted with wrong options
it needed something like those mount options to work:
"gid=5,mode=620" (group 5 being tty on my system).

Amadeusz

Hi,

they provided a options:

/dev/pts mount:

$ mount | grep pts
devpts on /dev/pts type devpts
(rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)

But it seems that it is not working still.

What about ptmxmode?
Could it be relevant?
Hi,

I don't think so, mine is also 000.
As far as I can see from bugreport it happens between updates.
What was version before and after update?
Also do you have somewhere diff between those versions?

It can be that there is some difference in "struct msg" between
versions which causes this problem.

Does it only fails to reattach after update?
By which I mean, does new sessions after update attach properly?

Amadeusz

Finally I have got the reason why screen hangs.
It is caused by patch "LoginName too long".

See related report https://bugzilla.redhat.com/show_bug.cgi?id=1119794
Patch for this case was mentioned there.

Screen related bug is https://savannah.gnu.org/bugs/?21653
Patch which we used is http://www.mail-archive.com/address@hidden/msg00829.html and another patch. https://lists.gnu.org/archive/html/screen-devel/2011-05/msg00000.html'
What is the correct one for this bug?

And unfortunately I have applied the wrong patch like:
diff --git a/acls.c b/acls.c
index b8a5af4..b8ef048 100644
--- a/acls.c
+++ b/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/acls.h b/acls.h
index 907e953..42c7c18 100644
--- a/acls.h
+++ b/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/comm.c b/comm.c
index 5f4af8a..7705fcb 100644
--- a/comm.c
+++ b/comm.c
@@ -36,6 +36,7 @@
  */

 #include "config.h"
+#include "os.h"
 #include "acls.h"
 #include "comm.h"

diff --git a/display.h b/display.h
index b1ab748..a433e6d 100644
--- a/display.h
+++ b/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/os.h b/os.h
index 5c17c83..92846ad 100644
--- a/os.h
+++ b/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/process.c b/process.c
index 0769cbe..623bf87 100644
--- a/process.c
+++ b/process.c
@@ -2664,9 +2664,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/screen.c b/screen.c
index 1c88157..eda16a3 100644
--- a/screen.c
+++ b/screen.c
@@ -995,10 +995,10 @@ char **av;

   if (home == 0 || *home == '\0')
     home = ppp->pw_dir;
-  if (strlen(LoginName) > 20)
 #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/screen.h b/screen.h
index 1a388e3..b95f8a2 100644
--- a/screen.h
+++ b/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/socket.c b/socket.c
index 45887fb..b4d2400 100644
--- a/socket.c
+++ b/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;
 };


Greetings.


--
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]