emacs-devel
[Top][All Lists]
Advanced

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

problem report #97


From: Dan Nicolaescu
Subject: problem report #97
Date: Mon, 1 Dec 2008 07:56:06 -0800 (PST)

CID: 97
Checker: RESOURCE_LEAK (help)
File: base/src/emacs/src/term.c
Function: init_tty
Description: Returned without freeing storage "area"

Event alloc_fn: Called allocation function "xmalloc" [model]
Event var_assign: Assigned variable "area" to storage returned from "xmalloc"
Also see events: [var_assign][leaked_storage]

3555      area = (char *) xmalloc (buffer_size);
3556    
3557      tty->TS_ins_line = tgetstr ("al", address);
3558      tty->TS_ins_multi_lines = tgetstr ("AL", address);
3559      tty->TS_bell = tgetstr ("bl", address);
3560      BackTab (tty) = tgetstr ("bt", address);
3561      tty->TS_clr_to_bottom = tgetstr ("cd", address);
3562      tty->TS_clr_line = tgetstr ("ce", address);
3563      tty->TS_clr_frame = tgetstr ("cl", address);
3564      ColPosition (tty) = NULL; /* tgetstr ("ch", address); */
3565      AbsPosition (tty) = tgetstr ("cm", address);
3566      CR (tty) = tgetstr ("cr", address);
3567      tty->TS_set_scroll_region = tgetstr ("cs", address);
3568      tty->TS_set_scroll_region_1 = tgetstr ("cS", address);
3569      RowPosition (tty) = tgetstr ("cv", address);
3570      tty->TS_del_char = tgetstr ("dc", address);
3571      tty->TS_del_multi_chars = tgetstr ("DC", address);
3572      tty->TS_del_line = tgetstr ("dl", address);
3573      tty->TS_del_multi_lines = tgetstr ("DL", address);
3574      tty->TS_delete_mode = tgetstr ("dm", address);
3575      tty->TS_end_delete_mode = tgetstr ("ed", address);
3576      tty->TS_end_insert_mode = tgetstr ("ei", address);
3577      Home (tty) = tgetstr ("ho", address);
3578      tty->TS_ins_char = tgetstr ("ic", address);
3579      tty->TS_ins_multi_chars = tgetstr ("IC", address);
3580      tty->TS_insert_mode = tgetstr ("im", address);
3581      tty->TS_pad_inserted_char = tgetstr ("ip", address);
3582      tty->TS_end_keypad_mode = tgetstr ("ke", address);
3583      tty->TS_keypad_mode = tgetstr ("ks", address);
3584      LastLine (tty) = tgetstr ("ll", address);
3585      Right (tty) = tgetstr ("nd", address);
3586      Down (tty) = tgetstr ("do", address);
3587      if (!Down (tty))
3588        Down (tty) = tgetstr ("nl", address); /* Obsolete name for "do" */
3589      if (tgetflag ("bs"))
3590        Left (tty) = "\b";            /* can't possibly be longer! */
3591      else                            /* (Actually, "bs" is obsolete...) */
3592        Left (tty) = tgetstr ("le", address);
3593      if (!Left (tty))
3594        Left (tty) = tgetstr ("bc", address); /* Obsolete name for "le" */
3595      tty->TS_pad_char = tgetstr ("pc", address);
3596      tty->TS_repeat = tgetstr ("rp", address);
3597      tty->TS_end_standout_mode = tgetstr ("se", address);
3598      tty->TS_fwd_scroll = tgetstr ("sf", address);
3599      tty->TS_standout_mode = tgetstr ("so", address);
3600      tty->TS_rev_scroll = tgetstr ("sr", address);
3601      tty->Wcm->cm_tab = tgetstr ("ta", address);
3602      tty->TS_end_termcap_modes = tgetstr ("te", address);
3603      tty->TS_termcap_modes = tgetstr ("ti", address);
3604      Up (tty) = tgetstr ("up", address);
3605      tty->TS_visible_bell = tgetstr ("vb", address);
3606      tty->TS_cursor_normal = tgetstr ("ve", address);
3607      tty->TS_cursor_visible = tgetstr ("vs", address);
3608      tty->TS_cursor_invisible = tgetstr ("vi", address);
3609      tty->TS_set_window = tgetstr ("wi", address);
3610    
3611      tty->TS_enter_underline_mode = tgetstr ("us", address);
3612      tty->TS_exit_underline_mode = tgetstr ("ue", address);
3613      tty->TS_enter_bold_mode = tgetstr ("md", address);
3614      tty->TS_enter_dim_mode = tgetstr ("mh", address);
3615      tty->TS_enter_blink_mode = tgetstr ("mb", address);
3616      tty->TS_enter_reverse_mode = tgetstr ("mr", address);
3617      tty->TS_enter_alt_charset_mode = tgetstr ("as", address);
3618      tty->TS_exit_alt_charset_mode = tgetstr ("ae", address);
3619      tty->TS_exit_attribute_mode = tgetstr ("me", address);
3620    
3621      MultiUp (tty) = tgetstr ("UP", address);
3622      MultiDown (tty) = tgetstr ("DO", address);
3623      MultiLeft (tty) = tgetstr ("LE", address);
3624      MultiRight (tty) = tgetstr ("RI", address);
3625    
3626      /* SVr4/ANSI color suppert.  If "op" isn't available, don't support
3627         color because we can't switch back to the default foreground and
3628         background.  */
3629      tty->TS_orig_pair = tgetstr ("op", address);
3630      if (tty->TS_orig_pair)
3631        {
3632          tty->TS_set_foreground = tgetstr ("AF", address);
3633          tty->TS_set_background = tgetstr ("AB", address);
3634          if (!tty->TS_set_foreground)
3635            {
3636              /* SVr4.  */
3637              tty->TS_set_foreground = tgetstr ("Sf", address);
3638              tty->TS_set_background = tgetstr ("Sb", address);
3639            }
3640    
3641          tty->TN_max_colors = tgetnum ("Co");
3642          tty->TN_max_pairs = tgetnum ("pa");
3643    
3644          tty->TN_no_color_video = tgetnum ("NC");
3645          if (tty->TN_no_color_video == -1)
3646            tty->TN_no_color_video = 0;
3647        }
3648    
3649      tty_default_color_capabilities (tty, 1);
3650    
3651      MagicWrap (tty) = tgetflag ("xn");
3652      /* Since we make MagicWrap terminals look like AutoWrap, we need to 
have
3653         the former flag imply the latter.  */
3654      AutoWrap (tty) = MagicWrap (tty) || tgetflag ("am");
3655      terminal->memory_below_frame = tgetflag ("db");
3656      tty->TF_hazeltine = tgetflag ("hz");
3657      terminal->must_write_spaces = tgetflag ("in");
3658      tty->meta_key = tgetflag ("km") || tgetflag ("MT");
3659      tty->TF_insmode_motion = tgetflag ("mi");
3660      tty->TF_standout_motion = tgetflag ("ms");
3661      tty->TF_underscore = tgetflag ("ul");
3662      tty->TF_teleray = tgetflag ("xt");
3663    
3664    #endif /* !DOS_NT  */
3665      terminal->kboard = (KBOARD *) xmalloc (sizeof (KBOARD));
3666      init_kboard (terminal->kboard);
3667      terminal->kboard->Vwindow_system = Qnil;
3668      terminal->kboard->next_kboard = all_kboards;
3669      all_kboards = terminal->kboard;
3670      terminal->kboard->reference_count++;
3671      /* Don't let the initial kboard remain current longer than necessary.
3672         That would cause problems if a file loaded on startup tries to
3673         prompt in the mini-buffer.  */
3674      if (current_kboard == initial_kboard)
3675        current_kboard = terminal->kboard;
3676    #ifndef DOS_NT
3677      term_get_fkeys (address, terminal->kboard);
3678    
3679      /* Get frame size from system, or else from termcap.  */
3680      {
3681        int height, width;
3682        get_tty_size (fileno (tty->input), &width, &height);
3683        FrameCols (tty) = width;
3684        FrameRows (tty) = height;
3685      }
3686    
3687      if (FrameCols (tty) <= 0)
3688        FrameCols (tty) = tgetnum ("co");
3689      if (FrameRows (tty) <= 0)
3690        FrameRows (tty) = tgetnum ("li");
3691    
3692      if (FrameRows (tty) < 3 || FrameCols (tty) < 3)
3693        maybe_fatal (must_succeed, NULL, terminal,
3694                     "Screen size %dx%d is too small"
3695                     "Screen size %dx%d is too small",
3696                     FrameCols (tty), FrameRows (tty));
3697    
3698    #if 0  /* This is not used anywhere. */
3699      tty->terminal->min_padding_speed = tgetnum ("pb");
3700    #endif
3701    
3702      TabWidth (tty) = tgetnum ("tw");
3703    
3704      if (!tty->TS_bell)
3705        tty->TS_bell = "\07";
3706    
3707      if (!tty->TS_fwd_scroll)
3708        tty->TS_fwd_scroll = Down (tty);
3709    
3710      PC = tty->TS_pad_char ? *tty->TS_pad_char : 0;
3711    
3712      if (TabWidth (tty) < 0)
3713        TabWidth (tty) = 8;
3714    
3715    /* Turned off since /etc/termcap seems to have :ta= for most terminals
3716       and newer termcap doc does not seem to say there is a default.
3717      if (!tty->Wcm->cm_tab)
3718        tty->Wcm->cm_tab = "\t";
3719    */
3720    
3721      /* We don't support standout modes that use `magic cookies', so
3722         turn off any that do.  */
3723      if (tty->TS_standout_mode && tgetnum ("sg") >= 0)
3724        {
3725          tty->TS_standout_mode = 0;
3726          tty->TS_end_standout_mode = 0;
3727        }
3728      if (tty->TS_enter_underline_mode && tgetnum ("ug") >= 0)
3729        {
3730          tty->TS_enter_underline_mode = 0;
3731          tty->TS_exit_underline_mode = 0;
3732        }
3733    
3734      /* If there's no standout mode, try to use underlining instead.  */
3735      if (tty->TS_standout_mode == 0)
3736        {
3737          tty->TS_standout_mode = tty->TS_enter_underline_mode;
3738          tty->TS_end_standout_mode = tty->TS_exit_underline_mode;
3739        }
3740    
3741      /* If no `se' string, try using a `me' string instead.
3742         If that fails, we can't use standout mode at all.  */
3743      if (tty->TS_end_standout_mode == 0)
3744        {
3745          char *s = tgetstr ("me", address);

At conditional (1): "s != 0" taking true path

3746          if (s != 0)
3747            tty->TS_end_standout_mode = s;
3748          else
3749            tty->TS_standout_mode = 0;
3750        }
3751    

At conditional (2): "(tty)->TF_teleray != 0" taking true path

3752      if (tty->TF_teleray)
3753        {
3754          tty->Wcm->cm_tab = 0;
3755          /* We can't support standout mode, because it uses magic cookies. 
 */
3756          tty->TS_standout_mode = 0;
3757          /* But that means we cannot rely on ^M to go to column zero! */
3758          CR (tty) = 0;
3759          /* LF can't be trusted either -- can alter hpos */
3760          /* if move at column 0 thru a line with TS_standout_mode */
3761          Down (tty) = 0;
3762        }
3763    
3764      /* Special handling for certain terminal types known to need it */
3765    

At conditional (3): "strcmp == 0" taking true path

3766      if (!strcmp (terminal_type, "supdup"))
3767        {
3768          terminal->memory_below_frame = 1;
3769          tty->Wcm->cm_losewrap = 1;
3770        }

At conditional (4): "strncmp == 0" taking false path
At conditional (5): "strcmp == 0" taking false path

3771      if (!strncmp (terminal_type, "c10", 3)
3772          || !strcmp (terminal_type, "perq"))
3773        {
3774          /* Supply a makeshift :wi string.
3775             This string is not valid in general since it works only
3776             for windows starting at the upper left corner;
3777             but that is all Emacs uses.
3778    
3779             This string works only if the frame is using
3780             the top of the video memory, because addressing is 
memory-relative.
3781             So first check the :ti string to see if that is true.
3782    
3783             It would be simpler if the :wi string could go in the termcap
3784             entry, but it can't because it is not fully valid.
3785             If it were in the termcap entry, it would confuse other 
programs.  */
3786          if (!tty->TS_set_window)
3787            {
3788              p = tty->TS_termcap_modes;
3789              while (*p && strcmp (p, "\033v  "))
3790                p++;
3791              if (*p)
3792                tty->TS_set_window = "\033v%C %C %C %C ";
3793            }
3794          /* Termcap entry often fails to have :in: flag */
3795          terminal->must_write_spaces = 1;
3796          /* :ti string typically fails to have \E^G! in it */
3797          /* This limits scope of insert-char to one line.  */
3798          strcpy (area, tty->TS_termcap_modes);
3799          strcat (area, "\033\007!");
3800          tty->TS_termcap_modes = area;
3801          area += strlen (area) + 1;
3802          p = AbsPosition (tty);
3803          /* Change all %+ parameters to %C, to handle
3804             values above 96 correctly for the C100.  */
3805          while (*p)
3806            {
3807              if (p[0] == '%' && p[1] == '+')
3808                p[1] = 'C';
3809              p++;
3810            }
3811        }
3812    
3813      tty->specified_window = FrameRows (tty);
3814    

At conditional (6): "Wcm_init == -1" taking false path

3815      if (Wcm_init (tty) == -1)     /* can't do cursor motion */
3816        {
3817          maybe_fatal (must_succeed, NULL, terminal,
3818                       "Terminal type \"%s\" is not powerful enough to run 
Emacs",
3819    # ifdef TERMINFO
3820                       "Terminal type \"%s\" is not powerful enough to run 
Emacs.\n\
3821    It lacks the ability to position the cursor.\n\
3822    If that is not the actual type of terminal you have,\n\
3823    use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
3824    `setenv TERM ...') to specify the correct type.  It may be necessary\n\
3825    to do `unset TERMINFO' (C-shell: `unsetenv TERMINFO') as well.",
3826    # else /* TERMCAP */
3827                       "Terminal type \"%s\" is not powerful enough to run 
Emacs.\n\
3828    It lacks the ability to position the cursor.\n\
3829    If that is not the actual type of terminal you have,\n\
3830    use the Bourne shell command `TERM=... export TERM' (C-shell:\n\
3831    `setenv TERM ...') to specify the correct type.  It may be necessary\n\
3832    to do `unset TERMCAP' (C-shell: `unsetenv TERMCAP') as well.",
3833    # endif /* TERMINFO */
3834                       terminal_type);
3835        }
3836    

At conditional (7): "((tty)->Wcm)->cm_rows <= 0" taking false path
At conditional (8): "((tty)->Wcm)->cm_cols <= 0" taking false path

3837      if (FrameRows (tty) <= 0 || FrameCols (tty) <= 0)
3838        maybe_fatal (must_succeed, NULL, terminal,
3839                     "Could not determine the frame size",
3840                     "Could not determine the frame size");
3841    

At conditional (9): "(tty)->TS_delete_mode != 0" taking true path
At conditional (10): "(tty)->TS_insert_mode != 0" taking true path
At conditional (11): "strcmp == 0" taking true path

3842      tty->delete_in_insert_mode
3843        = tty->TS_delete_mode && tty->TS_insert_mode
3844        && !strcmp (tty->TS_delete_mode, tty->TS_insert_mode);
3845    

At conditional (12): "(tty)->TS_standout_mode != 0" taking false path

3846      tty->se_is_so = (tty->TS_standout_mode
3847                  && tty->TS_end_standout_mode
3848                  && !strcmp (tty->TS_standout_mode, 
tty->TS_end_standout_mode));
3849    

At conditional (13): "tabs_safe_p != 0" taking true path
At conditional (14): "((tty)->Wcm)->cm_tabwidth == 8" taking true path

3850      UseTabs (tty) = tabs_safe_p (fileno (tty->input)) && TabWidth (tty) 
== 8;
3851    

At conditional (15): "((tty)->Wcm)->cm_abs != 0" taking true path
At conditional (16): "(tty)->TS_set_window != 0" taking true path

3852      terminal->scroll_region_ok
3853        = (tty->Wcm->cm_abs
3854           && (tty->TS_set_window || tty->TS_set_scroll_region || 
tty->TS_set_scroll_region_1));
3855    

At conditional (17): "(tty)->TS_ins_line != 0" taking true path
At conditional (18): "(tty)->TS_del_line != 0" taking true path

3856      terminal->line_ins_del_ok
3857        = (((tty->TS_ins_line || tty->TS_ins_multi_lines)
3858            && (tty->TS_del_line || tty->TS_del_multi_lines))
3859           || (terminal->scroll_region_ok
3860               && tty->TS_fwd_scroll && tty->TS_rev_scroll));
3861    

At conditional (19): "(tty)->TS_ins_char != 0" taking true path
At conditional (20): "(tty)->TS_del_char != 0" taking true path

3862      terminal->char_ins_del_ok
3863        = ((tty->TS_ins_char || tty->TS_insert_mode
3864            || tty->TS_pad_inserted_char || tty->TS_ins_multi_chars)
3865           && (tty->TS_del_char || tty->TS_del_multi_chars));
3866    

At conditional (21): "(tty)->TS_clr_line != 0" taking true path

3867      terminal->fast_clear_end_of_line = tty->TS_clr_line != 0;
3868    
3869      init_baud_rate (fileno (tty->input));
3870    
3871      /* Don't do this.  I think termcap may still need the buffer. */
3872      /* xfree (buffer); */
3873    
3874    #endif /* not DOS_NT */
3875    
3876      /* Init system terminal modes (RAW or CBREAK, etc.).  */
3877      init_sys_modes (tty);
3878    

Event leaked_storage: Returned without freeing storage "area"
Also see events: [alloc_fn][var_assign]

3879      return terminal;




reply via email to

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