Hi,

currently I am trying (just out of curiosity) to find a way to resolve a
duid to a device name. For that matter I believe that looking at
disk_map() in subr_disk.c is the right place.

As I am a complete C beginner I have a hard time to understand a
particular block of code so I decided to copy that function into my own
C code so I can easily track what's going on w/ gdb:

int
main(void)
{
        struct disk *dk, *mdk;
        struct disklist_head disklist;
        u_char uid[8];
        char *path, *mpath, part, c;
        int i;

        path = "9c750dc043a2751f.i";
        part = path[17];

        bzero(uid, sizeof(uid));
        for (i = 0; i < 16; i++) {
                c = path[i];
                if (c >= '0' && c <= '9')
                        c -= '0';
                else if (c >= 'a' && c <= 'f')
                        c -= ('a' - 10);
                else
                        errx("Invalid duid");

                uid[i / 2] <<= 4;
                uid[i / 2] |= c & 0xf;
        }

        mdk = NULL;
        TAILQ_FOREACH(dk, &disklist, dk_link) {
               if ((dk->dk_flags & DKF_LABELVALID) && dk->dk_label &&
                    bcmp(dk->dk_label->d_uid, uid,
                    sizeof(dk->dk_label->d_uid)) == 0) {
                        if (mdk != NULL)
                                return -1;
                        mdk = dk;
                }
        }
        return 0;
}

If I run the program I get a segfault and w/ gdb I see:
Program received signal SIGSEGV, Segmentation fault.
bcmp (b1=0x1c7f88988, b2=0x7f7ffffbe830, length=8) at
/usr/src/lib/libc/string/bcmp.c:51

Which I believe is caused by dk->dk_label->d_uid being inaccessible:

(gdb) print dk->dk_label
$1 = (struct disklabel *) 0x1c7f88948

(gdb) print dk->dk_label->d_uid
Cannot access memory at address 0x1c7f88988

In dev/diskmap.c I see copyinstr(9) before disk_map() and copyoutstr(9)
after disk_map. Is this because dk->dk_label->d_uid is not accessible
from userspace or am I talking complete BS here?

Beatings with the cluestick are welcomed.

Thanks,
    Frank.

--
Frank Brodbeck <f...@guug.de>

Reply via email to