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 <[email protected]>