NetBSD-Bugs archive

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

install/43295: sysinst dumps core before editing MBR on arc and hpcmips



>Number:         43295
>Category:       install
>Synopsis:       sysinst dumps core before editing MBR on mips
>Confidential:   no
>Severity:       critical
>Priority:       high
>Responsible:    install-manager
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Wed May 12 13:25:00 +0000 2010
>Originator:     Izumi Tsutsui
>Release:        NetBSD 5.1_RC1
>Organization:
>Environment:
System: NetBSD 5.1_RC1 (RAMDISK) #0: Sat Apr 24 22:53:26 UTC 2010 \
builds%b7.netbsd.org@localhost:/home/builds/ab/netbsd-5-1-RC1-hpcmips/201004250032Z-obj/home/builds/ab/netbsd-5-1-RC1/src/sys/arch/hpcmips/compile/RAMDISK
Architecture: mipsel
Machine: hpcmips, also happens on arc both gxemul and Express5800/230

>Description:
sysinst dumps core during sysinst just before editing MBR partition
after selecting "a: Edit the MBR partition table":

---

 The Current MBR partition table is shown below.
 Flgs: a => Active partition, I => Install here.
 Select the partition you wish to chage:

 [1]   Segmentation fault (core dumped) sysinst
#

---

where "Total disk size 512 MB." should be shown.

>How-To-Repeat:

Try install NetBSD/hpcmips 5.1_RC1 on hpcmips.
You can try it using gxemul:

# pkg_add gxemul

% dd if=/dev/zero of=gxemul.img bs=1m count=512
% ftp ftp.NetBSD.org:/pub/NetBSD/NetBSD-5.1_RC1/hpcmips/installation/netbsd.gz
% gxemul -Xe mobilepro780 -d gxemul.img netbsd.gz

> a: Installation messages in English
> a: Install NetBSD to hard disk
> b: Yes
  Hit enter to continue
> b: Minimal installation
  sectors [63]: (enter)
  heads [255]: (enter)
> a: Edit the MBR partition table

Then you will get core.

>Fix:
The message is printed in src/distrib/utils/sysinst/mbr.c:set_mbr_header():

---
static void
set_mbr_header(menudesc *m, void *arg)
{
        mbr_info_t *mbri = arg;
        static menu_ent *opts;
        static int num_opts;
        mbr_info_t *ext;
        menu_ent *op;
        int i;
        int left;

        msg_display(MSG_editparttable);

        msg_table_add(MSG_part_header, dlsize/sizemult, multname, multname,
            multname, multname);
---

A variable "dlsize" has been changed from int to daddr_t in pullup-5 #758:
http://mail-index.NetBSD.org/source-changes/2009/05/18/msg221460.html
> cvs rdiff -u -r1.136 -r1.136.2.1 src/distrib/utils/sysinst/defs.h

> -int dlcyl, dlhead, dlsec, dlsize, dlcylsize;
> +int dlcyl, dlhead, dlsec, dlcylsize;
> +daddr_t dlsize;

but format characters in msg.mbr.* was not changed from %d:

---
/* the %s's will expand into three character strings */
message part_header
{   Total disk size %d %s.

---

Probably that's the problem.

In the perfect world we should fix msgc(1) not to dump core even if
wring type variables are passed, but in this case (dlsize/sizemult)
won't be >2G since sysinst would choose proper sizemult to print
humanized numbers, so the following simple fix will work.


Index: mbr.c
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/mbr.c,v
retrieving revision 1.79.14.1
diff -u -r1.79.14.1 mbr.c
--- mbr.c       18 May 2009 19:35:13 -0000      1.79.14.1
+++ mbr.c       12 May 2010 12:40:20 -0000
@@ -1152,11 +1152,12 @@
        mbr_info_t *ext;
        menu_ent *op;
        int i;
-       int left;
+       int unitsize, left;
 
        msg_display(MSG_editparttable);
 
-       msg_table_add(MSG_part_header, dlsize/sizemult, multname, multname,
+       unitsize = dlsize / sizemult;
+       msg_table_add(MSG_part_header, unitsize, multname, multname,
            multname, multname);
 
        if (num_opts == 0) {

---
Izumi Tsutsui



Home | Main Index | Thread Index | Old Index