Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-1232064

Displaying an empty Choice widget crashes. Solaris only.

XMLWordPrintable

    • 1.0.2
    • sparc
    • generic, solaris_2.4
    • Verified

      r.addNotify(Container.java:363)
              java.awt.Window.addNotify(Window.java:72)
              java.awt.Frame.addNotify(Frame.java:87)
              java.awt.Window.pack(Window.java:83)
              QuickTest.init(QuickTest.java:38)
              sun.applet.AppletPanel.run(AppletPanel.java:243)
              java.lang.Thread.run(Thread.java)
          "Finalizer thread" (TID:0xee3003b0, sys_thread_t:0xef490de0) prio=1
          "Async Garbage Collector" (TID:0xee300368, sys_thread_t:0xef4c0de0) prio=1
          "Idle thread" (TID:0xee300320, sys_thread_t:0xef4f0de0) prio=0
          "clock handler" (TID:0xee3001f8, sys_thread_t:0xef5b0de0) prio=11
          "main" (TID:0xee3000a0, sys_thread_t:0x83f68) prio=5
      Monitor Cache Dump:
          unknown key (key=0xef4c0de0): unowned
              Waiting to be notified:
                  "Async Garbage Collector"
          sun.awt.motif.MToolkit@EE302FF0/EE33F7E8 (key=0xee302ff0): monitor owner: "thread applet-QuickTest"
              Waiting to be notified:
                  "AWT-Input"
          java.awt.Frame@EE303778/EE341708 (key=0xee303778): monitor owner: "thread applet-QuickTest"
          java.awt.Choice@EE303808/EE341B40 (key=0xee303808): monitor owner: "thread applet-QuickTest"
          java.awt.Panel@EE303790/EE3417A8 (key=0xee303790): monitor owner: "thread applet-QuickTest"
          sun.awt.motif.MFramePeer@EE3030A8/EE33FA60 (key=0xee3030a8): monitor owner: "AWT-Motif"
          sun.awt.ScreenUpdater@EE3033A0/EE3401F8 (key=0xee3033a0): unowned
              Waiting to be notified:
                  "Screen Updater"
      Registered Monitor Dump:
          unowned
              Waiting to be notified:
                  Finalize me queue lock: "Finalizer thread"
          unowned
              Waiting to be notified:
                  Thread queue lock: "main"
          unowned
          unowned
          unowned
          unowned
          unowned
          unowned
          unowned
          unowned
          unowned
          unowned
              Waiting to be notified:
                  Class lock: Java stack lock: Code rewrite lock: Heap lock: Has finalization queue lock: Monitor IO lock: Child death monitor: Event monitor: I/O monitor: Alarm monitor: "clock handler"
          unowned
          unowned
          monitor owner: "thread applet-QuickTest"
      Thread Alarm Q:
          sys_thread_t 0xef4c0de0 [Timeout in 757 ms]
          Sbrk lock: Monitor cache lock: Monitor registry: Abort (core dumped)
      Solaris only: Displaying an empty Choice widget crashes

      Steps to reproduce
      Compile and run the attached code

      import java.awt.*;
      import java.applet.Applet;

      public class CT extends Applet
      {

          public void init()
          {
             add(new Choice());
          }

          public static void main(String args[])
          {
             AppletFrame.startApplet("CT", "Choice Test", args);
          }
      }



      /* Generic Applet to Application Frame
       * @(#)AppletFrame.java 1.1 14 Dec 1995 14:41:30
       * 1.4 12/02/95 15:28:07
       * @author Kevin A. Smith
       *
       * Directions for use:
       *
       * In order to convert an applet to an application you must provide
       * two things: A main() function in the class body of the applet
       * and an AWT Frame window for the application to exist in. If your
       * applet requires parameters from the HTML Applet tag, you will need
       * to do additional work.
       *
       * Here's a sample main() function that you can add to your applet class:
       *
       * public static void main(String args[])
       * {
       * AppletFrame.startApplet( <ClassName>, "Application Title", args);
       * }
       *
       * The class AppletFrame provides a simple AWT Frame window for running
       * applications.
       *
       */

      import java.awt.Frame;
      import java.awt.Event;
      import java.awt.Dimension;
      import java.applet.Applet;

      // Applet to Application Frame window
      class AppletFrame extends Frame
      {

          public static void startApplet(String className,
                                         String title,
                                         String args[])
          {
             // local variables
             Applet a;
             Dimension appletSize;

             try
             {
                // create an instance of your applet class
                a = (Applet) Class.forName(className).newInstance();
             }
             catch (ClassNotFoundException e) { return; }
             catch (InstantiationException e) { return; }
             catch (IllegalAccessException e) { return; }

             // initialize the applet
             a.init();
             a.start();
        
             // create new application frame window
             AppletFrame f = new AppletFrame(title);
        
             // add applet to frame window
             f.add("Center", a);
        
             // resize frame window to fit applet
             // assumes that the applet sets its own size
             // otherwise, you should set a specific size here.
             appletSize = a.size();
             f.pack();
             f.resize(appletSize);

             // show the window
             f.show();
        
          } // end startApplet()
        
        
          // constructor needed to pass window title to class Frame
          public AppletFrame(String name)
          {
             // call java.awt.Frame(String) constructor
             super(name);
          }

          // needed to allow window close
          public boolean handleEvent(Event e)
          {
             // Window Destroy event
             if (e.id == Event.WINDOW_DESTROY)
             {
                // exit the program
                System.exit(0);
                return true;
             }
             
             // it's good form to let the super class look at any
             // unhandled events
             return super.handleEvent(e);

          } // end handleEvent()

      } // end class AppletFrame

      The description field as copied from bug report 1235627 follows:

      Doing a Component.add(Choice c) when "c" has had no items causes
      a SIGSEGV. This is isn't a useful thing to do, but dumping core isn't a nice
      outcome. Perhaps turning it into a one-choice ("null") button or throwing
      an exception would be a better way to handle it.

      The following is a simple test case:

      import java.awt.*;
      /**
       * dumps core with SIGSEGV
       */
      public class ChoiceTest extends Frame {
          Choice c1;
          public ChoiceTest() {
      super("ChoiceTest");
      c1 = new Choice();
      add("North", c1);
      pack();
      show();
          }
          public static void main(String args[]) {
      new ChoiceTest();
          }
      }

      --bruce.walker@east

      Original bug report (before customer realized they had done no addItems
      in this particular case):

      *** This is a severe problem, is there a known workaround? ***

      In Espresso, we have a number of dialog boxes where the strings on Choice component must be changed, just like list boxes.

      In list boxes, we clear() all strings and then addItem() the new strings.

      In Choice menus, there is no clear() method so we create a new Choice component on the fly. Below is a pruned version of our code. If this is not a known problem or is not imminently reproducable, lets us know, we can fabricate a complete example:

          public void addin(Dlg dlg) {
              cmp.show(false); // hack -just undisplay old one
              cmp = new Choice();
              cmp.reshape(xpos+lwid+4,ypos-2,70,25);
              for ( int ix = 0; ix < num_strs; ix++ )
                  cmp.addItem(strs[ix]);
      // cmp.select(0); // errors, says 0 invalid index!
              dlg.add(cmp);
          }

      ***************** OUTPUT *************************

      Any workaround suggestions:

      SIGSEGV 11* segmentation violation
          si_signo [11]: SIGSEGV 11* segmentation violation
          si_errno [0]: Error 0
          si_code [1]: SEGV_ACCERR [addr: 0xfffffffc]

          stackbase=EE13F000, stackpointer=EE13DF20

      Full thread dump:
          "Image Fetcher 3" (TID:0xee8fcd88, sys_thread_t:0xee094de0) prio=8
          java.lang.Object.wait(Object.java)
          sun.awt.image.ImageFetcher.nextImage(ImageFetcher.java:81)
          sun.awt.image.ImageFetcher.run(ImageFetcher.java:96)
          "Image Fetcher 2" (TID:0xee8fcd20, sys_thread_t:0xee0b6de0) prio=8
          java.lang.Object.wait(Object.java)
          sun.awt.image.ImageFetcher.nextImage(ImageFetcher.java:81)
          sun.awt.image.ImageFetcher.run(ImageFetcher.java:96)
          "Image Fetcher 1" (TID:0xee8fccb8, sys_thread_t:0xee0d8de0) prio=8
          java.lang.Object.wait(Object.java)
          sun.awt.image.ImageFetcher.nextImage(ImageFetcher.java:81)
          sun.awt.image.ImageFetcher.run(ImageFetcher.java:96)
          "Image Fetcher 0" (TID:0xee8fcc30, sys_thread_t:0xee0fade0) prio=8
          java.lang.Object.wait(Object.java)
          sun.awt.image.ImageFetcher.nextImage(ImageFetcher.java:81)
          sun.awt.image.ImageFetcher.run(ImageFetcher.java:96)
          "duker" (TID:0xee8fc990, sys_thread_t:0xee11cde0) prio=1
          AxViewer.run(AxViewer.java:1189)
          java.lang.Thread.run(Thread.java)
          "listener" (TID:0xee8fc968, sys_thread_t:0xee13ede0) prio=1 *current thread*
          sun.awt.motif.MChoicePeer.initialize(MChoicePeer.java:35)
          sun.awt.motif.MComponentPeer.<init>(MComponentPeer.java:86)
          sun.awt.motif.MChoicePeer.<init>(MChoicePeer.java:40)
          sun.awt.motif.MToolkit.createChoice(MToolkit.java:81)
          java.awt.Choice.addNotify(Choice.java:55)
          java.awt.Container.add(Container.java:143)
          java.awt.Container.add(Container.java:102)
          Widget.addin(Dlg.java:501)
          AxwChoice.addin(Dlg.java:689)
          AxwChoice.newstrs(Dlg.java:698)
          Dlg.ctrl_xxx(Dlg.java:168)
          AxViewer.run(AxViewer.java:1247)
          java.lang.Thread.run(Thread.java)
          "Screen Updater" (TID:0xee8e24b8, sys_thread_t:0xee17ade0) prio=4
          java.lang.Object.wait(Object.java)
          sun.awt.ScreenUpdater.nextEntry(ScreenUpdater.java:75)
          sun.awt.ScreenUpdater.run(ScreenUpdater.java:95)
          "AWT-Motif" (TID:0xee8e2148, sys_thread_t:0xee19cde0) prio=5
          java.lang.Thread.run(Thread.java)
          "AWT-Input" (TID:0xee8e2120, sys_thread_t:0xee1bede0) prio=5
          "thread applet-starter.class" (TID:0xee8e1ee8, sys_thread_t:0xee4bede0) prio=6
          java.lang.Object.wait(Object.java)
          sun.applet.AppletPanel.getNextEvent(AppletPanel.java:154)
          sun.applet.AppletPanel.run(AppletPanel.java:174)
          java.lang.Thread.run(Thread.java)
          "Finalizer thread" (TID:0xee8df370, sys_thread_t:0xee4f5de0) prio=1
          "Async Garbage Collector" (TID:0xee8df318, sys_thread_t:0xee517de0) prio=1
          "Idle thread" (TID:0xee8df2a0, sys_thread_t:0xee539de0) prio=0
          "clock handler" (TID:0xee8df1f8, sys_thread_t:0xee55bde0) prio=11
          "main" (TID:0xee8df0a0, sys_thread_t:0x745f0) prio=5
      Monitor Cache Dump:
          java.awt.Choice@EE8F29D8/EE95C9B8 (key=0xee8f29d8): monitor owner: "listener"
          java.util.Vector@EE8FCDF0/EE9A06B0 (key=0xee8fcdf0): unowned
          Waiting to be notified:
              "Image Fetcher 1"
              "Image Fetcher 2"
              "Image Fetcher 3"
              "Image Fetcher 0"
          unknown key (key=0xee11cde0): monitor owner: "duker"
          sun.awt.motif.MToolkit@EE8E2108/EE91E210 (key=0xee8e2108): monitor owner: "listener"
          Waiting to enter:
              "AWT-Input"
          Waiting to be notified:
              "AWT-Motif"
          sun.awt.ScreenUpdater@EE8E24B8/EE91EC28 (key=0xee8e24b8): unowned
          Waiting to be notified:
              "Screen Updater"
          unknown key (key=0xee517de0): unowned
          Waiting to be notified:
              "Async Garbage Collector"
          sun.applet.AppletViewerPanel@EE8E1D80/EE91D198 (key=0xee8e1d80): unowned
          Waiting to be notified:
              "thread applet-starter.class"
          Dlg@EE8F1498/EE957498 (key=0xee8f1498): monitor owner: "listener"
      Registered Monitor Dump:
          Finalize me queue lock: unowned
          Waiting to be notified:
              "Finalizer thread"
          Thread queue lock: unowned
          Waiting to be notified:
              "main"
          Class lock: unowned
          Java stack lock: unowned
          Code rewrite lock: unowned
          Heap lock: unowned
          Has finalization queue lock: unowned
          Monitor IO lock: unowned
          Child death monitor: unowned
          Event monitor: unowned
          I/O monitor: unowned
          Alarm monitor: unowned
          Waiting to be notified:
              "clock handler"
          Sbrk lock: unowned
          Monitor cache lock: unowned
          Monitor registry: monitor owner: "listener"
      Thread Alarm Q:
          sys_thread_t 0xee517de0 [Timeout in 231 ms]

      ///////////////////////////////////////////////////////////////////////////
      // Barry Zane Vice President of Technology
      // Applix, Inc 508-870-0300 x226 ###@###.###

      The description field as copied from bug report 1240186 follows:

      import java.awt.*;
      public class testcase extends java.applet.Applet {

      // a slot to hold an arbitrary object pointer that can
      // be filled in by the app. and referenced in actions
      public Object arg;

      public Choice menubutton_1;

      //methods to support form introspection
      public static String names[] = {
      "menubutton_1",
      };
      public String[] getNames() {
      return names;
      }

      //There should be an easier way to do this
      public Object[] getWidgets() {
      Object[] list = new Object[1];
      list[0] = menubutton_1;
      return list;
      }

      public void init() {

      // main panel
      GridBagLayout grid = new GridBagLayout();
      int rowHeights[] = {0,30,30,30};
      int columnWidths[] = {0,30,30,30};
      double rowWeights[] = {0.0,0.0,0.0,0.0};
      double columnWeights[] = {0.0,0.0,0.0,0.0};
      grid.rowHeights = rowHeights;
      grid.columnWidths = columnWidths;
      grid.rowWeights = rowWeights;
      grid.columnWeights = columnWeights;

      menubutton_1 = new Choice();
      /* menubutton_1.addItem("xyz"); */
      this.add(menubutton_1);

      // Geometry management
      GridBagConstraints con = new GridBagConstraints();
      reset(con);
      con.gridx = 2;
      con.gridy = 2;
      con.anchor = GridBagConstraints.CENTER;
      con.fill = GridBagConstraints.NONE;
      grid.setConstraints(menubutton_1, con);


      // Resize behavior management and parent heirarchy
      setLayout(grid);

      // Give the application a chance to do its initialization
      super.init();
      }

      public boolean handleEvent(Event event) {
      return super.handleEvent(event);
      }

      public static void main(String[] args) {
          Frame f = new Frame("testcase Test");
          testcase win = new testcase();
          win.init();
          f.add("Center", win);
          f.pack();
          f.show();
      }

      private void reset(GridBagConstraints con) {
          con.gridx = GridBagConstraints.RELATIVE;
          con.gridy = GridBagConstraints.RELATIVE;
          con.gridwidth = 1;
          con.gridheight = 1;
       
          con.weightx = 0;
          con.weighty = 0;
          con.anchor = GridBagConstraints.CENTER;
          con.fill = GridBagConstraints.NONE;
       
          con.insets = new Insets(0, 0, 0, 0);
          con.ipadx = 0;
          con.ipady = 0;
      }

      }

      The description field as copied from bug report 1240954 follows:

      Simple:
      1) Create a gridbag.
      2) Add a Choice control to it.
      3) At runtime you get the segmentation fault shown below:

      CODE TO REPRODUCE:

      ******* QuickTest.html *************************************************

      <applet code="QuickTest" width=200 height=50> </applet>

      ******* QuickTest.java *************************************************

      import java.awt.*;
      import java.lang.*;
      import java.applet.*;

      public class QuickTest extends Applet {

        Choice testChoice;
        Frame theFrame;

        public void init() {

          theFrame = new Frame();

          Panel topPanel = new Panel();

          GridBagLayout gridbag = new GridBagLayout();
          GridBagConstraints gbC = new GridBagConstraints();
          Component component = null;

          topPanel.setLayout(gridbag);

          // Backup id Choice
          clear_constraints(gbC);
          gbC.gridx = 0;
          gbC.gridy = 0;
          gbC.anchor = GridBagConstraints.SOUTHWEST;
          testChoice = new Choice();
          component = testChoice;
          // VVVVVVVV Commenting out this line causes core dump VVVVVVV
          // ((Choice)component).addItem("This is a test");
          // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
          gridbag.setConstraints(component, gbC);
          topPanel.add(component);
          System.out.println("DEBUG - added...");

          theFrame.add("Center", topPanel);
          theFrame.pack();
          theFrame.resize(200,200);
          theFrame.show();
        }

          public void clear_constraints(GridBagConstraints gbConstraints) {
            gbConstraints.gridx = -1;
            gbConstraints.gridy = -1;
            gbConstraints.gridwidth = 1;
            gbConstraints.gridheight = 1;
            gbConstraints.weightx = 0;
            gbConstraints.weighty = 0;
            gbConstraints.fill = GridBagConstraints.NONE;
            gbConstraints.anchor = GridBagConstraints.CENTER;
          }
      }


      ******* SEGMENTATION VIOLATION: ********************************************

      SIGSEGV 11* segmentation violation
          si_signo [11]: SIGSEGV 11* segmentation violation
          si_errno [0]: Error 0
          si_code [1]: SEGV_ACCERR [addr: 0xfffffffc]

              stackbase=EF461000, stackpointer=EF45FE68

      Full thread dump:
          "Screen Updater" (TID:0xee3033a0, sys_thread_t:0xef0d0de0) prio=4
              java.lang.Object.wait(Object.java)
              sun.awt.ScreenUpdater.nextEntry(ScreenUpdater.java:75)
              sun.awt.ScreenUpdater.run(ScreenUpdater.java:95)
          "AWT-Motif" (TID:0xee303030, sys_thread_t:0xef100de0) prio=5
              java.awt.Window.postEvent(Window.java:169)
              sun.awt.motif.MFramePeer.handleMoved(MFramePeer.java:124)
              java.lang.Thread.run(Thread.java)
          "AWT-Input" (TID:0xee303008, sys_thread_t:0xef130de0) prio=5
          "thread applet-QuickTest" (TID:0xee302e48, sys_thread_t:0xef460de0) prio=6 *current thread*
              sun.awt.motif.MChoicePeer.initialize(MChoicePeer.java:35)
              sun.awt.motif.MComponentPeer.<init>(MComponentPeer.java:87)
              sun.awt.motif.MChoicePeer.<init>(MChoicePeer.java:40)
              sun.awt.motif.MToolkit.createChoice(MToolkit.java:81)
              java.awt.Choice.addNotify(Choice.java:55)
              java.awt.Container.addNotify(Container.java:363)
              java.awt.Panel.addNotify(Panel.java:47)
              java.awt.Containe

            amfowler Anne Fowler (Inactive)
            kasmithsunw Kevin Smith (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: