Re: armv7 main's gpart [show]: signal 11 core dump during boot, before login; xo_format_string_direct; official pkgbase distribution (kernel and world)

From: Mark Millard <marklmi_at_yahoo.com>
Date: Sun, 28 Dec 2025 16:54:40 UTC
[Resend including freebsd-arm.]

On Dec 28, 2025, at 08:48, Mark Millard <marklmi@yahoo.com> wrote:

js@freebsd.org <js_at_FreeBSD.org> wrote on
Date: Sun, 28 Dec 2025 11:01:59 UTC :

> I'll take a look at it and try to setup a reproducer, unfortunately my 
> time is a bit limited during the holidays so I can't promise any quick 
> fixes right now.
> 
> Could you share the output of
> 
> gpart --libxo:JP show
> 
> with me? If possible.

On the Orange Pi Plus 2e (Cortex-A7, not aarch64,
just armv7):

# gpart --libxo:JP show
Segmentation fault (core dumped)

I'll note that the 0x6e480000 in r0 that is shown
later below is the same failing address reported
in my original list submittal about the issue.


For reference:

(gdb) bt
#0  strlen () at /usr/src/lib/libc/arm/string/strlen.S:46
#1  0x20151020 in xo_format_string (xop=0x2009b120, xbp=0x2009b150, flags=4096, xfp=0xbfbfd1f8) at /usr/src/contrib/libxo/libxo/libxo.c:2966
#2  xo_do_format_field (xop=<optimized out>, xop@entry=0x2009b120, xbp=0x2009b150, fmt=fmt@entry=0xbfbfd268 "%s", flen=<optimized out>, flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:3503
#3  0x2014d0a8 in xo_simple_field (xop=0x2009b120, encode_only=0, value=0x0, vlen=0, fmt=0xbfbfd268 "%s", flen=2, flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:3817
#4  xo_format_value (xop=<optimized out>, xop@entry=0x2009b120, name=name@entry=0x204bf931 "state}\n", nlen=nlen@entry=5, value=0x0, vlen=0, fmt=0xbfbfd268 "%s", flen=2, encoding=0x0, elen=0, 
   flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:4535
#5  0x20148710 in xo_do_emit_fields (xop=<optimized out>, xop@entry=0x2009b120, fields=<optimized out>, fields@entry=0xbfbfd768, max_fields=max_fields@entry=17, fmt=<optimized out>)
   at /usr/src/contrib/libxo/libxo/libxo.c:6372
#6  0x201476a0 in xo_do_emit (xop=xop@entry=0x2009b120, flags=<optimized out>, fmt=fmt@entry=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n")
   at /usr/src/contrib/libxo/libxo/libxo.c:6551
#7  0x20147840 in xo_emit (fmt=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n") at /usr/src/contrib/libxo/libxo/libxo.c:6622
#8  0x204d1fd4 in gpart_show_geom (gp=gp@entry=0x20089168, element=element@entry=0x204bfe51 "type", show_providers=show_providers@entry=0) at /usr/src/lib/geom/part/geom_part.c:654
#9  0x204d1048 in gpart_show (req=0x20089000, fl=<optimized out>) at /usr/src/lib/geom/part/geom_part.c:793
#10 0x000230dc in run_command (argc=0, argv=<optimized out>) at /usr/src/sbin/geom/core/geom.c:497
#11 0x00022308 in main (argc=1, argv=0xbfbfed10) at /usr/src/sbin/geom/core/geom.c:861
(gdb) list
41              /* So that the N bit is set. */
42              cmp    r3, #0
43              b       .Ldo_2
44      
45      .Loop:
46              ldr     r2, [r0]
47              add    r0, r0, #4
48              ands    r3, r2, #0x000000ff
49              it      ne
50              addne   r1, r1, #1
#1  0x20151020 in xo_format_string (xop=0x2009b120, xbp=0x2009b150, flags=4096, xfp=0xbfbfd1f8) at /usr/src/contrib/libxo/libxo/libxo.c:2966
warning: Source file is more recent than executable.
2966                len = strlen(cp);
(gdb) list
2961                    && xfp->xf_width[XF_WIDTH_MIN] < 0
2962                    && xfp->xf_width[XF_WIDTH_SIZE] < 0
2963                    && xfp->xf_width[XF_WIDTH_MAX] < 0
2964                    && !(XOIF_ISSET(xop, XOIF_ANCHOR)
2965                         || XOF_ISSET(xop, XOF_COLUMNS))) {
2966                len = strlen(cp);
2967                xo_buf_escape(xop, xbp, cp, len, flags);
2968    
2969                /*
2970             * Our caller expects xb_curp left untouched, so we have
(gdb) up
#2  xo_do_format_field (xop=<optimized out>, xop@entry=0x2009b120, xbp=0x2009b150, fmt=fmt@entry=0xbfbfd268 "%s", flen=<optimized out>, flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:3503
3503                    rc = xo_format_string(xop, xbp, flags, &xf);
(gdb) list
3498    
3499                    xf.xf_enc = (xf.xf_fc == 'm') ? XF_ENC_UTF8
3500                        : (xf.xf_lflag || (xf.xf_fc == 'S')) ? XF_ENC_WIDE
3501                        : xf.xf_hflag ? XF_ENC_LOCALE : XF_ENC_UTF8;
3502    
3503                    rc = xo_format_string(xop, xbp, flags, &xf);
3504    
3505                    if ((flags & XFF_TRIM_WS) && xo_style_is_encoding(xop))
3506                        rc = xo_trim_ws(xbp, rc);
3507    
(gdb) up
#3  0x2014d0a8 in xo_simple_field (xop=0x2009b120, encode_only=0, value=0x0, vlen=0, fmt=0xbfbfd268 "%s", flen=2, flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:3817
3817            xo_do_format_field(xop, NULL, fmt, flen, flags);
(gdb) list
3812    {
3813        if (encode_only)
3814            flags |= XFF_NO_OUTPUT;
3815    
3816        if (vlen == 0)
3817            xo_do_format_field(xop, NULL, fmt, flen, flags);
3818        else if (!encode_only)
3819            xo_data_append_content(xop, value, vlen, flags);
3820    }
3821    
(gdb) up
#4  xo_format_value (xop=<optimized out>, xop@entry=0x2009b120, name=name@entry=0x204bf931 "state}\n", nlen=nlen@entry=5, value=0x0, vlen=0, fmt=0xbfbfd268 "%s", flen=2, encoding=0x0, elen=0, 
   flags=4096) at /usr/src/contrib/libxo/libxo/libxo.c:4535
4535            xo_simple_field(xop, FALSE, value, vlen, fmt, flen, flags);
(gdb) list
4530            }
4531    
4532            if (quote)
4533                xo_data_append(xop, "\"", 1);
4534    
4535            xo_simple_field(xop, FALSE, value, vlen, fmt, flen, flags);
4536    
4537            if (quote)
4538                xo_data_append(xop, "\"", 1);
4539            break;
(gdb) up
#5  0x20148710 in xo_do_emit_fields (xop=<optimized out>, xop@entry=0x2009b120, fields=<optimized out>, fields@entry=0xbfbfd768, max_fields=max_fields@entry=17, fmt=<optimized out>)
   at /usr/src/contrib/libxo/libxo/libxo.c:6372
6372                xo_format_value(xop, content, clen, NULL, 0,
(gdb) list
6367                    flags &= ~XFF_WS; /* Prevent later handling of this flag */
6368                }
6369            }
6370    
6371            if (ftype == 'V')
6372                xo_format_value(xop, content, clen, NULL, 0,
6373                                xfip->xfi_format, xfip->xfi_flen,
6374                                xfip->xfi_encoding, xfip->xfi_elen, flags);
6375            else if (ftype == '[')
6376                xo_anchor_start(xop, xfip, content, clen);
(gdb) up
#6  0x201476a0 in xo_do_emit (xop=xop@entry=0x2009b120, flags=<optimized out>, fmt=fmt@entry=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n")
   at /usr/src/contrib/libxo/libxo/libxo.c:6551
6551        return xo_do_emit_fields(xop, fields, max_fields, fmt);
(gdb) list
6546                /* Retain the info */
6547                xo_retain_add(fmt, fields, max_fields);
6548            }
6549        }
6550    
6551        return xo_do_emit_fields(xop, fields, max_fields, fmt);
6552    }
6553    
6554    /*
6555     * Rebuild a format string in a gettext-friendly format.  This function
. . .
(gdb) up
#7  0x20147840 in xo_emit (fmt=0x204bf8e3 "=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n") at /usr/src/contrib/libxo/libxo/libxo.c:6622
6622        rc = xo_do_emit(xop, 0, fmt);
(gdb) list
6617    {
6618        xo_handle_t *xop = xo_default(NULL);
6619        ssize_t rc;
6620    
6621        va_start(xop->xo_vap, fmt);
6622        rc = xo_do_emit(xop, 0, fmt);
6623        va_end(xop->xo_vap);
6624        bzero(&xop->xo_vap, sizeof(xop->xo_vap));
6625    
6626        return rc;
(gdb) up
#8  0x204d1fd4 in gpart_show_geom (gp=gp@entry=0x20089168, element=element@entry=0x204bfe51 "type", show_providers=show_providers@entry=0) at /usr/src/lib/geom/part/geom_part.c:654
warning: Source file is more recent than executable.
654             xo_emit("=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n",
(gdb) list
649             }
650             wname = wmax;
651             pp = LIST_FIRST(&gp->lg_consumer)->lg_provider;
652             secsz = pp->lg_sectorsize;
653             xo_open_instance("part");
654             xo_emit("=>{t:start/%*jd}  {t:sectors/%*jd}  {t:name/%*s}  {:scheme}  ({h:size/%ld}){t:state}\n",
655                     wblocks, (intmax_t)first, wblocks, (intmax_t)(last - first + 1),
656                     wname, gp->lg_name,
657                     scheme, pp->lg_mediasize,
658                     s ? " [CORRUPT]": "");
(gdb) up
#9  0x204d1048 in gpart_show (req=0x20089000, fl=<optimized out>) at /usr/src/lib/geom/part/geom_part.c:793
793                             gpart_show_geom(gp, element, show_providers);
(gdb) list
788                             else
789                                     errx(EXIT_FAILURE, "No such geom: %s.", name);
790                     }
791             } else {
792                     LIST_FOREACH(gp, &classp->lg_geom, lg_geom) {
793                             gpart_show_geom(gp, element, show_providers);
794                     }
795             }
796             xo_close_list(name);
797             geom_deletetree(&mesh);
(gdb) up
#10 0x000230dc in run_command (argc=0, argv=<optimized out>) at /usr/src/sbin/geom/core/geom.c:497
warning: Source file is more recent than executable.
497                     cmd->gc_func(req, flags);
(gdb) list
492             buf[0] = '\0';
493             if (cmd->gc_func != NULL) {
494                     unsigned flags;
495     
496                     flags = set_flags(cmd);
497                     cmd->gc_func(req, flags);
498                     errstr = req->error;
499             } else {
500                     gctl_add_param(req, "output", sizeof(buf), buf,
501                         GCTL_PARAM_WR | GCTL_PARAM_ASCII);
(gdb) up
#11 0x00022308 in main (argc=1, argv=0xbfbfed10) at /usr/src/sbin/geom/core/geom.c:861
861             run_command(argc, argv);
(gdb) list
856                     show_tree();
857                     return (0);
858             }
859     
860             get_class(&argc, &argv);
861             run_command(argc, argv);
862             /* NOTREACHED */
863     
864             exit(EXIT_FAILURE);
865     }
(gdb) frame 0
#0  strlen () at /usr/src/lib/libc/arm/string/strlen.S:46
46              ldr     r2, [r0]
(gdb) info registers
r0             0x6e480000          1850212352
r1             0x0                 0
r2             0x80                128
r3             0x0                 0
r4             0xffffffff          4294967295
r5             0x6e480000          1850212352
r6             0x0                 0
r7             0x2                 2
r8             0x2009b120          537506080
r9             0x1000              4096
r10            0xbfbfd269          3217019497
r11            0xbfbfd258          3217019480
r12            0x201777b0          538408880
sp             0xbfbfd190          0xbfbfd190
lr             0x20151020          538251296
pc             0x202f58c4          0x202f58c4 <strlen+44>
cpsr           0x60000010          1610612752
fpscr          0x2000000           33554432
tpidruro       0x2009b010          0x2009b010


===
Mark Millard
marklmi at yahoo.com


===
Mark Millard
marklmi at yahoo.com