--- sys/kern/sysv_shm.c 5 Mar 2007 13:10:57 -0000 1.111 +++ sys/kern/sysv_shm.c 16 Oct 2007 20:17:25 -0000 @@ -149,7 +149,7 @@ #define SHMMAXPGS 8192 /* Note: sysv shared memory is swap backed. */ #endif #ifndef SHMMAX -#define SHMMAX (SHMMAXPGS*PAGE_SIZE) +#define SHMMAX ((u_long)(SHMMAXPGS) * PAGE_SIZE) #endif #ifndef SHMMIN #define SHMMIN 1 @@ -717,7 +717,8 @@ struct shmget_args *uap; int mode; { - int i, segnum, shmid, size; + int i, segnum, shmid; + size_t size; struct ucred *cred = td->td_ucred; struct shmid_kernel *shmseg; vm_object_t shm_object; --- sys/sys/shm.h 6 Aug 2005 07:20:17 -0000 1.24 +++ sys/sys/shm.h 16 Oct 2007 20:17:25 -0000 @@ -77,14 +77,14 @@ struct shmid_ds { struct ipc_perm shm_perm; /* operation permission structure */ - int shm_segsz; /* size of segment in bytes */ - pid_t shm_lpid; /* process ID of last shared memory op */ - pid_t shm_cpid; /* process ID of creator */ + size_t shm_segsz; /* size of segment in bytes */ + pid_t shm_lpid; /* process ID of last shared memory op */ + pid_t shm_cpid; /* process ID of creator */ short shm_nattch; /* number of current attaches */ - time_t shm_atime; /* time of last shmat() */ - time_t shm_dtime; /* time of last shmdt() */ - time_t shm_ctime; /* time of last change by shmctl() */ - void *shm_internal; /* sysv stupidity */ + time_t shm_atime; /* time of last shmat() */ + time_t shm_dtime; /* time of last shmdt() */ + time_t shm_ctime; /* time of last change by shmctl() */ + void *shm_internal; /* sysv stupidity */ }; #ifdef _KERNEL --- usr.bin/ipcs/Makefile 5 Feb 2004 22:44:24 -0000 1.7 +++ usr.bin/ipcs/Makefile 16 Oct 2007 20:17:36 -0000 @@ -4,4 +4,6 @@ DPADD= ${LIBKVM} LDADD= -lkvm +WARNS?= 6 + .include --- usr.bin/ipcs/ipcs.c 15 May 2006 08:20:38 -0000 1.29 +++ usr.bin/ipcs/ipcs.c 16 Oct 2007 20:17:36 -0000 @@ -76,27 +76,29 @@ void usage(void); uid_t user2uid(char *username); -static struct nlist symbols[] = { - {"sema"}, +static char sym_table[][8] = { + "sema", #define X_SEMA 0 - {"seminfo"}, + "seminfo", #define X_SEMINFO 1 - {"msginfo"}, + "msginfo", #define X_MSGINFO 2 - {"msqids"}, + "msqids", #define X_MSQIDS 3 - {"shminfo"}, + "shminfo", #define X_SHMINFO 4 - {"shmsegs"}, + "shmsegs", #define X_SHMSEGS 5 - {NULL} }; +#define NUM_SYMBOLS 6 + +static struct nlist symbols[NUM_SYMBOLS + 1]; #define SHMINFO_XVEC \ -X(shmmax, sizeof(u_long)) \ -X(shmmin, sizeof(u_long)) \ -X(shmmni, sizeof(u_long)) \ -X(shmseg, sizeof(u_long)) \ +X(shmmax, sizeof(u_long)) \ +X(shmmin, sizeof(u_long)) \ +X(shmmni, sizeof(u_long)) \ +X(shmseg, sizeof(u_long)) \ X(shmall, sizeof(u_long)) #define SEMINFO_XVEC \ @@ -121,13 +123,13 @@ #define X(a, b) { "kern.ipc." #a, offsetof(TYPEC, a), (b) }, #define TYPEC struct shminfo -struct scgs_vector shminfo_scgsv[] = { SHMINFO_XVEC { NULL } }; +struct scgs_vector shminfo_scgsv[] = { SHMINFO_XVEC { NULL, 0, 0 } }; #undef TYPEC #define TYPEC struct seminfo -struct scgs_vector seminfo_scgsv[] = { SEMINFO_XVEC { NULL } }; +struct scgs_vector seminfo_scgsv[] = { SEMINFO_XVEC { NULL, 0, 0 } }; #undef TYPEC #define TYPEC struct msginfo -struct scgs_vector msginfo_scgsv[] = { MSGINFO_XVEC { NULL } }; +struct scgs_vector msginfo_scgsv[] = { MSGINFO_XVEC { NULL, 0, 0 } }; #undef TYPEC #undef X @@ -182,15 +184,16 @@ int main(int argc, char *argv[]) { - int display = SHMINFO | MSGINFO | SEMINFO; - int option = 0; - char *core = NULL, *user = NULL, *namelist = NULL; + int display = SHMINFO | MSGINFO | SEMINFO; + int option = 0; + char *core = NULL, *user = NULL, *namelist = NULL; char kvmoferr[_POSIX2_LINE_MAX]; /* Error buf for kvm_openfiles. */ - int i; - uid_t uid; + uid_t uid = 0; + u_long i; + int j; - while ((i = getopt(argc, argv, "MmQqSsabC:cN:optTu:y")) != -1) - switch (i) { + while ((j = getopt(argc, argv, "MmQqSsabC:cN:optTu:y")) != -1) + switch (j) { case 'M': display = SHMTOTAL; break; @@ -255,6 +258,9 @@ if (namelist != NULL || core != NULL) use_sysctl = 0; + for (j = 0; j < NUM_SYMBOLS; j++) + symbols[j].n_name = sym_table[j]; + symbols[NUM_SYMBOLS].n_name = NULL; if (!use_sysctl) { kd = kvm_openfiles(namelist, core, NULL, O_RDONLY, kvmoferr); if (kd == NULL) @@ -267,10 +273,10 @@ default: #ifdef notdef /* they'll be told more civilly later */ warnx("nlist failed"); - for (i = 0; symbols[i].n_name != NULL; i++) - if (symbols[i].n_value == 0) + for (j = 0; j < NUM_SYMBOLS; j++) + if (symbols[j].n_value == 0) warnx("symbol %s not found", - symbols[i].n_name); + symbols[j].n_name); #endif break; } @@ -297,14 +303,14 @@ struct msqid_kernel *kxmsqids; size_t kxmsqids_len; - - kxmsqids_len = sizeof(struct msqid_kernel) * msginfo.msgmni; + kxmsqids_len = + sizeof(struct msqid_kernel) * msginfo.msgmni; kxmsqids = malloc(kxmsqids_len); kget(X_MSQIDS, kxmsqids, kxmsqids_len); printf("Message Queues:\n"); - printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", "MODE", - "OWNER", "GROUP"); + printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", + "MODE", "OWNER", "GROUP"); if (option & CREATOR) printf(" %-8s %-8s", "CREATOR", "CGROUP"); if (option & OUTSTANDING) @@ -314,23 +320,29 @@ if (option & PID) printf(" %12s %12s", "LSPID", "LRPID"); if (option & TIME) - printf(" %-8s %-8s %-8s", "STIME", "RTIME", "CTIME"); + printf(" %-8s %-8s %-8s", "STIME", "RTIME", + "CTIME"); printf("\n"); - for (i = 0; i < msginfo.msgmni; i += 1) { - if (kxmsqids[i].u.msg_qbytes != 0) { - char stime_buf[100], rtime_buf[100], - ctime_buf[100]; - struct msqid_kernel *kmsqptr = &kxmsqids[i]; - - if (user) - if (uid != kmsqptr->u.msg_perm.uid) - continue; - cvt_time(kmsqptr->u.msg_stime, stime_buf); - cvt_time(kmsqptr->u.msg_rtime, rtime_buf); - cvt_time(kmsqptr->u.msg_ctime, ctime_buf); + for (j = 0; j < msginfo.msgmni; j++) { + if (kxmsqids[j].u.msg_qbytes != 0) { + char stime_buf[100]; + char rtime_buf[100]; + char ctime_buf[100]; + struct msqid_kernel *kmsqptr = + &kxmsqids[j]; + + if (user != NULL && + uid != kmsqptr->u.msg_perm.uid) + continue; + cvt_time(kmsqptr->u.msg_stime, + stime_buf); + cvt_time(kmsqptr->u.msg_rtime, + rtime_buf); + cvt_time(kmsqptr->u.msg_ctime, + ctime_buf); printf("q %12d %12d %s %8s %8s", - IXSEQ_TO_IPCID(i, kmsqptr->u.msg_perm), + IXSEQ_TO_IPCID(j, kmsqptr->u.msg_perm), (int)kmsqptr->u.msg_perm.key, fmt_perm(kmsqptr->u.msg_perm.mode), user_from_uid(kmsqptr->u.msg_perm.uid, 0), @@ -368,36 +380,37 @@ } } else if (display & (MSGINFO | MSGTOTAL)) { - fprintf(stderr, - "SVID messages facility not configured in the system\n"); + fprintf(stderr, "SVID messages facility " + "not configured in the system\n"); } kget(X_SHMINFO, &shminfo, sizeof(shminfo)); if ((display & (SHMINFO | SHMTOTAL))) { if (display & SHMTOTAL) { printf("shminfo:\n"); - printf("\tshmmax: %12d\t(max shared memory segment size)\n", + printf("\tshmmax: %12lu\t(max shared memory segment size)\n", shminfo.shmmax); - printf("\tshmmin: %12d\t(min shared memory segment size)\n", + printf("\tshmmin: %12lu\t(min shared memory segment size)\n", shminfo.shmmin); - printf("\tshmmni: %12d\t(max number of shared memory identifiers)\n", + printf("\tshmmni: %12lu\t(max number of shared memory identifiers)\n", shminfo.shmmni); - printf("\tshmseg: %12d\t(max shared memory segments per process)\n", + printf("\tshmseg: %12lu\t(max shared memory segments per process)\n", shminfo.shmseg); - printf("\tshmall: %12d\t(max amount of shared memory in pages)\n\n", + printf("\tshmall: %12lu\t(max amount of shared memory in pages)\n\n", shminfo.shmall); } if (display & SHMINFO) { struct shmid_kernel *kxshmids; size_t kxshmids_len; - kxshmids_len = sizeof(struct shmid_kernel) * shminfo.shmmni; + kxshmids_len = + sizeof(struct shmid_kernel) * shminfo.shmmni; kxshmids = malloc(kxshmids_len); kget(X_SHMSEGS, kxshmids, kxshmids_len); printf("Shared Memory:\n"); - printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", "MODE", - "OWNER", "GROUP"); + printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", + "MODE", "OWNER", "GROUP"); if (option & CREATOR) printf(" %-8s %-8s", "CREATOR", "CGROUP"); if (option & OUTSTANDING) @@ -407,22 +420,28 @@ if (option & PID) printf(" %12s %12s", "CPID", "LPID"); if (option & TIME) - printf(" %-8s %-8s %-8s", "ATIME", "DTIME", "CTIME"); + printf(" %-8s %-8s %-8s", "ATIME", "DTIME", + "CTIME"); printf("\n"); - for (i = 0; i < shminfo.shmmni; i += 1) { + for (i = 0; i < shminfo.shmmni; i++) { if (kxshmids[i].u.shm_perm.mode & 0x0800) { - char atime_buf[100], dtime_buf[100], - ctime_buf[100]; - struct shmid_kernel *kshmptr = &kxshmids[i]; - - if (user) - if (uid != kshmptr->u.shm_perm.uid) - continue; - cvt_time(kshmptr->u.shm_atime, atime_buf); - cvt_time(kshmptr->u.shm_dtime, dtime_buf); - cvt_time(kshmptr->u.shm_ctime, ctime_buf); + char atime_buf[100]; + char dtime_buf[100]; + char ctime_buf[100]; + struct shmid_kernel *kshmptr = + &kxshmids[i]; + + if (user != NULL && + uid != kshmptr->u.shm_perm.uid) + continue; + cvt_time(kshmptr->u.shm_atime, + atime_buf); + cvt_time(kshmptr->u.shm_dtime, + dtime_buf); + cvt_time(kshmptr->u.shm_ctime, + ctime_buf); - printf("m %12d %12d %s %8s %8s", + printf("m %12lu %12d %s %8s %8s", IXSEQ_TO_IPCID(i, kshmptr->u.shm_perm), (int)kshmptr->u.shm_perm.key, fmt_perm(kshmptr->u.shm_perm.mode), @@ -439,7 +458,7 @@ kshmptr->u.shm_nattch); if (option & BIGGEST) - printf(" %12d", + printf(" %12zu", kshmptr->u.shm_segsz); if (option & PID) @@ -460,8 +479,8 @@ } } else if (display & (SHMINFO | SHMTOTAL)) { - fprintf(stderr, - "SVID shared memory facility not configured in the system\n"); + fprintf(stderr, "SVID shared memory facility " + "not configured in the system\n"); } kget(X_SEMINFO, &seminfo, sizeof(seminfo)); @@ -493,13 +512,14 @@ seminfo.semaem); } if (display & SEMINFO) { - kxsema_len = sizeof(struct semid_kernel) * seminfo.semmni; + kxsema_len = + sizeof(struct semid_kernel) * seminfo.semmni; kxsema = malloc(kxsema_len); kget(X_SEMA, kxsema, kxsema_len); printf("Semaphores:\n"); - printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", "MODE", - "OWNER", "GROUP"); + printf("T %12s %12s %-11s %-8s %-8s", "ID", "KEY", + "MODE", "OWNER", "GROUP"); if (option & CREATOR) printf(" %-8s %-8s", "CREATOR", "CGROUP"); if (option & BIGGEST) @@ -507,19 +527,22 @@ if (option & TIME) printf(" %-8s %-8s", "OTIME", "CTIME"); printf("\n"); - for (i = 0; i < seminfo.semmni; i += 1) { - if ((kxsema[i].u.sem_perm.mode & SEM_ALLOC) != 0) { - char ctime_buf[100], otime_buf[100]; - struct semid_kernel *ksemaptr = &kxsema[i]; - - if (user) - if (uid != ksemaptr->u.sem_perm.uid) - continue; - cvt_time(ksemaptr->u.sem_otime, otime_buf); - cvt_time(ksemaptr->u.sem_ctime, ctime_buf); + for (j = 0; j < seminfo.semmni; j++) { + if ((kxsema[j].u.sem_perm.mode & SEM_ALLOC) != 0) { + char ctime_buf[100], otime_buf[100]; + struct semid_kernel *ksemaptr = + &kxsema[j]; + + if (user != NULL && + uid != ksemaptr->u.sem_perm.uid) + continue; + cvt_time(ksemaptr->u.sem_otime, + otime_buf); + cvt_time(ksemaptr->u.sem_ctime, + ctime_buf); printf("s %12d %12d %s %8s %8s", - IXSEQ_TO_IPCID(i, ksemaptr->u.sem_perm), + IXSEQ_TO_IPCID(j, ksemaptr->u.sem_perm), (int)ksemaptr->u.sem_perm.key, fmt_perm(ksemaptr->u.sem_perm.mode), user_from_uid(ksemaptr->u.sem_perm.uid, 0), @@ -547,7 +570,8 @@ } } else if (display & (SEMINFO | SEMTOTAL)) { - fprintf(stderr, "SVID semaphores facility not configured in the system\n"); + fprintf(stderr, "SVID semaphores facility " + "not configured in the system\n"); } if (!use_sysctl) kvm_close(kd); @@ -563,14 +587,14 @@ int rv; for (xp = vecarr; xp->sysctl != NULL; xp++) { - assert(xp->offset <= size); + assert(xp->offset >= 0 && (size_t)xp->offset <= size); tsiz = xp->size; rv = sysctlbyname(xp->sysctl, (char *)addr + xp->offset, &tsiz, NULL, 0); if (rv == -1) err(1, "sysctlbyname: %s", xp->sysctl); if (tsiz != xp->size) - errx(1, "%s size mismatch (expected %d, got %d)", + errx(1, "%s size mismatch (expected %zu, got %zu)", xp->sysctl, xp->size, tsiz); } } @@ -590,7 +614,8 @@ "kern.ipc.shminfo", "kern.ipc.shmsegs" }; - assert((unsigned)idx <= sizeof(sym2sysctl) / sizeof(*sym2sysctl)); + assert(idx >= 0 && + (size_t)idx <= sizeof(sym2sysctl) / sizeof(*sym2sysctl)); if (!use_sysctl) { symn = symbols[idx].n_name; if (*symn == '_') @@ -605,20 +630,17 @@ switch (idx) { case X_MSQIDS: tsiz = sizeof(msqids); - rv = kvm_read(kd, symbols[idx].n_value, - &msqids, tsiz); + rv = kvm_read(kd, symbols[idx].n_value, &msqids, tsiz); kaddr = (u_long)msqids; break; case X_SHMSEGS: tsiz = sizeof(shmsegs); - rv = kvm_read(kd, symbols[idx].n_value, - &shmsegs, tsiz); + rv = kvm_read(kd, symbols[idx].n_value, &shmsegs, tsiz); kaddr = (u_long)shmsegs; break; case X_SEMA: tsiz = sizeof(sema); - rv = kvm_read(kd, symbols[idx].n_value, - &sema, tsiz); + rv = kvm_read(kd, symbols[idx].n_value, &sema, tsiz); kaddr = (u_long)sema; break; default: @@ -626,9 +648,10 @@ kaddr = symbols[idx].n_value; break; } - if ((unsigned)rv != tsiz) + if (rv < 0 || (size_t)rv != tsiz) errx(1, "%s: %s", symn, kvm_geterr(kd)); - if ((unsigned)kvm_read(kd, kaddr, addr, size) != size) + rv = kvm_read(kd, kaddr, addr, size); + if (rv < 0 || (size_t)rv != size) errx(1, "%s: %s", symn, kvm_geterr(kd)); } else { switch (idx) { @@ -649,7 +672,7 @@ err(1, "sysctlbyname: %s", sym2sysctl[idx]); if (tsiz != size) errx(1, "%s size mismatch " - "(expected %d, got %d)", + "(expected %zu, got %zu)", sym2sysctl[idx], size, tsiz); break; } @@ -676,7 +699,7 @@ usage(void) { - fprintf(stderr, - "usage: ipcs [-abcmopqstyMQST] [-C corefile] [-N namelist] [-u user]\n"); + fprintf(stderr, "usage: ipcs [-abcmopqstyMQST] [-C corefile] " + "[-N namelist] [-u user]\n"); exit(1); }