unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* problem report #97
@ 2008-12-01 15:56 Dan Nicolaescu
  2008-12-08  7:07 ` problem report #97: base/src/emacs/src/term.c (init_tty): RESOURCE_LEAK Dan Nicolaescu
  2008-12-08  9:11 ` Re: problem report #97: base/src/emacs/src/term.c (init_tty):RESOURCE_LEAK richardeng
  0 siblings, 2 replies; 11+ messages in thread
From: Dan Nicolaescu @ 2008-12-01 15:56 UTC (permalink / raw)
  To: emacs-devel

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;




^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2008-12-09  3:33 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-01 15:56 problem report #97 Dan Nicolaescu
2008-12-08  7:07 ` problem report #97: base/src/emacs/src/term.c (init_tty): RESOURCE_LEAK Dan Nicolaescu
2008-12-08 14:05   ` Chong Yidong
2008-12-08 14:49     ` Chong Yidong
2008-12-08  9:11 ` Re: problem report #97: base/src/emacs/src/term.c (init_tty):RESOURCE_LEAK richardeng
2008-12-08 15:31   ` Dan Nicolaescu
2008-12-08 16:00   ` Stefan Monnier
2008-12-08 16:41     ` Eli Zaretskii
2008-12-08 19:36       ` Stefan Monnier
2008-12-08 23:28         ` Eli Zaretskii
2008-12-09  3:33           ` Stefan Monnier

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).